{"version":3,"sources":["webpack:////home/git/gitlab/node_modules/mousetrap/plugins/pause/mousetrap-pause.js","webpack:///./task_list.js","webpack:///./vue_shared/components/skeleton_loading_container.vue?863a","webpack:///./vue_shared/components/skeleton_loading_container.vue?2a4e","webpack:///vue_shared/components/skeleton_loading_container.vue","webpack:///./vue_shared/components/skeleton_loading_container.vue","webpack:///./droplab/plugins/input_setter.js","webpack:///./files_comment_button.js","webpack:///./single_file_diff.js","webpack:///./diff.js","webpack:///./comment_type_toggle.js","webpack:///./notes.js","webpack:////home/git/gitlab/node_modules/stickyfilljs/dist/stickyfill.js","webpack:///./lib/utils/sticky.js","webpack:///./vue_shared/directives/tooltip.js","webpack:///./shortcuts_navigation.js","webpack:////home/git/gitlab/node_modules/deckar01-task_list/dist/task_list.js","webpack:///./init_changes_dropdown.js","webpack:///./init_notes.js","webpack:///./project_select_combo_button.js","webpack:///./project_select.js","webpack:///./pages/projects/project.js","webpack:///./diff_notes/mixins/discussion.js","webpack:///./pages/projects/index.js","webpack:///./diff_notes/models/discussion.js","webpack:///./diff_notes/stores/comments.js","webpack:///./diff_notes/services/resolve.js","webpack:///./diff_notes/components/comment_resolve_btn.js","webpack:///./diff_notes/components/jump_to_discussion.js","webpack:///./diff_notes/components/resolve_btn.js","webpack:///./diff_notes/components/resolve_count.js","webpack:///./diff_notes/components/resolve_discussion_btn.js","webpack:///./diff_notes/components/diff_note_avatars.js","webpack:///./diff_notes/components/new_issue_for_discussion.js","webpack:///./diff_notes/diff_notes_bundle.js","webpack:///./diff_notes/icons/collapse_icon.svg","webpack:///./mini_pipeline_graph_dropdown.js","webpack:///./diff_notes/models/note.js","webpack:///./commit_merge_requests.js","webpack:///./pages/projects/commit/show/index.js","webpack:///./dropzone_input.js","webpack:///./lib/utils/text_markdown.js","webpack:///./gl_form.js","webpack:///./zen_mode.js","webpack:///./vue_shared/components/user_avatar/user_avatar_image.vue?74b0","webpack:///./vue_shared/components/user_avatar/user_avatar_image.vue?54d9","webpack:///vue_shared/components/user_avatar/user_avatar_image.vue","webpack:///./vue_shared/components/user_avatar/user_avatar_image.vue","webpack:///../images/no_avatar.png","webpack:///./autosave.js"],"names":["Mousetrap","self","_originalStopCallback","stopCallback","enabled","e","element","combo","pause","unpause","TaskList","options","arguments","length","undefined","_classCallCheck","this","selector","dataType","fieldName","onSuccess","onError","errorMessages","response","data","_typeof","errors","join","_flash__WEBPACK_IMPORTED_MODULE_3__","init","disable","jquery__WEBPACK_IMPORTED_MODULE_0___default","taskList","document","on","update","bind","off","_this","$target","target","patchData","val","_lib_utils_axios_utils__WEBPACK_IMPORTED_MODULE_2__","patch","attr","then","_ref","catch","err","components_skeleton_loading_containervue_type_script_lang_js","props","small","type","Boolean","required","default","lines","Number","computed","lineClasses","Array","fill","map","_","i","component","Object","componentNormalizer","_h","$createElement","_c","_self","staticClass","class","animation-container-small","_l","css","index","key","__webpack_exports__","InputSetter","hook","destroyed","config","eventWrapper","addEvents","setInputs","list","addEventListener","removeEvents","removeEventListener","selectedItem","detail","selected","isArray","forEach","setInput","input","trigger","newValue","getAttribute","valueAttribute","inputAttribute","hasAttribute","setAttribute","tagName","value","textContent","destroy","files_comment_button","$diffFile","userCanCreateNote","closest","isParallelView","js_cookie_default","a","get","LINE_COLUMN_CLASSES","showButton","hideButton","buttonParentElement","getButtonParent","currentTarget","validateButtonParent","classList","add","nextElementSibling","remove","hoveredElement","contains","previousElementSibling","parentNode","querySelector","WRAPPER","LOADING_HTML","COLLAPSED_HTML","SingleFileDiff","file","toggleDiff","content","jquery_default","$toggleIcon","diffForPath","find","isOpen","collapsedContent","loadingContent","addClass","html","hide","after","cb","hasClass","hasError","removeClass","getContentHTML","show","gl","diffNotesCompileComponents","axios_utils","syntax_highlight","$file","canCreateNote","is","helpers","initImageDiff","flash","locale","isBound","diff_Diff","Diff","diff_classCallCheck","each","single_file_diff","tab","getElementById","dataset","isLocked","firstFile","first","handleClickUnfold","handleClickLineNum","handleParallelLineDown","url_utility","highlightSelectedLine","openAnchoredDiff","_lineNumbers","lineNumbers","parent","_lineNumbers2","_slicedToArray","oldLineNumber","newLineNumber","offset","bottom","since","to","unfold","lineNumber","prevNewLine","prev","parents","link","params","view","replaceWith","locationHash","anchoredDiff","split","diffFile","$","clickTarget","hash","preventDefault","window","history","pushState","location","line","table","lineClass","filter","name","children","toArray","elm","parseInt","$diffFiles","assign","input_setter","comment_type_toggle","CommentTypeToggle","opts","dropdownTrigger","dropdownList","noteTypeInput","submitButton","closeButton","reopenButton","droplab","drop_lab","setConfig","push","normalizeNewlines","str","replace","autosize","autosize_default","REGEX_QUICK_ACTIONS","notes_Notes","Notes","notes_url","note_ids","last_fetched_at","enableGFM","notes_classCallCheck","updateTargetButtons","updateComment","visibilityChange","cancelDiscussionForm","onAddDiffNote","onAddImageDiffNote","setupDiscussionNoteForm","onReplyToDiscussionNote","removeNote","cancelEdit","updateNote","addDiscussionNote","addNoteError","addNote","resetMainTargetForm","refresh","keydownNoteText","toggleCommitList","postComment","clearFlashWrapper","clearFlash","onHashChange","updatedNotesTrackingMap","noteable_url","URL","notesCountBadge","basePollingInterval","maxPollingSteps","$wrapperEl","common_utils","cleanBinding","addBinding","setPollingInterval","setupMainTargetNoteForm","task_list","collapseLongCommitList","setViewType","clone","insertAfter","$anchor","loadLazyDiff","instance","showEditForm","removeAttachment","updateFormAttachment","onClickRetryLazyLoad","reenableTargetFormSubmitButton","boundGetContent","getContent","$textarea","discussionNoteForm","editNote","myLastNote","which","gon","current_user_id","confirm","removeDiscussionNoteForm","removeNoteEditForm","interval","clearInterval","setInterval","pollingInterval","hidden","_this2","refreshing","headers","X-Last-Fetched-At","notes","note","renderNote","shouldReset","nthInterval","Math","pow","initRefresh","noteEntity","votesBlock","commands_changes","checkMergeRequestStatus","eq","awards_handler","awardsHandler","addAwardToEmojiBar","emoji_award","scrollToAwards","$note","datetime_utility","updateNoteTargetSelector","$noteToCleanHighlight","$form","$notesList","discussion_html","renderDiscussionNote","valid","id","isNewNote","$newNote","animateAppendNote","setupNewNote","updateNotesCount","isUpdatedNote","isEditing","initialContent","text","trim","currentContent","sanitizedNoteNote","isTextareaUntouched","putConflictEditWarningInPlace","$updatedNote","animateUpdateNote","refreshVueNotes","commands_only","keys","addFlash","parentTimeline","discussionContainer","form","row","lineType","diffAvatarContainer","discussion_id","discussion_line_code","on_image","prevAll","diff_discussion_html","$discussion","renderGFM","$notes","contentContainerClass","append","page","indexOf","discussion_resolvable","renderDiscussionAvatar","changesDiscussionContainer","avatarHolder","createElement","click","reset","event","createEvent","initEvent","dispatchEvent","formClone","setupNoteForm","initCommentTypeToggle","textarea","glForm","gl_form","autosave","formParentTimeline","$parentTimeline","isNewDiffComment","discussionId","mergeRequestId","ResolveService","toggleResolveForDiscussion","$targetNote","$noteEntityEl","revertNoteEditForm","$el","isAllowed","scrollTo","$editForm","getEditFormSelector","$currentlyEditing","checkContentToAllowEditing","putEditFormInPlace","noteId","insertBefore","enable","noteElId","el","diffNoteApps","$destroy","notesTr","removeBadgeEvent","CustomEvent","badgeNumber","replyToDiscussionNote","replyLink","cleanForm","dataHolder","diffFileData","discussionID","focus","$link","showReplyInput","toggleDiffNote","clickEvent","newForm","$noteContainer","appendTo","addForm","hasNotes","replyButton","rowCssToAdd","_ref2","forceShow","_ref2$showReplyInput","nextRow","next","targetRow","lineTypeSelector","notesContentSelector","notesContent","isCurrentlyShown","showNow","toggleClass","blurEvent","filename","closebtn","closetext","discardbtn","reopenbtn","reopentext","$originalContentEl","originalContent","postUrl","targetId","targetType","updateCount","$retryButton","prop","$container","renderPlaceholderComponent","url","$errorContainer","$successContainer","_ref3","renderDiffContent","Promise","resolve","$element","$closestSystemCommitList","siblings","systemNotes","has","systemNote","$systemNote","headerMessage","_len","flashParams","_key","flashContainer","Function","prototype","apply","concat","style","display","formData","serialize","formContent","underscore_default","escape","formAction","formContentOriginal","test","tempFormContent","executedCommands","command","RegExp","description","toLowerCase","_ref4","uniqueId","isDiscussionNote","currentUsername","currentUserFullname","currentUserAvatar","discussionClass","$tempNote","_ref5","_this3","$submitBtn","$closeBtn","isMainForm","isDiscussionForm","isDiscussionResolve","_getFormData","getFormData","noteUniqueId","systemNoteUniqueId","hasQuickActions","$notesContainer","stripQuickActions","createPlaceholderNote","current_username","current_user_fullname","current_user_avatar_url","createPlaceholderSystemNote","getQuickActionDescription","ajax_cache","GfmAutoComplete","dataSources","commands","post","res","notePosition","_JSON$parse","JSON","parse","x","y","width","height","addBadgeEvent","handleQuickActions","closestDiffFile","_this4","$editingNote","$noteBodyText","_getFormData2","cachedNoteBodyText","_ref6","updateNoteError","initDroplab","addTargetClass","vue_esm","components","SkeletonLoadingContainer","skeleton_loading_container","render","prepend","fileHolder","noteIds","inArray","mrWidget","checkStatus","noteHtml","_createClass","defineProperties","descriptor","enumerable","configurable","writable","defineProperty","Constructor","protoProps","staticProps","seppuku","getComputedStyle","testNode","some","prefix","position","shadowRootExists","ShadowRoot","scroll","top","left","stickies","extend","targetObj","sourceObject","hasOwnProperty","parseNumeric","parseFloat","getDocOffsetTop","node","docOffsetTop","offsetTop","offsetParent","Sticky","TypeError","HTMLElement","Error","sticky","_node","_stickyMode","_active","_removed","_deactivate","nodeComputedStyle","nodeComputedProps","marginTop","marginBottom","marginLeft","marginRight","cssFloat","isNaN","referenceNode","host","nodeWinOffset","getBoundingClientRect","parentWinOffset","parentComputedStyle","_parent","styles","offsetHeight","_offsetToWindow","right","documentElement","clientWidth","_offsetToParent","borderTopWidth","borderLeftWidth","borderRightWidth","_styles","nodeTopValue","_limits","start","pageYOffset","end","borderBottomWidth","parentPosition","_recalcPosition","_clone","padding","border","borderSpacing","fontSize","stickyMode","abs","removeChild","splice","Stickyfill","addOne","nodeList","addedStickies","_loop","refreshAll","removeOne","_loop2","removeAll","checkScroll","pageXOffset","fastCheckTimer","startFastCheckTimer","_fastCheck","docHiddenKey","visibilityChangeEventName","module","exports","isSticky","scrollY","stickyTop","insertPlaceholder","floor","placeholder","createPlaceholder","heightBefore","stickyMonitor","CSS","supports","passive","polyfillSticky","stickyfilljs__WEBPACK_IMPORTED_MODULE_0___default","tooltip","componentUpdated","unbind","ShortcutsNavigation","_possibleConstructorReturn","__proto__","getPrototypeOf","call","mousetrap__WEBPACK_IMPORTED_MODULE_0___default","_shortcuts_dashboard_navigation__WEBPACK_IMPORTED_MODULE_1__","enabledHelp","_shortcuts__WEBPACK_IMPORTED_MODULE_2__","jQuery","factory","modules","installedModules","__webpack_require__","moduleId","l","m","c","d","getter","o","n","__esModule","object","property","p","s","NodeArray","item","slice","className","eventName","Event","bubbles","cancelable","initCustomEvent","el1","container","field","updateTaskList","querySelectorAll","checkbox","disabled","changeEvent","changedEvent","checkboxes","checked","defaultPrevented","updateSource","incomplete","complete","escapePattern","incompletePattern","completePattern","itemPattern","startFencesPattern","endFencesPattern","itemsInParasPattern","source","itemIndex","clean","inCodeBlock","len","ref","results","match","fn","method","_lib_utils_sticky__WEBPACK_IMPORTED_MODULE_1__","glDropdown","filterable","remoteFilter","dataEl","innerHTML","notesUrl","notesIds","now","diffView","autocomplete","_notes__WEBPACK_IMPORTED_MODULE_0__","initialize","ProjectSelectComboButton","select","projectSelectInput","newItemBtn","resourceType","resourceLabel","formattedText","deriveTextVariants","groupId","bindEvents","initLocalStorage","openDropdown","getProjectFromLocalStorage","selectProject","accessor","isLocalStorageAccessSafe","localStorageKey","localStorageItemType","setBtnTextFromLocalStorage","select2","selectedProjectData","projectMeta","setNewItemBtnAttributes","setProjectInLocalStorage","cachedProjectData","project","defaultTextPrefix","presetTextSuffix","projectString","localStorage","getItem","stringify","setItem","projectSelect","simpleFilter","includeGroups","allProjects","orderBy","withIssuesEnabled","withMergeRequestsEnabled","minimumInputLength","query","finalCallback","projectsCallback","projects","callback","groupsCallback","groups","api","term","groupProjects","order_by","with_issues_enabled","with_merge_requests_enabled","membership","web_url","name_with_namespace","dropdownCssClass","project_select_combo_button","Project","$cloneOptions","$projectCloneField","$cloneBtnText","selectedCloneOption","$this","activeText","not","initRefSwitcher","submit","js_cookie__WEBPACK_IMPORTED_MODULE_1___default","set","projectSelectDropdown","_project_select__WEBPACK_IMPORTED_MODULE_6__","changeProject","refListItem","refLink","href","$dropdown","_lib_utils_axios_utils__WEBPACK_IMPORTED_MODULE_4__","search","_flash__WEBPACK_IMPORTED_MODULE_5__","_locale__WEBPACK_IMPORTED_MODULE_2__","selectable","filterRemote","filterByText","inputFieldName","renderRow","li","cloneNode","header","appendChild","obj","toggleLabel","clicked","$visit","shouldVisit","action","divider","_lib_utils_url_utility__WEBPACK_IMPORTED_MODULE_3__","visitUrl","DiscussionMixins","discussionCount","discussions","resolvedDiscussionCount","resolvedCount","isResolved","unresolvedDiscussionCount","unresolvedCount","_project__WEBPACK_IMPORTED_MODULE_0__","_shortcuts_navigation__WEBPACK_IMPORTED_MODULE_1__","discussion_DiscussionModel","DiscussionModel","loading","canResolve","noteObj","NoteModel","delete","resolved","resolved_by","discussionSelector","$discussionHeadline","discussion_headline_html","CommentsStore","state","getNote","createDiscussion","discussion","create","createNote","deleteNote","notesCount","unresolvedDiscussionIds","ids","resolve_ResolveServiceClass","ResolveServiceClass","root","resolve_classCallCheck","noteResource","resource","discussionResource","save","unResolveAll","resolveAll","resp","json","resolvedBy","unResolveAllNotes","resolveAllNotes","updateHeadline","DiffNotesResolveServiceClass","CommentAndResolveBtn","String","textareaIsEmpty","isResolvable","isDiscussionResolved","buttonText","created","mounted","JumpToDiscussion","mixins","allResolved","lastResolvedId","lastId","methods","jumpToNextUnresolvedDiscussion","discussionsSelector","discussionIdsInScope","firstUnresolvedDiscussionId","nextUnresolvedDiscussionId","activeTab","mrTabs","currentAction","hasDiscussionsToJumpTo","jumpToFirstDiscussion","discussionIdsForElements","elements","activateTab","currentDiscussionFound","$notesHolder","prevEl","ResolveBtn","authorName","authorAvatar","noteTruncated","watch","handler","deep","resolvedByName","updateTooltip","$nextTick","$refs","button","unresolve","beforeDestroy","ResolveCount","loggedOut","resolvedCountText","ResolveDiscussionBtn","DiffNoteAvatars","isVisible","storeState","shownAvatars","collapseIcon","collapse_icon_default","userAvatarImage","user_avatar_image","template","addNoCommentClass","setDiscussionVisible","discussionClassName","notesSubset","extraNotesTitle","extra","moreText","clickedAvatar","toggleDiscussionsToggleState","nextUntil","$notesHolders","$visibleNotesHolders","getTooltipText","NewIssueForDiscussion","projectPath","tmpApp","outerHTML","$mount","one","$components","resolveCountAppEl","resolve-count","MiniPipelineGraph","dropdownListSelector","getBuildsList","stopPropagation","stageContainer","parentElement","relatedTarget","endpoint","stageEndpoint","renderBuildsList","toggleLoading","stopDropdownClickPropagation","dropdown","_flash__WEBPACK_IMPORTED_MODULE_1__","toggle","createHeader","childElementCount","mergeRequestCount","headerText","getHeaderText","createItem","mergeRequest","$item","path","iid","createLink","$title","title","createTitle","fetchCommitMergeRequests","$content","mergeRequests","$header","createContent","Flash","diff","zen_mode","shortcuts_navigation","mini_pipeline_graph_dropdown","init_notes","init_changes_dropdown","load","commitPath","diff_notes_bundle","dropzoneInput","$attachButton","$attachingFileMessage","$cancelButton","$retryLink","$uploadProgress","$uploadingErrorContainer","$uploadingErrorMessage","$uploadingProgressContainer","uploadsPath","uploads_path","maxFileSize","max_file_size","formTextarea","handlePaste","pasteText","addFileToForm","updateAttachingMessage","isImage","getFilename","uploadFile","wrap","$mdArea","setupMarkdownPreview","$formDropzone","dropzone","dictDefaultMessage","clickable","paramName","maxFilesize","uploadMultiple","csrf","previewContainer","processing","alert","dragover","dragleave","drop","success","processingFileCount","getQueuedFiles","getUploadingFiles","shouldPad","markdown","error","errorMessage","xhr","message","responseText","totaluploadprogress","totalUploadProgress","files","round","sending","removedfile","queuecomplete","child","dropzone_default","forElement","removeAllFiles","dropzoneInstance","failedFiles","failedFile","status","ERROR","accepted","addFile","pasteEvent","originalEvent","clipboardData","items","image","getAsFile","caretStart","selectionStart","caretEnd","selectionEnd","textEnd","beforeSelection","substring","afterSelection","setSelectionRange","scrollHeight","getData","closeSpinner","FormData","md","$child","insertToTextArea","messageContainer","attachingMessage","filesCount","autoDiscover","updateText","textArea","tag","blockTag","$textArea","selectedText","textToInsert","selectedSplit","startChar","removedLastNewLine","removedFirstNewLine","currentLineEmpty","lastNewLine","substr","lastIndexOf","before","lineBefore","lineAfter","blockTagText","wrapped","pos","moveCursor","insertMarkdownText","gl_form_GLForm","GLForm","setupForm","clearEventListeners","autoComplete","isNewForm","utils","disableButtonIfEmptyField","gfm_auto_complete","setup","emojis","members","issues","milestones","labels","addEventListeners","isAutosizeable","setupAutosize","setHeightData","destroyAutosize","setTimeout","outerHeight","dropzone__WEBPACK_IMPORTED_MODULE_2___default","ZenMode","active_backdrop","active_textarea","enter","exit","keyCode","backdrop","mousetrap__WEBPACK_IMPORTED_MODULE_3___default","removeAttr","$dropzone","zen_area","user_avatar_user_avatar_imagevue_type_script_lang_js","directives","lazy","imgSrc","no_avatar_default","cssClasses","imgAlt","size","tooltipText","tooltipPlacement","sanitizedSource","resultantSrcAttribute","lazy_loader","tooltipContainer","avatarSizeClass","_obj","_vm","rawName","attrs","data-boundary","src","alt","data-src","data-container","data-placement","Autosave","isLocalStorageAvailable","_lib_utils_accessor__WEBPACK_IMPORTED_MODULE_0__","restore","removeItem"],"mappings":"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","file":"pages.projects.commit.show.f3fb27c4.chunk.js","sourcesContent":["/**\n * adds a pause and unpause method to Mousetrap\n * this allows you to enable or disable keyboard shortcuts\n * without having to reset Mousetrap and rebind everything\n */\n/* global Mousetrap:true */\nMousetrap = (function(Mousetrap) {\n    var self = Mousetrap,\n        _originalStopCallback = self.stopCallback,\n        enabled = true;\n\n    self.stopCallback = function(e, element, combo) {\n        if (!enabled) {\n            return true;\n        }\n\n        return _originalStopCallback(e, element, combo);\n    };\n\n    self.pause = function() {\n        enabled = false;\n    };\n\n    self.unpause = function() {\n        enabled = true;\n    };\n\n    return self;\n}) (Mousetrap);\n","import $ from 'jquery';\nimport 'deckar01-task_list';\nimport axios from './lib/utils/axios_utils';\nimport Flash from './flash';\n\nexport default class TaskList {\n  constructor(options = {}) {\n    this.selector = options.selector;\n    this.dataType = options.dataType;\n    this.fieldName = options.fieldName;\n    this.onSuccess = options.onSuccess || (() => {});\n    this.onError = function showFlash(e) {\n      let errorMessages = '';\n\n      if (e.response.data && typeof e.response.data === 'object') {\n        errorMessages = e.response.data.errors.join(' ');\n      }\n\n      return new Flash(errorMessages || 'Update failed', 'alert');\n    };\n\n    this.init();\n  }\n\n  init() {\n    // Prevent duplicate event bindings\n    this.disable();\n    $(`${this.selector} .js-task-list-container`).taskList('enable');\n    $(document).on('tasklist:changed', `${this.selector} .js-task-list-container`, this.update.bind(this));\n  }\n\n  disable() {\n    $(`${this.selector} .js-task-list-container`).taskList('disable');\n    $(document).off('tasklist:changed', `${this.selector} .js-task-list-container`);\n  }\n\n  update(e) {\n    const $target = $(e.target);\n    const patchData = {};\n    patchData[this.dataType] = {\n      [this.fieldName]: $target.val(),\n    };\n\n    return axios.patch($target.data('updateUrl') || $('form.js-issuable-update').attr('action'), patchData)\n      .then(({ data }) => this.onSuccess(data))\n      .catch(err => this.onError(err));\n  }\n}\n","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('div',{staticClass:\"animation-container\",class:{\n    'animation-container-small': _vm.small,\n  }},_vm._l((_vm.lineClasses),function(css,index){return _c('div',{key:index,class:css})}))}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","import mod from \"-!../../../../../node_modules/babel-loader/lib/index.js??ref--0!../../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./skeleton_loading_container.vue?vue&type=script&lang=js\"; export default mod; export * from \"-!../../../../../node_modules/babel-loader/lib/index.js??ref--0!../../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./skeleton_loading_container.vue?vue&type=script&lang=js\"","<script>\n  export default {\n    props: {\n      small: {\n        type: Boolean,\n        required: false,\n        default: false,\n      },\n      lines: {\n        type: Number,\n        required: false,\n        default: 3,\n      },\n    },\n    computed: {\n      lineClasses() {\n        return new Array(this.lines).fill().map((_, i) => `skeleton-line-${i + 1}`);\n      },\n    },\n  };\n</script>\n\n<template>\n  <div\n    class=\"animation-container\"\n    :class=\"{\n      'animation-container-small': small,\n    }\"\n  >\n    <div\n      v-for=\"(css, index) in lineClasses\"\n      :key=\"index\"\n      :class=\"css\"\n    >\n    </div>\n  </div>\n</template>\n","import { render, staticRenderFns } from \"./skeleton_loading_container.vue?vue&type=template&id=993aae32\"\nimport script from \"./skeleton_loading_container.vue?vue&type=script&lang=js\"\nexport * from \"./skeleton_loading_container.vue?vue&type=script&lang=js\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n  script,\n  render,\n  staticRenderFns,\n  false,\n  null,\n  null,\n  null\n  \n)\n\nexport default component.exports","/* eslint-disable */\n\nconst InputSetter = {\n  init(hook) {\n    this.hook = hook;\n    this.destroyed = false;\n    this.config = hook.config.InputSetter || (this.hook.config.InputSetter = {});\n\n    this.eventWrapper = {};\n\n    this.addEvents();\n  },\n\n  addEvents() {\n    this.eventWrapper.setInputs = this.setInputs.bind(this);\n    this.hook.list.list.addEventListener('click.dl', this.eventWrapper.setInputs);\n  },\n\n  removeEvents() {\n    this.hook.list.list.removeEventListener('click.dl', this.eventWrapper.setInputs);\n  },\n\n  setInputs(e) {\n    if (this.destroyed) return;\n\n    const selectedItem = e.detail.selected;\n\n    if (!Array.isArray(this.config)) this.config = [this.config];\n\n    this.config.forEach(config => this.setInput(config, selectedItem));\n  },\n\n  setInput(config, selectedItem) {\n    const input = config.input || this.hook.trigger;\n    const newValue = selectedItem.getAttribute(config.valueAttribute);\n    const inputAttribute = config.inputAttribute;\n\n    if (input.hasAttribute(inputAttribute)) return input.setAttribute(inputAttribute, newValue);\n    if (input.tagName === 'INPUT') return input.value = newValue;\n    return input.textContent = newValue;\n  },\n\n  destroy() {\n    this.destroyed = true;\n\n    this.removeEvents();\n  },\n};\n\nexport default InputSetter;\n","/* Developer beware! Do not add logic to showButton or hideButton\n * that will force a reflow. Doing so will create a signficant performance\n * bottleneck for pages with large diffs. For a comprehensive list of what\n * causes reflows, visit https://gist.github.com/paulirish/5d52fb081b3570c81e3a\n */\n\nimport Cookies from 'js-cookie';\n\nconst LINE_NUMBER_CLASS = 'diff-line-num';\nconst UNFOLDABLE_LINE_CLASS = 'js-unfold';\nconst NO_COMMENT_CLASS = 'no-comment-btn';\nconst EMPTY_CELL_CLASS = 'empty-cell';\nconst OLD_LINE_CLASS = 'old_line';\nconst LINE_COLUMN_CLASSES = `.${LINE_NUMBER_CLASS}, .line_content`;\nconst DIFF_CONTAINER_SELECTOR = '.files';\nconst DIFF_EXPANDED_CLASS = 'diff-expanded';\n\nexport default {\n  init($diffFile) {\n    /* Caching is used only when the following members are *true*.\n     * This is because there are likely to be\n     * differently configured versions of diffs in the same session.\n     * However if these values are true, they\n     * will be true in all cases */\n\n    if (!this.userCanCreateNote) {\n      // data-can-create-note is an empty string when true, otherwise undefined\n      this.userCanCreateNote = $diffFile.closest(DIFF_CONTAINER_SELECTOR).data('canCreateNote') === '';\n    }\n\n    this.isParallelView = Cookies.get('diff_view') === 'parallel';\n\n    if (this.userCanCreateNote) {\n      $diffFile.on('mouseover', LINE_COLUMN_CLASSES, e => this.showButton(this.isParallelView, e))\n        .on('mouseleave', LINE_COLUMN_CLASSES, e => this.hideButton(this.isParallelView, e));\n    }\n  },\n\n  showButton(isParallelView, e) {\n    const buttonParentElement = this.getButtonParent(e.currentTarget, isParallelView);\n\n    if (!this.validateButtonParent(buttonParentElement)) return;\n\n    buttonParentElement.classList.add('is-over');\n    buttonParentElement.nextElementSibling.classList.add('is-over');\n  },\n\n  hideButton(isParallelView, e) {\n    const buttonParentElement = this.getButtonParent(e.currentTarget, isParallelView);\n\n    buttonParentElement.classList.remove('is-over');\n    buttonParentElement.nextElementSibling.classList.remove('is-over');\n  },\n\n  getButtonParent(hoveredElement, isParallelView) {\n    if (isParallelView) {\n      if (!hoveredElement.classList.contains(LINE_NUMBER_CLASS)) {\n        return hoveredElement.previousElementSibling;\n      }\n    } else if (!hoveredElement.classList.contains(OLD_LINE_CLASS)) {\n      return hoveredElement.parentNode.querySelector(`.${OLD_LINE_CLASS}`);\n    }\n    return hoveredElement;\n  },\n\n  validateButtonParent(buttonParentElement) {\n    return !buttonParentElement.classList.contains(EMPTY_CELL_CLASS) &&\n      !buttonParentElement.classList.contains(UNFOLDABLE_LINE_CLASS) &&\n      !buttonParentElement.classList.contains(NO_COMMENT_CLASS) &&\n      !buttonParentElement.parentNode.classList.contains(DIFF_EXPANDED_CLASS);\n  },\n};\n","/* eslint-disable func-names, prefer-arrow-callback, space-before-function-paren, no-var, prefer-rest-params, wrap-iife, one-var, one-var-declaration-per-line, consistent-return, no-param-reassign, max-len */\n\nimport $ from 'jquery';\nimport { __ } from './locale';\nimport axios from './lib/utils/axios_utils';\nimport createFlash from './flash';\nimport FilesCommentButton from './files_comment_button';\nimport imageDiffHelper from './image_diff/helpers/index';\nimport syntaxHighlight from './syntax_highlight';\n\nconst WRAPPER = '<div class=\"diff-content\"></div>';\nconst LOADING_HTML = '<i class=\"fa fa-spinner fa-spin\"></i>';\nconst ERROR_HTML = '<div class=\"nothing-here-block\"><i class=\"fa fa-warning\"></i> Could not load diff</div>';\nconst COLLAPSED_HTML = '<div class=\"nothing-here-block diff-collapsed\">This diff is collapsed. <a class=\"click-to-expand\">Click to expand it.</a></div>';\n\nexport default class SingleFileDiff {\n  constructor(file) {\n    this.file = file;\n    this.toggleDiff = this.toggleDiff.bind(this);\n    this.content = $('.diff-content', this.file);\n    this.$toggleIcon = $('.diff-toggle-caret', this.file);\n    this.diffForPath = this.content.find('[data-diff-for-path]').data('diffForPath');\n    this.isOpen = !this.diffForPath;\n    if (this.diffForPath) {\n      this.collapsedContent = this.content;\n      this.loadingContent = $(WRAPPER).addClass('loading').html(LOADING_HTML).hide();\n      this.content = null;\n      this.collapsedContent.after(this.loadingContent);\n      this.$toggleIcon.addClass('fa-caret-right');\n    } else {\n      this.collapsedContent = $(WRAPPER).html(COLLAPSED_HTML).hide();\n      this.content.after(this.collapsedContent);\n      this.$toggleIcon.addClass('fa-caret-down');\n    }\n\n    $('.js-file-title, .click-to-expand', this.file).on('click', (function (e) {\n      this.toggleDiff($(e.target));\n    }).bind(this));\n  }\n\n  toggleDiff($target, cb) {\n    if (!$target.hasClass('js-file-title') && !$target.hasClass('click-to-expand') && !$target.hasClass('diff-toggle-caret')) return;\n    this.isOpen = !this.isOpen;\n    if (!this.isOpen && !this.hasError) {\n      this.content.hide();\n      this.$toggleIcon.addClass('fa-caret-right').removeClass('fa-caret-down');\n      this.collapsedContent.show();\n      if (typeof gl.diffNotesCompileComponents !== 'undefined') {\n        gl.diffNotesCompileComponents();\n      }\n    } else if (this.content) {\n      this.collapsedContent.hide();\n      this.content.show();\n      this.$toggleIcon.addClass('fa-caret-down').removeClass('fa-caret-right');\n      if (typeof gl.diffNotesCompileComponents !== 'undefined') {\n        gl.diffNotesCompileComponents();\n      }\n    } else {\n      this.$toggleIcon.addClass('fa-caret-down').removeClass('fa-caret-right');\n      return this.getContentHTML(cb);\n    }\n  }\n\n  getContentHTML(cb) {\n    this.collapsedContent.hide();\n    this.loadingContent.show();\n\n    axios.get(this.diffForPath)\n      .then(({ data }) => {\n        this.loadingContent.hide();\n        if (data.html) {\n          this.content = $(data.html);\n          syntaxHighlight(this.content);\n        } else {\n          this.hasError = true;\n          this.content = $(ERROR_HTML);\n        }\n        this.collapsedContent.after(this.content);\n\n        if (typeof gl.diffNotesCompileComponents !== 'undefined') {\n          gl.diffNotesCompileComponents();\n        }\n\n        const $file = $(this.file);\n        FilesCommentButton.init($file);\n\n        const canCreateNote = $file.closest('.files').is('[data-can-create-note]');\n        imageDiffHelper.initImageDiff($file[0], canCreateNote);\n\n        if (cb) cb();\n      })\n      .catch(() => {\n        createFlash(__('An error occurred while retrieving diff'));\n      });\n  }\n}\n","import $ from 'jquery';\nimport axios from '~/lib/utils/axios_utils';\nimport flash from '~/flash';\nimport { __ } from '~/locale';\nimport { getLocationHash } from './lib/utils/url_utility';\nimport FilesCommentButton from './files_comment_button';\nimport SingleFileDiff from './single_file_diff';\nimport imageDiffHelper from './image_diff/helpers/index';\n\nconst UNFOLD_COUNT = 20;\nlet isBound = false;\n\nexport default class Diff {\n  constructor() {\n    const $diffFile = $('.files .diff-file');\n\n    $diffFile.each((index, file) => {\n      if (!$.data(file, 'singleFileDiff')) {\n        $.data(file, 'singleFileDiff', new SingleFileDiff(file));\n      }\n    });\n\n    const tab = document.getElementById('diffs');\n    if (!tab || (tab && tab.dataset && tab.dataset.isLocked !== '')) FilesCommentButton.init($diffFile);\n\n    const firstFile = $('.files').first().get(0);\n    const canCreateNote = firstFile && firstFile.hasAttribute('data-can-create-note');\n    $diffFile.each((index, file) => imageDiffHelper.initImageDiff(file, canCreateNote));\n\n    if (!isBound) {\n      $(document)\n        .on('click', '.js-unfold', this.handleClickUnfold.bind(this))\n        .on('click', '.diff-line-num a', this.handleClickLineNum.bind(this))\n        .on('mousedown', 'td.line_content.parallel', this.handleParallelLineDown.bind(this));\n      isBound = true;\n    }\n\n    if (getLocationHash()) {\n      this.highlightSelectedLine();\n    }\n\n    this.openAnchoredDiff();\n  }\n\n  handleClickUnfold(e) {\n    const $target = $(e.target);\n    const [oldLineNumber, newLineNumber] = this.lineNumbers($target.parent());\n    const offset = newLineNumber - oldLineNumber;\n    const bottom = $target.hasClass('js-unfold-bottom');\n    let since;\n    let to;\n    let unfold = true;\n\n    if (bottom) {\n      const lineNumber = newLineNumber + 1;\n      since = lineNumber;\n      to = lineNumber + UNFOLD_COUNT;\n    } else {\n      const lineNumber = newLineNumber - 1;\n      since = lineNumber - UNFOLD_COUNT;\n      to = lineNumber;\n\n      // make sure we aren't loading more than we need\n      const prevNewLine = this.lineNumbers($target.parent().prev())[1];\n      if (since <= prevNewLine + 1) {\n        since = prevNewLine + 1;\n        unfold = false;\n      }\n    }\n\n    const file = $target.parents('.diff-file');\n    const link = file.data('blobDiffPath');\n    const view = file.data('view');\n\n    const params = { since, to, bottom, offset, unfold, view };\n    axios.get(link, { params })\n    .then(({ data }) => $target.parent().replaceWith(data))\n    .catch(() => flash(__('An error occurred while loading diff')));\n  }\n\n  openAnchoredDiff(cb) {\n    const locationHash = getLocationHash();\n    const anchoredDiff = locationHash && locationHash.split('_')[0];\n\n    if (!anchoredDiff) return;\n\n    const diffTitle = $(`#${anchoredDiff}`);\n    const diffFile = diffTitle.closest('.diff-file');\n    const nothingHereBlock = $('.nothing-here-block:visible', diffFile);\n    if (nothingHereBlock.length) {\n      const clickTarget = $('.js-file-title, .click-to-expand', diffFile);\n      diffFile.data('singleFileDiff').toggleDiff(clickTarget, () => {\n        this.highlightSelectedLine();\n        if (cb) cb();\n      });\n    } else if (cb) {\n      cb();\n    }\n  }\n\n  handleClickLineNum(e) {\n    const hash = $(e.currentTarget).attr('href');\n    e.preventDefault();\n    if (window.history.pushState) {\n      window.history.pushState(null, null, hash);\n    } else {\n      window.location.hash = hash;\n    }\n    this.highlightSelectedLine();\n  }\n  // eslint-disable-next-line class-methods-use-this\n  handleParallelLineDown(e) {\n    const line = $(e.currentTarget);\n    const table = line.closest('table');\n\n    table.removeClass('left-side-selected right-side-selected');\n\n    const lineClass = ['left-side', 'right-side'].filter(name => line.hasClass(name))[0];\n    if (lineClass) {\n      table.addClass(`${lineClass}-selected`);\n    }\n  }\n  // eslint-disable-next-line class-methods-use-this\n  diffViewType() {\n    return $('.inline-parallel-buttons a.active').data('viewType');\n  }\n  // eslint-disable-next-line class-methods-use-this\n  lineNumbers(line) {\n    const children = line.find('.diff-line-num').toArray();\n    if (children.length !== 2) {\n      return [0, 0];\n    }\n    return children.map(elm => parseInt($(elm).data('linenumber'), 10) || 0);\n  }\n  // eslint-disable-next-line class-methods-use-this\n  highlightSelectedLine() {\n    const hash = getLocationHash();\n    const $diffFiles = $('.diff-file');\n    $diffFiles.find('.hll').removeClass('hll');\n\n    if (hash) {\n      $diffFiles\n        .find(`tr#${hash}:not(.match) td, td#${hash}, td[data-line-code=\"${hash}\"]`)\n        .addClass('hll');\n    }\n  }\n}\n","import DropLab from './droplab/drop_lab';\nimport ISetter from './droplab/plugins/input_setter';\n\n// Todo: Remove this when fixing issue in input_setter plugin\nconst InputSetter = Object.assign({}, ISetter);\n\nclass CommentTypeToggle {\n  constructor(opts = {}) {\n    this.dropdownTrigger = opts.dropdownTrigger;\n    this.dropdownList = opts.dropdownList;\n    this.noteTypeInput = opts.noteTypeInput;\n    this.submitButton = opts.submitButton;\n    this.closeButton = opts.closeButton;\n    this.reopenButton = opts.reopenButton;\n  }\n\n  initDroplab() {\n    this.droplab = new DropLab();\n\n    const config = this.setConfig();\n\n    this.droplab.init(this.dropdownTrigger, this.dropdownList, [InputSetter], config);\n  }\n\n  setConfig() {\n    const config = {\n      InputSetter: [{\n        input: this.noteTypeInput,\n        valueAttribute: 'data-value',\n      },\n      {\n        input: this.submitButton,\n        valueAttribute: 'data-submit-text',\n      }],\n    };\n\n    if (this.closeButton) {\n      config.InputSetter.push({\n        input: this.closeButton,\n        valueAttribute: 'data-close-text',\n      }, {\n        input: this.closeButton,\n        valueAttribute: 'data-close-text',\n        inputAttribute: 'data-alternative-text',\n      });\n    }\n\n    if (this.reopenButton) {\n      config.InputSetter.push({\n        input: this.reopenButton,\n        valueAttribute: 'data-reopen-text',\n      }, {\n        input: this.reopenButton,\n        valueAttribute: 'data-reopen-text',\n        inputAttribute: 'data-alternative-text',\n      });\n    }\n\n    return config;\n  }\n}\n\nexport default CommentTypeToggle;\n","/* eslint-disable no-restricted-properties, func-names, space-before-function-paren,\nno-var, prefer-rest-params, wrap-iife, no-use-before-define, camelcase,\nno-unused-expressions, quotes, max-len, one-var, one-var-declaration-per-line,\ndefault-case, prefer-template, consistent-return, no-alert, no-return-assign,\nno-param-reassign, prefer-arrow-callback, no-else-return, comma-dangle, no-new,\nbrace-style, no-lonely-if, vars-on-top, no-unused-vars, no-sequences, no-shadow,\nnewline-per-chained-call, no-useless-escape, class-methods-use-this */\n\n/* global ResolveService */\n/* global mrRefreshWidgetUrl */\n\nimport $ from 'jquery';\nimport _ from 'underscore';\nimport Cookies from 'js-cookie';\nimport Autosize from 'autosize';\nimport 'vendor/jquery.caret'; // required by jquery.atwho\nimport 'vendor/jquery.atwho';\nimport AjaxCache from '~/lib/utils/ajax_cache';\nimport Vue from 'vue';\nimport syntaxHighlight from '~/syntax_highlight';\nimport SkeletonLoadingContainer from '~/vue_shared/components/skeleton_loading_container.vue';\nimport axios from './lib/utils/axios_utils';\nimport { getLocationHash } from './lib/utils/url_utility';\nimport Flash from './flash';\nimport CommentTypeToggle from './comment_type_toggle';\nimport GLForm from './gl_form';\nimport loadAwardsHandler from './awards_handler';\nimport Autosave from './autosave';\nimport TaskList from './task_list';\nimport {\n  isInViewport,\n  getPagePath,\n  scrollToElement,\n  isMetaKey,\n  hasVueMRDiscussionsCookie,\n} from './lib/utils/common_utils';\nimport imageDiffHelper from './image_diff/helpers/index';\nimport { localTimeAgo } from './lib/utils/datetime_utility';\n\nwindow.autosize = Autosize;\n\nfunction normalizeNewlines(str) {\n  return str.replace(/\\r\\n/g, '\\n');\n}\n\nconst MAX_VISIBLE_COMMIT_LIST_COUNT = 3;\nconst REGEX_QUICK_ACTIONS = /^\\/\\w+.*$/gm;\n\nexport default class Notes {\n  static initialize(\n    notes_url,\n    note_ids,\n    last_fetched_at,\n    view,\n    enableGFM = true,\n  ) {\n    if (!this.instance) {\n      this.instance = new Notes(\n        notes_url,\n        note_ids,\n        last_fetched_at,\n        view,\n        enableGFM,\n      );\n    }\n  }\n\n  static getInstance() {\n    return this.instance;\n  }\n\n  constructor(notes_url, note_ids, last_fetched_at, view, enableGFM = true) {\n    this.updateTargetButtons = this.updateTargetButtons.bind(this);\n    this.updateComment = this.updateComment.bind(this);\n    this.visibilityChange = this.visibilityChange.bind(this);\n    this.cancelDiscussionForm = this.cancelDiscussionForm.bind(this);\n    this.onAddDiffNote = this.onAddDiffNote.bind(this);\n    this.onAddImageDiffNote = this.onAddImageDiffNote.bind(this);\n    this.setupDiscussionNoteForm = this.setupDiscussionNoteForm.bind(this);\n    this.onReplyToDiscussionNote = this.onReplyToDiscussionNote.bind(this);\n    this.removeNote = this.removeNote.bind(this);\n    this.cancelEdit = this.cancelEdit.bind(this);\n    this.updateNote = this.updateNote.bind(this);\n    this.addDiscussionNote = this.addDiscussionNote.bind(this);\n    this.addNoteError = this.addNoteError.bind(this);\n    this.addNote = this.addNote.bind(this);\n    this.resetMainTargetForm = this.resetMainTargetForm.bind(this);\n    this.refresh = this.refresh.bind(this);\n    this.keydownNoteText = this.keydownNoteText.bind(this);\n    this.toggleCommitList = this.toggleCommitList.bind(this);\n    this.postComment = this.postComment.bind(this);\n    this.clearFlashWrapper = this.clearFlash.bind(this);\n    this.onHashChange = this.onHashChange.bind(this);\n\n    this.notes_url = notes_url;\n    this.note_ids = note_ids;\n    this.enableGFM = enableGFM;\n    // Used to keep track of updated notes while people are editing things\n    this.updatedNotesTrackingMap = {};\n    this.last_fetched_at = last_fetched_at;\n    this.noteable_url = document.URL;\n    this.notesCountBadge ||\n      (this.notesCountBadge = $('.issuable-details').find('.notes-tab .badge'));\n    this.basePollingInterval = 15000;\n    this.maxPollingSteps = 4;\n\n    this.$wrapperEl = hasVueMRDiscussionsCookie()\n      ? $(document).find('.diffs')\n      : $(document);\n    this.cleanBinding();\n    this.addBinding();\n    this.setPollingInterval();\n    this.setupMainTargetNoteForm();\n    this.taskList = new TaskList({\n      dataType: 'note',\n      fieldName: 'note',\n      selector: '.notes',\n    });\n    this.collapseLongCommitList();\n    this.setViewType(view);\n\n    // We are in the Merge Requests page so we need another edit form for Changes tab\n    if (getPagePath(1) === 'merge_requests') {\n      $('.note-edit-form')\n        .clone()\n        .addClass('mr-note-edit-form')\n        .insertAfter('.note-edit-form');\n    }\n\n    const hash = getLocationHash();\n    const $anchor = hash && document.getElementById(hash);\n\n    if ($anchor) {\n      this.loadLazyDiff({ currentTarget: $anchor });\n    }\n  }\n\n  setViewType(view) {\n    this.view = Cookies.get('diff_view') || view;\n  }\n\n  addBinding() {\n    // Edit note link\n    this.$wrapperEl.on('click', '.js-note-edit', this.showEditForm.bind(this));\n    this.$wrapperEl.on('click', '.note-edit-cancel', this.cancelEdit);\n    // Reopen and close actions for Issue/MR combined with note form submit\n    this.$wrapperEl.on('click', '.js-comment-submit-button', this.postComment);\n    this.$wrapperEl.on('click', '.js-comment-save-button', this.updateComment);\n    this.$wrapperEl.on(\n      'keyup input',\n      '.js-note-text',\n      this.updateTargetButtons,\n    );\n    // resolve a discussion\n    this.$wrapperEl.on('click', '.js-comment-resolve-button', this.postComment);\n    // remove a note (in general)\n    this.$wrapperEl.on('click', '.js-note-delete', this.removeNote);\n    // delete note attachment\n    this.$wrapperEl.on(\n      'click',\n      '.js-note-attachment-delete',\n      this.removeAttachment,\n    );\n    // reset main target form when clicking discard\n    this.$wrapperEl.on('click', '.js-note-discard', this.resetMainTargetForm);\n    // update the file name when an attachment is selected\n    this.$wrapperEl.on(\n      'change',\n      '.js-note-attachment-input',\n      this.updateFormAttachment,\n    );\n    // reply to diff/discussion notes\n    this.$wrapperEl.on(\n      'click',\n      '.js-discussion-reply-button',\n      this.onReplyToDiscussionNote,\n    );\n    // add diff note\n    this.$wrapperEl.on('click', '.js-add-diff-note-button', this.onAddDiffNote);\n    // add diff note for images\n    this.$wrapperEl.on(\n      'click',\n      '.js-add-image-diff-note-button',\n      this.onAddImageDiffNote,\n    );\n    // hide diff note form\n    this.$wrapperEl.on(\n      'click',\n      '.js-close-discussion-note-form',\n      this.cancelDiscussionForm,\n    );\n    // toggle commit list\n    this.$wrapperEl.on(\n      'click',\n      '.system-note-commit-list-toggler',\n      this.toggleCommitList,\n    );\n\n    this.$wrapperEl.on('click', '.js-toggle-lazy-diff', this.loadLazyDiff);\n    this.$wrapperEl.on('click', '.js-toggle-lazy-diff-retry-button', this.onClickRetryLazyLoad.bind(this));\n\n    // fetch notes when tab becomes visible\n    this.$wrapperEl.on('visibilitychange', this.visibilityChange);\n    // when issue status changes, we need to refresh data\n    this.$wrapperEl.on('issuable:change', this.refresh);\n    // ajax:events that happen on Form when actions like Reopen, Close are performed on Issues and MRs.\n    this.$wrapperEl.on('ajax:success', '.js-main-target-form', this.addNote);\n    this.$wrapperEl.on(\n      'ajax:success',\n      '.js-discussion-note-form',\n      this.addDiscussionNote,\n    );\n    this.$wrapperEl.on(\n      'ajax:success',\n      '.js-main-target-form',\n      this.resetMainTargetForm,\n    );\n    this.$wrapperEl.on(\n      'ajax:complete',\n      '.js-main-target-form',\n      this.reenableTargetFormSubmitButton,\n    );\n    // when a key is clicked on the notes\n    this.$wrapperEl.on('keydown', '.js-note-text', this.keydownNoteText);\n    // When the URL fragment/hash has changed, `#note_xxx`\n    $(window).on('hashchange', this.onHashChange);\n    this.boundGetContent = this.getContent.bind(this);\n    document.addEventListener('refreshLegacyNotes', this.boundGetContent);\n  }\n\n  cleanBinding() {\n    this.$wrapperEl.off('click', '.js-note-edit');\n    this.$wrapperEl.off('click', '.note-edit-cancel');\n    this.$wrapperEl.off('click', '.js-note-delete');\n    this.$wrapperEl.off('click', '.js-note-attachment-delete');\n    this.$wrapperEl.off('click', '.js-discussion-reply-button');\n    this.$wrapperEl.off('click', '.js-add-diff-note-button');\n    this.$wrapperEl.off('click', '.js-add-image-diff-note-button');\n    this.$wrapperEl.off('visibilitychange');\n    this.$wrapperEl.off('keyup input', '.js-note-text');\n    this.$wrapperEl.off('click', '.js-note-target-reopen');\n    this.$wrapperEl.off('click', '.js-note-target-close');\n    this.$wrapperEl.off('click', '.js-note-discard');\n    this.$wrapperEl.off('keydown', '.js-note-text');\n    this.$wrapperEl.off('click', '.js-comment-resolve-button');\n    this.$wrapperEl.off('click', '.system-note-commit-list-toggler');\n    this.$wrapperEl.off('click', '.js-toggle-lazy-diff');\n    this.$wrapperEl.off('click', '.js-toggle-lazy-diff-retry-button');\n    this.$wrapperEl.off('ajax:success', '.js-main-target-form');\n    this.$wrapperEl.off('ajax:success', '.js-discussion-note-form');\n    this.$wrapperEl.off('ajax:complete', '.js-main-target-form');\n    document.removeEventListener('refreshLegacyNotes', this.boundGetContent);\n    $(window).off('hashchange', this.onHashChange);\n  }\n\n  static initCommentTypeToggle(form) {\n    const dropdownTrigger = form.querySelector(\n      '.js-comment-type-dropdown .dropdown-toggle',\n    );\n    const dropdownList = form.querySelector(\n      '.js-comment-type-dropdown .dropdown-menu',\n    );\n    const noteTypeInput = form.querySelector('#note_type');\n    const submitButton = form.querySelector(\n      '.js-comment-type-dropdown .js-comment-submit-button',\n    );\n    const closeButton = form.querySelector('.js-note-target-close');\n    const reopenButton = form.querySelector('.js-note-target-reopen');\n\n    const commentTypeToggle = new CommentTypeToggle({\n      dropdownTrigger,\n      dropdownList,\n      noteTypeInput,\n      submitButton,\n      closeButton,\n      reopenButton,\n    });\n\n    commentTypeToggle.initDroplab();\n  }\n\n  keydownNoteText(e) {\n    var $textarea,\n      discussionNoteForm,\n      editNote,\n      myLastNote,\n      myLastNoteEditBtn,\n      newText,\n      originalText;\n    if (isMetaKey(e)) {\n      return;\n    }\n\n    $textarea = $(e.target);\n    // Edit previous note when UP arrow is hit\n    switch (e.which) {\n      case 38:\n        if ($textarea.val() !== '') {\n          return;\n        }\n        myLastNote = $(\n          `li.note[data-author-id='${\n            gon.current_user_id\n          }'][data-editable]:last`,\n          $textarea.closest('.note, .notes_holder, #notes'),\n        );\n        if (myLastNote.length) {\n          myLastNoteEditBtn = myLastNote.find('.js-note-edit');\n          return myLastNoteEditBtn.trigger('click', [true, myLastNote]);\n        }\n        break;\n      // Cancel creating diff note or editing any note when ESCAPE is hit\n      case 27:\n        discussionNoteForm = $textarea.closest('.js-discussion-note-form');\n        if (discussionNoteForm.length) {\n          if ($textarea.val() !== '') {\n            if (\n              !confirm('Are you sure you want to cancel creating this comment?')\n            ) {\n              return;\n            }\n          }\n          this.removeDiscussionNoteForm(discussionNoteForm);\n          return;\n        }\n        editNote = $textarea.closest('.note');\n        if (editNote.length) {\n          originalText = $textarea.closest('form').data('originalNote');\n          newText = $textarea.val();\n          if (originalText !== newText) {\n            if (\n              !confirm('Are you sure you want to cancel editing this comment?')\n            ) {\n              return;\n            }\n          }\n          return this.removeNoteEditForm(editNote);\n        }\n    }\n  }\n\n  initRefresh() {\n    if (Notes.interval) {\n      clearInterval(Notes.interval);\n    }\n    return (Notes.interval = setInterval(\n      (function(_this) {\n        return function() {\n          return _this.refresh();\n        };\n      })(this),\n      this.pollingInterval,\n    ));\n  }\n\n  refresh() {\n    if (!document.hidden) {\n      return this.getContent();\n    }\n  }\n\n  getContent() {\n    if (this.refreshing) {\n      return;\n    }\n\n    this.refreshing = true;\n\n    axios\n      .get(`${this.notes_url}?html=true`, {\n        headers: {\n          'X-Last-Fetched-At': this.last_fetched_at,\n        },\n      })\n      .then(({ data }) => {\n        const notes = data.notes;\n        this.last_fetched_at = data.last_fetched_at;\n        this.setPollingInterval(data.notes.length);\n        $.each(notes, (i, note) => this.renderNote(note));\n\n        this.refreshing = false;\n      })\n      .catch(() => {\n        this.refreshing = false;\n      });\n  }\n\n  /**\n   * Increase @pollingInterval up to 120 seconds on every function call,\n   * if `shouldReset` has a truthy value, 'null' or 'undefined' the variable\n   * will reset to @basePollingInterval.\n   *\n   * Note: this function is used to gradually increase the polling interval\n   * if there aren't new notes coming from the server\n   */\n  setPollingInterval(shouldReset) {\n    var nthInterval;\n    if (shouldReset == null) {\n      shouldReset = true;\n    }\n    nthInterval =\n      this.basePollingInterval * Math.pow(2, this.maxPollingSteps - 1);\n    if (shouldReset) {\n      this.pollingInterval = this.basePollingInterval;\n    } else if (this.pollingInterval < nthInterval) {\n      this.pollingInterval *= 2;\n    }\n    return this.initRefresh();\n  }\n\n  handleQuickActions(noteEntity) {\n    var votesBlock;\n    if (noteEntity.commands_changes) {\n      if ('merge' in noteEntity.commands_changes) {\n        Notes.checkMergeRequestStatus();\n      }\n\n      if ('emoji_award' in noteEntity.commands_changes) {\n        votesBlock = $('.js-awards-block').eq(0);\n\n        loadAwardsHandler()\n          .then(awardsHandler => {\n            awardsHandler.addAwardToEmojiBar(\n              votesBlock,\n              noteEntity.commands_changes.emoji_award,\n            );\n            awardsHandler.scrollToAwards();\n          })\n          .catch(() => {\n            // ignore\n          });\n      }\n    }\n  }\n\n  setupNewNote($note) {\n    // Update datetime format on the recent note\n    localTimeAgo($note.find('.js-timeago'), false);\n\n    this.collapseLongCommitList();\n    this.taskList.init();\n\n    // This stops the note highlight, #note_xxx`, from being removed after real time update\n    // The `:target` selector does not re-evaluate after we replace element in the DOM\n    Notes.updateNoteTargetSelector($note);\n    this.$noteToCleanHighlight = $note;\n  }\n\n  onHashChange() {\n    if (this.$noteToCleanHighlight) {\n      Notes.updateNoteTargetSelector(this.$noteToCleanHighlight);\n    }\n\n    this.$noteToCleanHighlight = null;\n  }\n\n  static updateNoteTargetSelector($note) {\n    const hash = getLocationHash();\n    // Needs to be an explicit true/false for the jQuery `toggleClass(force)`\n    const addTargetClass = Boolean(hash && $note.filter(`#${hash}`).length > 0);\n    $note.toggleClass('target', addTargetClass);\n  }\n\n  /**\n   * Render note in main comments area.\n   *\n   * Note: for rendering inline notes use renderDiscussionNote\n   */\n  renderNote(noteEntity, $form, $notesList = $('.main-notes-list')) {\n    if (noteEntity.discussion_html) {\n      return this.renderDiscussionNote(noteEntity, $form);\n    }\n\n    if (!noteEntity.valid) {\n      if (noteEntity.errors && noteEntity.errors.commands_only) {\n        if (\n          noteEntity.commands_changes &&\n          Object.keys(noteEntity.commands_changes).length > 0\n        ) {\n          $notesList.find('.system-note.being-posted').remove();\n        }\n        this.addFlash(\n          noteEntity.errors.commands_only,\n          'notice',\n          this.parentTimeline.get(0),\n        );\n        this.refresh();\n      }\n      return;\n    }\n\n    const $note = $notesList.find(`#note_${noteEntity.id}`);\n    if (Notes.isNewNote(noteEntity, this.note_ids)) {\n      if (hasVueMRDiscussionsCookie()) {\n        return;\n      }\n\n      this.note_ids.push(noteEntity.id);\n\n      if ($notesList.length) {\n        $notesList.find('.system-note.being-posted').remove();\n      }\n      const $newNote = Notes.animateAppendNote(noteEntity.html, $notesList);\n\n      this.setupNewNote($newNote);\n      this.refresh();\n      return this.updateNotesCount(1);\n    } else if (Notes.isUpdatedNote(noteEntity, $note)) {\n      // The server can send the same update multiple times so we need to make sure to only update once per actual update.\n      const isEditing = $note.hasClass('is-editing');\n      const initialContent = normalizeNewlines(\n        $note\n          .find('.original-note-content')\n          .text()\n          .trim(),\n      );\n      const $textarea = $note.find('.js-note-text');\n      const currentContent = $textarea.val();\n      // There can be CRLF vs LF mismatches if we don't sanitize and compare the same way\n      const sanitizedNoteNote = normalizeNewlines(noteEntity.note);\n      const isTextareaUntouched =\n        currentContent === initialContent ||\n        currentContent === sanitizedNoteNote;\n\n      if (isEditing && isTextareaUntouched) {\n        $textarea.val(noteEntity.note);\n        this.updatedNotesTrackingMap[noteEntity.id] = noteEntity;\n      } else if (isEditing && !isTextareaUntouched) {\n        this.putConflictEditWarningInPlace(noteEntity, $note);\n        this.updatedNotesTrackingMap[noteEntity.id] = noteEntity;\n      } else {\n        const $updatedNote = Notes.animateUpdateNote(noteEntity.html, $note);\n        this.setupNewNote($updatedNote);\n      }\n    }\n\n    Notes.refreshVueNotes();\n  }\n\n  isParallelView() {\n    return Cookies.get('diff_view') === 'parallel';\n  }\n\n  /**\n   * Render note in discussion area. To render inline notes use renderDiscussionNote.\n   */\n  renderDiscussionNote(noteEntity, $form) {\n    var discussionContainer, form, row, lineType, diffAvatarContainer;\n\n    if (!Notes.isNewNote(noteEntity, this.note_ids)) {\n      return;\n    }\n    this.note_ids.push(noteEntity.id);\n\n    form =\n      $form ||\n      $(\n        `.js-discussion-note-form[data-discussion-id=\"${\n          noteEntity.discussion_id\n        }\"]`,\n      );\n    row =\n      form.length || !noteEntity.discussion_line_code\n        ? form.closest('tr')\n        : $(`#${noteEntity.discussion_line_code}`);\n\n    if (noteEntity.on_image) {\n      row = form;\n    }\n\n    lineType = this.isParallelView() ? form.find('#line_type').val() : 'old';\n    diffAvatarContainer = row\n      .prevAll('.line_holder')\n      .first()\n      .find('.js-avatar-container.' + lineType + '_line');\n    // is this the first note of discussion?\n    discussionContainer = $(\n      `.notes[data-discussion-id=\"${noteEntity.discussion_id}\"]`,\n    );\n    if (!discussionContainer.length) {\n      discussionContainer = form.closest('.discussion').find('.notes');\n    }\n    if (discussionContainer.length === 0) {\n      if (noteEntity.diff_discussion_html) {\n        var $discussion = $(noteEntity.diff_discussion_html).renderGFM();\n\n        if (\n          !this.isParallelView() ||\n          row.hasClass('js-temp-notes-holder') ||\n          noteEntity.on_image\n        ) {\n          // insert the note and the reply button after the temp row\n          row.after($discussion);\n        } else {\n          // Merge new discussion HTML in\n          var $notes = $discussion.find(\n            `.notes[data-discussion-id=\"${noteEntity.discussion_id}\"]`,\n          );\n          var contentContainerClass =\n            '.' +\n            $notes\n              .closest('.notes_content')\n              .attr('class')\n              .split(' ')\n              .join('.');\n\n          row\n            .find(contentContainerClass + ' .content')\n            .append($notes.closest('.content').children());\n        }\n      }\n      // Init discussion on 'Discussion' page if it is merge request page\n      const page = $('body').attr('data-page');\n      if (\n        (page && page.indexOf('projects:merge_request') !== -1) ||\n        !noteEntity.diff_discussion_html\n      ) {\n        if (!hasVueMRDiscussionsCookie()) {\n          Notes.animateAppendNote(\n            noteEntity.discussion_html,\n            $('.main-notes-list'),\n          );\n        }\n      }\n    } else {\n      // append new note to all matching discussions\n      Notes.animateAppendNote(noteEntity.html, discussionContainer);\n    }\n\n    if (\n      typeof gl.diffNotesCompileComponents !== 'undefined' &&\n      noteEntity.discussion_resolvable\n    ) {\n      gl.diffNotesCompileComponents();\n\n      this.renderDiscussionAvatar(diffAvatarContainer, noteEntity);\n    }\n\n    localTimeAgo($('.js-timeago'), false);\n    Notes.checkMergeRequestStatus();\n    return this.updateNotesCount(1);\n  }\n\n  getLineHolder(changesDiscussionContainer) {\n    return $(changesDiscussionContainer)\n      .closest('.notes_holder')\n      .prevAll('.line_holder')\n      .first()\n      .get(0);\n  }\n\n  renderDiscussionAvatar(diffAvatarContainer, noteEntity) {\n    var avatarHolder = diffAvatarContainer.find('.diff-comment-avatar-holders');\n\n    if (!avatarHolder.length) {\n      avatarHolder = document.createElement('diff-note-avatars');\n      avatarHolder.setAttribute('discussion-id', noteEntity.discussion_id);\n\n      diffAvatarContainer.append(avatarHolder);\n\n      gl.diffNotesCompileComponents();\n    }\n  }\n\n  /**\n   * Called in response the main target form has been successfully submitted.\n   *\n   * Removes any errors.\n   * Resets text and preview.\n   * Resets buttons.\n   */\n  resetMainTargetForm(e) {\n    var form;\n    form = $('.js-main-target-form');\n    // remove validation errors\n    form.find('.js-errors').remove();\n    // reset text and preview\n    form.find('.js-md-write-button').click();\n    form\n      .find('.js-note-text')\n      .val('')\n      .trigger('input');\n    form\n      .find('.js-note-text')\n      .data('autosave')\n      .reset();\n\n    var event = document.createEvent('Event');\n    event.initEvent('autosize:update', true, false);\n    form.find('.js-autosize')[0].dispatchEvent(event);\n\n    this.updateTargetButtons(e);\n  }\n\n  reenableTargetFormSubmitButton() {\n    var form;\n    form = $('.js-main-target-form');\n    return form.find('.js-note-text').trigger('input');\n  }\n\n  /**\n   * Shows the main form and does some setup on it.\n   *\n   * Sets some hidden fields in the form.\n   */\n  setupMainTargetNoteForm() {\n    var form;\n    // find the form\n    form = $('.js-new-note-form');\n    // Set a global clone of the form for later cloning\n    this.formClone = form.clone();\n    // show the form\n    this.setupNoteForm(form);\n    // fix classes\n    form.removeClass('js-new-note-form');\n    form.addClass('js-main-target-form');\n    form.find('#note_line_code').remove();\n    form.find('#note_position').remove();\n    form.find('#note_type').val('');\n    form.find('#note_project_id').remove();\n    form.find('#in_reply_to_discussion_id').remove();\n    form\n      .find('.js-comment-resolve-button')\n      .closest('comment-and-resolve-btn')\n      .remove();\n    this.parentTimeline = form.parents('.timeline');\n\n    if (form.length) {\n      Notes.initCommentTypeToggle(form.get(0));\n    }\n  }\n\n  /**\n   * General note form setup.\n   *\n   * deactivates the submit button when text is empty\n   * hides the preview button when text is empty\n   * setup GFM auto complete\n   * show the form\n   */\n  setupNoteForm(form) {\n    var textarea, key;\n    this.glForm = new GLForm(form, this.enableGFM);\n    textarea = form.find('.js-note-text');\n    key = [\n      'Note',\n      form.find('#note_noteable_type').val(),\n      form.find('#note_noteable_id').val(),\n      form.find('#note_commit_id').val(),\n      form.find('#note_type').val(),\n      form.find('#note_project_id').val(),\n      form.find('#in_reply_to_discussion_id').val(),\n\n      // LegacyDiffNote\n      form.find('#note_line_code').val(),\n\n      // DiffNote\n      form.find('#note_position').val(),\n    ];\n    return new Autosave(textarea, key);\n  }\n\n  /**\n   * Called in response to the new note form being submitted\n   *\n   * Adds new note to list.\n   */\n  addNote($form, note) {\n    return this.renderNote(note);\n  }\n\n  addNoteError($form) {\n    let formParentTimeline;\n    if ($form.hasClass('js-main-target-form')) {\n      formParentTimeline = $form.parents('.timeline');\n    } else if ($form.hasClass('js-discussion-note-form')) {\n      formParentTimeline = $form.closest('.discussion-notes').find('.notes');\n    }\n    return this.addFlash(\n      'Your comment could not be submitted! Please check your network connection and try again.',\n      'alert',\n      formParentTimeline.get(0),\n    );\n  }\n\n  updateNoteError($parentTimeline) {\n    new Flash(\n      'Your comment could not be updated! Please check your network connection and try again.',\n    );\n  }\n\n  /**\n   * Called in response to the new note form being submitted\n   *\n   * Adds new note to list.\n   */\n  addDiscussionNote($form, note, isNewDiffComment) {\n    if ($form.attr('data-resolve-all') != null) {\n      var projectPath = $form.data('projectPath');\n      var discussionId = $form.data('discussionId');\n      var mergeRequestId = $form.data('noteableIid');\n\n      if (ResolveService != null) {\n        ResolveService.toggleResolveForDiscussion(mergeRequestId, discussionId);\n      }\n    }\n\n    this.renderNote(note, $form);\n    // cleanup after successfully creating a diff/discussion note\n    if (isNewDiffComment) {\n      this.removeDiscussionNoteForm($form);\n    }\n  }\n\n  /**\n   * Called in response to the edit note form being submitted\n   *\n   * Updates the current note field.\n   */\n  updateNote(noteEntity, $targetNote) {\n    var $noteEntityEl, $note_li;\n    // Convert returned HTML to a jQuery object so we can modify it further\n    $noteEntityEl = $(noteEntity.html);\n    this.revertNoteEditForm($targetNote);\n    $noteEntityEl.renderGFM();\n    // Find the note's `li` element by ID and replace it with the updated HTML\n    $note_li = $('.note-row-' + noteEntity.id);\n\n    $note_li.replaceWith($noteEntityEl);\n    this.setupNewNote($noteEntityEl);\n\n    if (typeof gl.diffNotesCompileComponents !== 'undefined') {\n      gl.diffNotesCompileComponents();\n    }\n  }\n\n  checkContentToAllowEditing($el) {\n    var initialContent = $el\n      .find('.original-note-content')\n      .text()\n      .trim();\n    var currentContent = $el.find('.js-note-text').val();\n    var isAllowed = true;\n\n    if (currentContent === initialContent) {\n      this.removeNoteEditForm($el);\n    } else {\n      var $buttons = $el.find('.note-form-actions');\n      var isWidgetVisible = isInViewport($el.get(0));\n\n      if (!isWidgetVisible) {\n        scrollToElement($el);\n      }\n\n      $el.find('.js-finish-edit-warning').show();\n      isAllowed = false;\n    }\n\n    return isAllowed;\n  }\n\n  /**\n   * Called in response to clicking the edit note link\n   *\n   * Replaces the note text with the note edit form\n   * Adds a data attribute to the form with the original content of the note for cancellations\n   */\n  showEditForm(e, scrollTo, myLastNote) {\n    e.preventDefault();\n\n    var $target = $(e.target);\n    var $editForm = $(this.getEditFormSelector($target));\n    var $note = $target.closest('.note');\n    var $currentlyEditing = $('.note.is-editing:visible');\n\n    if ($currentlyEditing.length) {\n      var isEditAllowed = this.checkContentToAllowEditing($currentlyEditing);\n\n      if (!isEditAllowed) {\n        return;\n      }\n    }\n\n    $note.find('.js-note-attachment-delete').show();\n    $editForm.addClass('current-note-edit-form');\n    $note.addClass('is-editing');\n    this.putEditFormInPlace($target);\n  }\n\n  /**\n   * Called in response to clicking the edit note link\n   *\n   * Hides edit form and restores the original note text to the editor textarea.\n   */\n  cancelEdit(e) {\n    e.preventDefault();\n    const $target = $(e.target);\n    const $note = $target.closest('.note');\n    const noteId = $note.attr('data-note-id');\n\n    this.revertNoteEditForm($target);\n\n    if (this.updatedNotesTrackingMap[noteId]) {\n      const $newNote = $(this.updatedNotesTrackingMap[noteId].html);\n      $note.replaceWith($newNote);\n      this.setupNewNote($newNote);\n      // Now that we have taken care of the update, clear it out\n      delete this.updatedNotesTrackingMap[noteId];\n    } else {\n      $note.find('.js-finish-edit-warning').hide();\n      this.removeNoteEditForm($note);\n    }\n  }\n\n  revertNoteEditForm($target) {\n    $target = $target || $('.note.is-editing:visible');\n    var selector = this.getEditFormSelector($target);\n    var $editForm = $(selector);\n\n    $editForm.insertBefore('.diffs');\n    $editForm.find('.js-comment-save-button').enable();\n    $editForm.find('.js-finish-edit-warning').hide();\n  }\n\n  getEditFormSelector($el) {\n    var selector = '.note-edit-form:not(.mr-note-edit-form)';\n\n    if ($el.parents('#diffs').length) {\n      selector = '.note-edit-form.mr-note-edit-form';\n    }\n\n    return selector;\n  }\n\n  removeNoteEditForm($note) {\n    var form = $note.find('.diffs .current-note-edit-form');\n\n    $note.removeClass('is-editing');\n    form.removeClass('current-note-edit-form');\n    form.find('.js-finish-edit-warning').hide();\n    // Replace markdown textarea text with original note text.\n    return form\n      .find('.js-note-text')\n      .val(form.find('form.edit-note').data('originalNote'));\n  }\n\n  /**\n   * Called in response to deleting a note of any kind.\n   *\n   * Removes the actual note from view.\n   * Removes the whole discussion if the last note is being removed.\n   */\n  removeNote(e) {\n    var noteElId, noteId, dataNoteId, $note, lineHolder;\n    $note = $(e.currentTarget).closest('.note');\n    noteElId = $note.attr('id');\n    noteId = $note.attr('data-note-id');\n    lineHolder = $(e.currentTarget)\n      .closest('.notes[data-discussion-id]')\n      .closest('.notes_holder')\n      .prev('.line_holder');\n    $(`.note[id=\"${noteElId}\"]`).each(\n      (function(_this) {\n        // A same note appears in the \"Discussion\" and in the \"Changes\" tab, we have\n        // to remove all. Using $('.note[id='noteId']') ensure we get all the notes,\n        // where $('#noteId') would return only one.\n        return function(i, el) {\n          var $note, $notes;\n          $note = $(el);\n          $notes = $note.closest('.discussion-notes');\n          const discussionId = $('.notes', $notes).data('discussionId');\n\n          if (typeof gl.diffNotesCompileComponents !== 'undefined') {\n            if (gl.diffNoteApps[noteElId]) {\n              gl.diffNoteApps[noteElId].$destroy();\n            }\n          }\n\n          $note.remove();\n\n          // check if this is the last note for this line\n          if ($notes.find('.note').length === 0) {\n            var notesTr = $notes.closest('tr');\n\n            // \"Discussions\" tab\n            $notes.closest('.timeline-entry').remove();\n\n            $(`.js-diff-avatars-${discussionId}`).trigger('remove.vue');\n\n            // The notes tr can contain multiple lists of notes, like on the parallel diff\n            // notesTr does not exist for image diffs\n            if (\n              notesTr.find('.discussion-notes').length > 1 ||\n              notesTr.length === 0\n            ) {\n              const $diffFile = $notes.closest('.diff-file');\n              if ($diffFile.length > 0) {\n                const removeBadgeEvent = new CustomEvent(\n                  'removeBadge.imageDiff',\n                  {\n                    detail: {\n                      // badgeNumber's start with 1 and index starts with 0\n                      badgeNumber: $notes.index() + 1,\n                    },\n                  },\n                );\n\n                $diffFile[0].dispatchEvent(removeBadgeEvent);\n              }\n\n              $notes.remove();\n            } else if (notesTr.length > 0) {\n              notesTr.remove();\n            }\n          }\n        };\n      })(this),\n    );\n\n    Notes.refreshVueNotes();\n    Notes.checkMergeRequestStatus();\n    return this.updateNotesCount(-1);\n  }\n\n  /**\n   * Called in response to clicking the delete attachment link\n   *\n   * Removes the attachment wrapper view, including image tag if it exists\n   * Resets the note editing form\n   */\n  removeAttachment() {\n    const $note = $(this).closest('.note');\n    $note.find('.note-attachment').remove();\n    $note.find('.note-body > .note-text').show();\n    $note.find('.note-header').show();\n    return $note.find('.current-note-edit-form').remove();\n  }\n\n  /**\n   * Called when clicking on the \"reply\" button for a diff line.\n   *\n   * Shows the note form below the notes.\n   */\n  onReplyToDiscussionNote(e) {\n    this.replyToDiscussionNote(e.target);\n  }\n\n  replyToDiscussionNote(target) {\n    var form, replyLink;\n    form = this.cleanForm(this.formClone.clone());\n    replyLink = $(target).closest('.js-discussion-reply-button');\n    // insert the form after the button\n    replyLink\n      .closest('.discussion-reply-holder')\n      .hide()\n      .after(form);\n    // show the form\n    return this.setupDiscussionNoteForm(replyLink, form);\n  }\n\n  /**\n   * Shows the diff or discussion form and does some setup on it.\n   *\n   * Sets some hidden fields in the form.\n   *\n   * Note: dataHolder must have the \"discussionId\" and \"lineCode\" data attributes set.\n   */\n  setupDiscussionNoteForm(dataHolder, form) {\n    // setup note target\n    let diffFileData = dataHolder.closest('.text-file');\n\n    if (diffFileData.length === 0) {\n      diffFileData = dataHolder.closest('.image');\n    }\n\n    var discussionID = dataHolder.data('discussionId');\n\n    if (discussionID) {\n      form.attr('data-discussion-id', discussionID);\n      form.find('#in_reply_to_discussion_id').val(discussionID);\n    }\n\n    form.find('#note_project_id').val(dataHolder.data('discussionProjectId'));\n\n    form.attr('data-line-code', dataHolder.data('lineCode'));\n    form.find('#line_type').val(dataHolder.data('lineType'));\n\n    form.find('#note_noteable_type').val(diffFileData.data('noteableType'));\n    form.find('#note_noteable_id').val(diffFileData.data('noteableId'));\n    form.find('#note_commit_id').val(diffFileData.data('commitId'));\n\n    form.find('#note_type').val(dataHolder.data('noteType'));\n\n    // LegacyDiffNote\n    form.find('#note_line_code').val(dataHolder.data('lineCode'));\n\n    // DiffNote\n    form.find('#note_position').val(dataHolder.attr('data-position'));\n\n    form\n      .find('.js-note-discard')\n      .show()\n      .removeClass('js-note-discard')\n      .addClass('js-close-discussion-note-form')\n      .text(form.find('.js-close-discussion-note-form').data('cancelText'));\n    form.find('.js-note-target-close').remove();\n    form.find('.js-note-new-discussion').remove();\n    this.setupNoteForm(form);\n\n    form\n      .removeClass('js-main-target-form')\n      .addClass('discussion-form js-discussion-note-form');\n\n    if (typeof gl.diffNotesCompileComponents !== 'undefined') {\n      var $commentBtn = form.find('comment-and-resolve-btn');\n      $commentBtn.attr(':discussion-id', `'${discussionID}'`);\n\n      gl.diffNotesCompileComponents();\n    }\n\n    form.find('.js-note-text').focus();\n    form\n      .find('.js-comment-resolve-button')\n      .attr('data-discussion-id', discussionID);\n  }\n\n  /**\n   * Called when clicking on the \"add a comment\" button on the side of a diff line.\n   *\n   * Inserts a temporary row for the form below the line.\n   * Sets up the form and shows it.\n   */\n  onAddDiffNote(e) {\n    e.preventDefault();\n    const link = e.currentTarget || e.target;\n    const $link = $(link);\n    const showReplyInput = !$link.hasClass('js-diff-comment-avatar');\n    this.toggleDiffNote({\n      target: $link,\n      lineType: link.dataset.lineType,\n      showReplyInput,\n    });\n  }\n\n  onAddImageDiffNote(e) {\n    const $link = $(e.currentTarget || e.target);\n    const $diffFile = $link.closest('.diff-file');\n\n    const clickEvent = new CustomEvent('click.imageDiff', {\n      detail: e,\n    });\n\n    $diffFile[0].dispatchEvent(clickEvent);\n\n    // Setup comment form\n    let newForm;\n    const $noteContainer = $link\n      .closest('.diff-viewer')\n      .find('.note-container');\n    const $form = $noteContainer.find('> .discussion-form');\n\n    if ($form.length === 0) {\n      newForm = this.cleanForm(this.formClone.clone());\n      newForm.appendTo($noteContainer);\n    } else {\n      newForm = $form;\n    }\n\n    this.setupDiscussionNoteForm($link, newForm);\n  }\n\n  toggleDiffNote({ target, lineType, forceShow, showReplyInput = false }) {\n    var $link,\n      addForm,\n      hasNotes,\n      newForm,\n      noteForm,\n      replyButton,\n      row,\n      rowCssToAdd,\n      targetContent,\n      isDiffCommentAvatar;\n    $link = $(target);\n    row = $link.closest('tr');\n    const nextRow = row.next();\n    let targetRow = row;\n    if (nextRow.is('.notes_holder')) {\n      targetRow = nextRow;\n    }\n\n    hasNotes = nextRow.is('.notes_holder');\n    addForm = false;\n    let lineTypeSelector = '';\n    rowCssToAdd =\n      '<tr class=\"notes_holder js-temp-notes-holder\"><td class=\"notes_line\" colspan=\"2\"></td><td class=\"notes_content\"><div class=\"content\"></div></td></tr>';\n    // In parallel view, look inside the correct left/right pane\n    if (this.isParallelView()) {\n      lineTypeSelector = `.${lineType}`;\n      rowCssToAdd =\n        '<tr class=\"notes_holder js-temp-notes-holder\"><td class=\"notes_line old\"></td><td class=\"notes_content parallel old\"><div class=\"content\"></div></td><td class=\"notes_line new\"></td><td class=\"notes_content parallel new\"><div class=\"content\"></div></td></tr>';\n    }\n    const notesContentSelector = `.notes_content${lineTypeSelector} .content`;\n    let notesContent = targetRow.find(notesContentSelector);\n\n    if (hasNotes && showReplyInput) {\n      targetRow.show();\n      notesContent = targetRow.find(notesContentSelector);\n      if (notesContent.length) {\n        notesContent.show();\n        replyButton = notesContent.find('.js-discussion-reply-button:visible');\n        if (replyButton.length) {\n          this.replyToDiscussionNote(replyButton[0]);\n        } else {\n          // In parallel view, the form may not be present in one of the panes\n          noteForm = notesContent.find('.js-discussion-note-form');\n          if (noteForm.length === 0) {\n            addForm = true;\n          }\n        }\n      }\n    } else if (showReplyInput) {\n      // add a notes row and insert the form\n      row.after(rowCssToAdd);\n      targetRow = row.next();\n      notesContent = targetRow.find(notesContentSelector);\n      addForm = true;\n    } else {\n      const isCurrentlyShown = targetRow\n        .find('.content:not(:empty)')\n        .is(':visible');\n      const isForced = forceShow === true || forceShow === false;\n      const showNow = forceShow === true || (!isCurrentlyShown && !isForced);\n\n      targetRow.toggleClass('hide', !showNow);\n      notesContent.toggleClass('hide', !showNow);\n    }\n\n    if (addForm) {\n      newForm = this.cleanForm(this.formClone.clone());\n      newForm.appendTo(notesContent);\n      // show the form\n      return this.setupDiscussionNoteForm($link, newForm);\n    }\n  }\n\n  /**\n   * Called in response to \"cancel\" on a diff note form.\n   *\n   * Shows the reply button again.\n   * Removes the form and if necessary it's temporary row.\n   */\n  removeDiscussionNoteForm(form) {\n    var glForm, row;\n    row = form.closest('tr');\n    glForm = form.data('glForm');\n    glForm.destroy();\n    form\n      .find('.js-note-text')\n      .data('autosave')\n      .reset();\n    // show the reply button (will only work for replies)\n    form.prev('.discussion-reply-holder').show();\n    if (row.is('.js-temp-notes-holder')) {\n      // remove temporary row for diff lines\n      return row.remove();\n    } else {\n      // only remove the form\n      return form.remove();\n    }\n  }\n\n  cancelDiscussionForm(e) {\n    e.preventDefault();\n    const $form = $(e.target).closest('.js-discussion-note-form');\n    const $discussionNote = $(e.target).closest('.discussion-notes');\n\n    if ($discussionNote.length === 0) {\n      // Only send blur event when the discussion form\n      // is not part of a discussion note\n      const $diffFile = $form.closest('.diff-file');\n\n      if ($diffFile.length > 0) {\n        const blurEvent = new CustomEvent('blur.imageDiff', {\n          detail: e,\n        });\n\n        $diffFile[0].dispatchEvent(blurEvent);\n      }\n    }\n\n    return this.removeDiscussionNoteForm($form);\n  }\n\n  /**\n   * Called after an attachment file has been selected.\n   *\n   * Updates the file name for the selected attachment.\n   */\n  updateFormAttachment() {\n    var filename, form;\n    form = $(this).closest('form');\n    // get only the basename\n    filename = $(this)\n      .val()\n      .replace(/^.*[\\\\\\/]/, '');\n    return form.find('.js-attachment-filename').text(filename);\n  }\n\n  /**\n   * Called when the tab visibility changes\n   */\n  visibilityChange() {\n    return this.refresh();\n  }\n\n  updateTargetButtons(e) {\n    var closebtn, closetext, discardbtn, form, reopenbtn, reopentext, textarea;\n    textarea = $(e.target);\n    form = textarea.parents('form');\n    reopenbtn = form.find('.js-note-target-reopen');\n    closebtn = form.find('.js-note-target-close');\n    discardbtn = form.find('.js-note-discard');\n\n    if (textarea.val().trim().length > 0) {\n      reopentext = reopenbtn.attr('data-alternative-text');\n      closetext = closebtn.attr('data-alternative-text');\n      if (reopenbtn.text() !== reopentext) {\n        reopenbtn.text(reopentext);\n      }\n      if (closebtn.text() !== closetext) {\n        closebtn.text(closetext);\n      }\n      if (reopenbtn.is(':not(.btn-comment-and-reopen)')) {\n        reopenbtn.addClass('btn-comment-and-reopen');\n      }\n      if (closebtn.is(':not(.btn-comment-and-close)')) {\n        closebtn.addClass('btn-comment-and-close');\n      }\n      if (discardbtn.is(':hidden')) {\n        return discardbtn.show();\n      }\n    } else {\n      reopentext = reopenbtn.data('originalText');\n      closetext = closebtn.data('originalText');\n      if (reopenbtn.text() !== reopentext) {\n        reopenbtn.text(reopentext);\n      }\n      if (closebtn.text() !== closetext) {\n        closebtn.text(closetext);\n      }\n      if (reopenbtn.is('.btn-comment-and-reopen')) {\n        reopenbtn.removeClass('btn-comment-and-reopen');\n      }\n      if (closebtn.is('.btn-comment-and-close')) {\n        closebtn.removeClass('btn-comment-and-close');\n      }\n      if (discardbtn.is(':visible')) {\n        return discardbtn.hide();\n      }\n    }\n  }\n\n  putEditFormInPlace($el) {\n    var $editForm = $(this.getEditFormSelector($el));\n    var $note = $el.closest('.note');\n\n    $editForm.insertAfter($note.find('.note-text'));\n\n    var $originalContentEl = $note.find('.original-note-content');\n    var originalContent = $originalContentEl.text().trim();\n    var postUrl = $originalContentEl.data('postUrl');\n    var targetId = $originalContentEl.data('targetId');\n    var targetType = $originalContentEl.data('targetType');\n\n    this.glForm = new GLForm($editForm.find('form'), this.enableGFM);\n\n    $editForm\n      .find('form')\n      .attr('action', `${postUrl}?html=true`)\n      .attr('data-remote', 'true');\n    $editForm.find('.js-form-target-id').val(targetId);\n    $editForm.find('.js-form-target-type').val(targetType);\n    $editForm\n      .find('.js-note-text')\n      .focus()\n      .val(originalContent);\n    $editForm.find('.js-md-write-button').trigger('click');\n    $editForm.find('.referenced-users').hide();\n  }\n\n  putConflictEditWarningInPlace(noteEntity, $note) {\n    if ($note.find('.js-conflict-edit-warning').length === 0) {\n      const $alert = $(`<div class=\"js-conflict-edit-warning alert alert-danger\">\n        This comment has changed since you started editing, please review the\n        <a href=\"#note_${\n          noteEntity.id\n        }\" target=\"_blank\" rel=\"noopener noreferrer\">\n          updated comment\n        </a>\n        to ensure information is not lost\n      </div>`);\n      $alert.insertAfter($note.find('.note-text'));\n    }\n  }\n\n  updateNotesCount(updateCount) {\n    return this.notesCountBadge.text(\n      parseInt(this.notesCountBadge.text(), 10) + updateCount,\n    );\n  }\n\n  static renderPlaceholderComponent($container) {\n    const el = $container.find('.js-code-placeholder').get(0);\n    new Vue({\n      // eslint-disable-line no-new\n      el,\n      components: {\n        SkeletonLoadingContainer,\n      },\n      render(createElement) {\n        return createElement('skeleton-loading-container');\n      },\n    });\n  }\n\n  static renderDiffContent($container, data) {\n    const { discussion_html } = data;\n    const lines = $(discussion_html).find('.line_holder');\n    lines.addClass('fade-in');\n    $container.find('.diff-content > table > tbody').prepend(lines);\n    const fileHolder = $container.find('.file-holder');\n    $container.find('.line-holder-placeholder').remove();\n    syntaxHighlight(fileHolder);\n  }\n\n  onClickRetryLazyLoad(e) {\n    const $retryButton = $(e.currentTarget);\n\n    $retryButton.prop('disabled', true);\n\n    return this.loadLazyDiff(e)\n    .then(() => {\n      $retryButton.prop('disabled', false);\n    });\n  }\n\n  loadLazyDiff(e) {\n    const $container = $(e.currentTarget).closest('.js-toggle-container');\n    Notes.renderPlaceholderComponent($container);\n\n    $container.find('.js-toggle-lazy-diff').removeClass('js-toggle-lazy-diff');\n\n    const $tableEl = $container.find('tbody');\n    if ($tableEl.length === 0) return;\n\n    const fileHolder = $container.find('.file-holder');\n    const url = fileHolder.data('linesPath');\n\n    const $errorContainer = $container.find('.js-error-lazy-load-diff');\n    const $successContainer = $container.find('.js-success-lazy-load');\n\n    /**\n     * We only fetch resolved discussions.\n     * Unresolved discussions don't have an endpoint being provided.\n     */\n    if (url) {\n      return axios\n      .get(url)\n      .then(({ data }) => {\n        // Reset state in case last request returned error\n        $successContainer.removeClass('hidden');\n        $errorContainer.addClass('hidden');\n\n        Notes.renderDiffContent($container, data);\n      })\n      .catch(() => {\n        $successContainer.addClass('hidden');\n        $errorContainer.removeClass('hidden');\n      });\n    }\n    return Promise.resolve();\n  }\n\n  toggleCommitList(e) {\n    const $element = $(e.currentTarget);\n    const $closestSystemCommitList = $element.siblings(\n      '.system-note-commit-list',\n    );\n\n    $element\n      .find('.fa')\n      .toggleClass('fa-angle-down')\n      .toggleClass('fa-angle-up');\n    $closestSystemCommitList.toggleClass('hide-shade');\n  }\n\n  /**\n   * Scans system notes with `ul` elements in system note body\n   * then collapse long commit list pushed by user to make it less\n   * intrusive.\n   */\n  collapseLongCommitList() {\n    const systemNotes = $('#notes-list')\n      .find('li.system-note')\n      .has('ul');\n\n    $.each(systemNotes, function(index, systemNote) {\n      const $systemNote = $(systemNote);\n      const headerMessage = $systemNote\n        .find('.note-text')\n        .find('p:first')\n        .text()\n        .replace(':', '');\n\n      $systemNote.find('.note-header .system-note-message').html(headerMessage);\n\n      if ($systemNote.find('li').length > MAX_VISIBLE_COMMIT_LIST_COUNT) {\n        $systemNote.find('.note-text').addClass('system-note-commit-list');\n        $systemNote.find('.system-note-commit-list-toggler').show();\n      } else {\n        $systemNote\n          .find('.note-text')\n          .addClass('system-note-commit-list hide-shade');\n      }\n    });\n  }\n\n  addFlash(...flashParams) {\n    this.flashContainer = new Flash(...flashParams);\n  }\n\n  clearFlash() {\n    if (this.flashContainer) {\n      this.flashContainer.style.display = 'none';\n      this.flashContainer = null;\n    }\n  }\n\n  cleanForm($form) {\n    // Remove JS classes that are not needed here\n    $form.find('.js-comment-type-dropdown').removeClass('btn-group');\n\n    // Remove dropdown\n    $form.find('.dropdown-menu').remove();\n\n    return $form;\n  }\n\n  /**\n   * Check if note does not exists on page\n   */\n  static isNewNote(noteEntity, noteIds) {\n    return $.inArray(noteEntity.id, noteIds) === -1;\n  }\n\n  /**\n   * Check if $note already contains the `noteEntity` content\n   */\n  static isUpdatedNote(noteEntity, $note) {\n    // There can be CRLF vs LF mismatches if we don't sanitize and compare the same way\n    const sanitizedNoteEntityText = normalizeNewlines(noteEntity.note.trim());\n    const currentNoteText = normalizeNewlines(\n      $note\n        .find('.original-note-content')\n        .first()\n        .text()\n        .trim(),\n    );\n    return sanitizedNoteEntityText !== currentNoteText;\n  }\n\n  static checkMergeRequestStatus() {\n    if (getPagePath(1) === 'merge_requests' && gl.mrWidget) {\n      gl.mrWidget.checkStatus();\n    }\n  }\n\n  static animateAppendNote(noteHtml, $notesList) {\n    const $note = $(noteHtml);\n\n    $note.addClass('fade-in-full').renderGFM();\n    $notesList.append($note);\n    return $note;\n  }\n\n  static animateUpdateNote(noteHtml, $note) {\n    const $updatedNote = $(noteHtml);\n\n    $updatedNote.addClass('fade-in').renderGFM();\n    $note.replaceWith($updatedNote);\n    return $updatedNote;\n  }\n\n  static refreshVueNotes() {\n    document.dispatchEvent(new CustomEvent('refreshVueNotes'));\n  }\n\n  /**\n   * Get data from Form attributes to use for saving/submitting comment.\n   */\n  getFormData($form) {\n    const content = $form.find('.js-note-text').val();\n    return {\n      formData: $form.serialize(),\n      formContent: _.escape(content),\n      formAction: $form.attr('action'),\n      formContentOriginal: content,\n    };\n  }\n\n  /**\n   * Identify if comment has any quick actions\n   */\n  hasQuickActions(formContent) {\n    return REGEX_QUICK_ACTIONS.test(formContent);\n  }\n\n  /**\n   * Remove quick actions and leave comment with pure message\n   */\n  stripQuickActions(formContent) {\n    return formContent.replace(REGEX_QUICK_ACTIONS, '').trim();\n  }\n\n  /**\n   * Gets appropriate description from quick actions found in provided `formContent`\n   */\n  getQuickActionDescription(formContent, availableQuickActions = []) {\n    let tempFormContent;\n\n    // Identify executed quick actions from `formContent`\n    const executedCommands = availableQuickActions.filter((command, index) => {\n      const commandRegex = new RegExp(`/${command.name}`);\n      return commandRegex.test(formContent);\n    });\n\n    if (executedCommands && executedCommands.length) {\n      if (executedCommands.length > 1) {\n        tempFormContent = 'Applying multiple commands';\n      } else {\n        const commandDescription = executedCommands[0].description.toLowerCase();\n        tempFormContent = `Applying command to ${commandDescription}`;\n      }\n    } else {\n      tempFormContent = 'Applying command';\n    }\n\n    return tempFormContent;\n  }\n\n  /**\n   * Create placeholder note DOM element populated with comment body\n   * that we will show while comment is being posted.\n   * Once comment is _actually_ posted on server, we will have final element\n   * in response that we will show in place of this temporary element.\n   */\n  createPlaceholderNote({\n    formContent,\n    uniqueId,\n    isDiscussionNote,\n    currentUsername,\n    currentUserFullname,\n    currentUserAvatar,\n  }) {\n    const discussionClass = isDiscussionNote ? 'discussion' : '';\n    const $tempNote = $(\n      `<li id=\"${uniqueId}\" class=\"note being-posted fade-in-half timeline-entry\">\n         <div class=\"timeline-entry-inner\">\n            <div class=\"timeline-icon\">\n               <a href=\"/${_.escape(currentUsername)}\">\n                 <img class=\"avatar s40\" src=\"${currentUserAvatar}\" />\n               </a>\n            </div>\n            <div class=\"timeline-content ${discussionClass}\">\n               <div class=\"note-header\">\n                  <div class=\"note-header-info\">\n                     <a href=\"/${_.escape(currentUsername)}\">\n                       <span class=\"d-none d-sm-block\">${_.escape(\n                         currentUsername,\n                       )}</span>\n                       <span class=\"note-headline-light\">${_.escape(\n                         currentUsername,\n                       )}</span>\n                     </a>\n                  </div>\n               </div>\n               <div class=\"note-body\">\n                 <div class=\"note-text\">\n                   <p>${formContent}</p>\n                 </div>\n               </div>\n            </div>\n         </div>\n      </li>`,\n    );\n\n    $tempNote.find('.d-none.d-sm-block').text(_.escape(currentUserFullname));\n    $tempNote\n      .find('.note-headline-light')\n      .text(`@${_.escape(currentUsername)}`);\n\n    return $tempNote;\n  }\n\n  /**\n   * Create Placeholder System Note DOM element populated with quick action description\n   */\n  createPlaceholderSystemNote({ formContent, uniqueId }) {\n    const $tempNote = $(\n      `<li id=\"${uniqueId}\" class=\"note system-note timeline-entry being-posted fade-in-half\">\n         <div class=\"timeline-entry-inner\">\n           <div class=\"timeline-content\">\n             <i>${formContent}</i>\n           </div>\n         </div>\n       </li>`,\n    );\n\n    return $tempNote;\n  }\n\n  /**\n   * This method does following tasks step-by-step whenever a new comment\n   * is submitted by user (both main thread comments as well as discussion comments).\n   *\n   * 1) Get Form metadata\n   * 2) Identify comment type; a) Main thread b) Discussion thread c) Discussion resolve\n   * 3) Build temporary placeholder element (using `createPlaceholderNote`)\n   * 4) Show placeholder note on UI\n   * 5) Perform network request to submit the note using `axios.post`\n   *    a) If request is successfully completed\n   *        1. Remove placeholder element\n   *        2. Show submitted Note element\n   *        3. Perform post-submit errands\n   *           a. Mark discussion as resolved if comment submission was for resolve.\n   *           b. Reset comment form to original state.\n   *    b) If request failed\n   *        1. Remove placeholder element\n   *        2. Show error Flash message about failure\n   */\n  postComment(e) {\n    e.preventDefault();\n\n    // Get Form metadata\n    const $submitBtn = $(e.target);\n    $submitBtn.prop('disabled', true);\n    let $form = $submitBtn.parents('form');\n    const $closeBtn = $form.find('.js-note-target-close');\n    const isDiscussionNote =\n      $submitBtn\n        .parent()\n        .find('li.droplab-item-selected')\n        .attr('id') === 'discussion';\n    const isMainForm = $form.hasClass('js-main-target-form');\n    const isDiscussionForm = $form.hasClass('js-discussion-note-form');\n    const isDiscussionResolve = $submitBtn.hasClass(\n      'js-comment-resolve-button',\n    );\n    const {\n      formData,\n      formContent,\n      formAction,\n      formContentOriginal,\n    } = this.getFormData($form);\n    let noteUniqueId;\n    let systemNoteUniqueId;\n    let hasQuickActions = false;\n    let $notesContainer;\n    let tempFormContent;\n\n    // Get reference to notes container based on type of comment\n    if (isDiscussionForm) {\n      $notesContainer = $form.parent('.discussion-notes').find('.notes');\n    } else if (isMainForm) {\n      $notesContainer = $('ul.main-notes-list');\n    }\n\n    // If comment is to resolve discussion, disable submit buttons while\n    // comment posting is finished.\n    if (isDiscussionResolve) {\n      $form.find('.js-comment-submit-button').disable();\n    }\n\n    tempFormContent = formContent;\n    if (this.hasQuickActions(formContent)) {\n      tempFormContent = this.stripQuickActions(formContent);\n      hasQuickActions = true;\n    }\n\n    // Show placeholder note\n    if (tempFormContent) {\n      noteUniqueId = _.uniqueId('tempNote_');\n      $notesContainer.append(\n        this.createPlaceholderNote({\n          formContent: tempFormContent,\n          uniqueId: noteUniqueId,\n          isDiscussionNote,\n          currentUsername: gon.current_username,\n          currentUserFullname: gon.current_user_fullname,\n          currentUserAvatar: gon.current_user_avatar_url,\n        }),\n      );\n    }\n\n    // Show placeholder system note\n    if (hasQuickActions) {\n      systemNoteUniqueId = _.uniqueId('tempSystemNote_');\n      $notesContainer.append(\n        this.createPlaceholderSystemNote({\n          formContent: this.getQuickActionDescription(\n            formContent,\n            AjaxCache.get(gl.GfmAutoComplete.dataSources.commands),\n          ),\n          uniqueId: systemNoteUniqueId,\n        }),\n      );\n    }\n\n    // Clear the form textarea\n    if ($notesContainer.length) {\n      if (isMainForm) {\n        this.resetMainTargetForm(e);\n      } else if (isDiscussionForm) {\n        this.removeDiscussionNoteForm($form);\n      }\n    }\n\n    $closeBtn.text($closeBtn.data('originalText'));\n\n    /* eslint-disable promise/catch-or-return */\n    // Make request to submit comment on server\n    return axios\n      .post(`${formAction}?html=true`, formData)\n      .then(res => {\n        const note = res.data;\n\n        $submitBtn.prop('disabled', false);\n        // Submission successful! remove placeholder\n        $notesContainer.find(`#${noteUniqueId}`).remove();\n\n        const $diffFile = $form.closest('.diff-file');\n        if ($diffFile.length > 0) {\n          const blurEvent = new CustomEvent('blur.imageDiff', {\n            detail: e,\n          });\n\n          $diffFile[0].dispatchEvent(blurEvent);\n        }\n\n        // Reset cached commands list when command is applied\n        if (hasQuickActions) {\n          $form\n            .find('textarea.js-note-text')\n            .trigger('clear-commands-cache.atwho');\n        }\n\n        // Clear previous form errors\n        this.clearFlashWrapper();\n\n        // Check if this was discussion comment\n        if (isDiscussionForm) {\n          // Remove flash-container\n          $notesContainer.find('.flash-container').remove();\n\n          // If comment intends to resolve discussion, do the same.\n          if (isDiscussionResolve) {\n            $form\n              .attr('data-discussion-id', $submitBtn.data('discussionId'))\n              .attr('data-resolve-all', 'true')\n              .attr('data-project-path', $submitBtn.data('projectPath'));\n          }\n\n          // Show final note element on UI\n          const isNewDiffComment = $notesContainer.length === 0;\n          this.addDiscussionNote($form, note, isNewDiffComment);\n\n          if (isNewDiffComment) {\n            // Add image badge, avatar badge and toggle discussion badge for new image diffs\n            const notePosition = $form.find('#note_position').val();\n            if ($diffFile.length > 0 && notePosition.length > 0) {\n              const { x, y, width, height } = JSON.parse(notePosition);\n              const addBadgeEvent = new CustomEvent('addBadge.imageDiff', {\n                detail: {\n                  x,\n                  y,\n                  width,\n                  height,\n                  noteId: `note_${note.id}`,\n                  discussionId: note.discussion_id,\n                },\n              });\n\n              $diffFile[0].dispatchEvent(addBadgeEvent);\n            }\n          }\n\n          // append flash-container to the Notes list\n          if ($notesContainer.length) {\n            $notesContainer.append(\n              '<div class=\"flash-container\" style=\"display: none;\"></div>',\n            );\n          }\n\n          Notes.refreshVueNotes();\n        } else if (isMainForm) {\n          // Check if this was main thread comment\n          // Show final note element on UI and perform form and action buttons cleanup\n          this.addNote($form, note);\n          this.reenableTargetFormSubmitButton(e);\n        }\n\n        if (note.commands_changes) {\n          this.handleQuickActions(note);\n        }\n\n        $form.trigger('ajax:success', [note]);\n      })\n      .catch(() => {\n        // Submission failed, remove placeholder note and show Flash error message\n        $notesContainer.find(`#${noteUniqueId}`).remove();\n        $submitBtn.prop('disabled', false);\n        const blurEvent = new CustomEvent('blur.imageDiff', {\n          detail: e,\n        });\n\n        const closestDiffFile = $form.closest('.diff-file');\n\n        if (closestDiffFile.length) {\n          closestDiffFile[0].dispatchEvent(blurEvent);\n        }\n\n        if (hasQuickActions) {\n          $notesContainer.find(`#${systemNoteUniqueId}`).remove();\n        }\n\n        // Show form again on UI on failure\n        if (isDiscussionForm && $notesContainer.length) {\n          const replyButton = $notesContainer\n            .parent()\n            .find('.js-discussion-reply-button');\n          this.replyToDiscussionNote(replyButton[0]);\n          $form = $notesContainer.parent().find('form');\n        }\n\n        $form.find('.js-note-text').val(formContentOriginal);\n        this.reenableTargetFormSubmitButton(e);\n        this.addNoteError($form);\n      });\n  }\n\n  /**\n   * This method does following tasks step-by-step whenever an existing comment\n   * is updated by user (both main thread comments as well as discussion comments).\n   *\n   * 1) Get Form metadata\n   * 2) Update note element with new content\n   * 3) Perform network request to submit the updated note using `axios.post`\n   *    a) If request is successfully completed\n   *        1. Show submitted Note element\n   *    b) If request failed\n   *        1. Revert Note element to original content\n   *        2. Show error Flash message about failure\n   */\n  updateComment(e) {\n    e.preventDefault();\n\n    // Get Form metadata\n    const $submitBtn = $(e.target);\n    const $form = $submitBtn.parents('form');\n    const $closeBtn = $form.find('.js-note-target-close');\n    const $editingNote = $form.parents('.note.is-editing');\n    const $noteBody = $editingNote.find('.js-task-list-container');\n    const $noteBodyText = $noteBody.find('.note-text');\n    const { formData, formContent, formAction } = this.getFormData($form);\n    const $diffFile = $form.closest('.diff-file');\n    const $notesContainer = $form.closest('.notes');\n\n    // Cache original comment content\n    const cachedNoteBodyText = $noteBodyText.html();\n\n    // Show updated comment content temporarily\n    $noteBodyText.html(formContent);\n    $editingNote\n      .removeClass('is-editing fade-in-full')\n      .addClass('being-posted fade-in-half');\n    $editingNote\n      .find('.note-headline-meta a')\n      .html(\n        '<i class=\"fa fa-spinner fa-spin\" aria-label=\"Comment is being updated\" aria-hidden=\"true\"></i>',\n      );\n\n    /* eslint-disable promise/catch-or-return */\n    // Make request to update comment on server\n    axios\n      .post(`${formAction}?html=true`, formData)\n      .then(({ data }) => {\n        // Submission successful! render final note element\n        this.updateNote(data, $editingNote);\n      })\n      .catch(() => {\n        // Submission failed, revert back to original note\n        $noteBodyText.html(_.escape(cachedNoteBodyText));\n        $editingNote.removeClass('being-posted fade-in');\n        $editingNote.find('.fa.fa-spinner').remove();\n\n        // Show Flash message about failure\n        this.updateNoteError();\n      });\n\n    return $closeBtn.text($closeBtn.data('originalText'));\n  }\n}\n\nwindow.Notes = Notes;\n","/*!\r\n  * Stickyfill – `position: sticky` polyfill\r\n  * v. 2.0.5 | https://github.com/wilddeer/stickyfill\r\n  * MIT License\r\n  */\r\n\r\n;(function(window, document) {\r\n    'use strict';\r\n    \r\n    /*\r\n     * 1. Check if the browser supports `position: sticky` natively or is too old to run the polyfill.\r\n     *    If either of these is the case set `seppuku` flag. It will be checked later to disable key features\r\n     *    of the polyfill, but the API will remain functional to avoid breaking things.\r\n     */\r\n    \r\n    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; }; }();\r\n    \r\n    function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\r\n    \r\n    var seppuku = false;\r\n    \r\n    // The polyfill cant’t function properly without `getComputedStyle`.\r\n    if (!window.getComputedStyle) seppuku = true;\r\n    // Dont’t get in a way if the browser supports `position: sticky` natively.\r\n    else {\r\n            var testNode = document.createElement('div');\r\n    \r\n            if (['', '-webkit-', '-moz-', '-ms-'].some(function (prefix) {\r\n                try {\r\n                    testNode.style.position = prefix + 'sticky';\r\n                } catch (e) {}\r\n    \r\n                return testNode.style.position != '';\r\n            })) seppuku = true;\r\n        }\r\n    \r\n    /*\r\n     * 2. “Global” vars used across the polyfill\r\n     */\r\n    \r\n    // Check if Shadow Root constructor exists to make further checks simpler\r\n    var shadowRootExists = typeof ShadowRoot !== 'undefined';\r\n    \r\n    // Last saved scroll position\r\n    var scroll = {\r\n        top: null,\r\n        left: null\r\n    };\r\n    \r\n    // Array of created Sticky instances\r\n    var stickies = [];\r\n    \r\n    /*\r\n     * 3. Utility functions\r\n     */\r\n    function extend(targetObj, sourceObject) {\r\n        for (var key in sourceObject) {\r\n            if (sourceObject.hasOwnProperty(key)) {\r\n                targetObj[key] = sourceObject[key];\r\n            }\r\n        }\r\n    }\r\n    \r\n    function parseNumeric(val) {\r\n        return parseFloat(val) || 0;\r\n    }\r\n    \r\n    function getDocOffsetTop(node) {\r\n        var docOffsetTop = 0;\r\n    \r\n        while (node) {\r\n            docOffsetTop += node.offsetTop;\r\n            node = node.offsetParent;\r\n        }\r\n    \r\n        return docOffsetTop;\r\n    }\r\n    \r\n    /*\r\n     * 4. Sticky class\r\n     */\r\n    \r\n    var Sticky = function () {\r\n        function Sticky(node) {\r\n            _classCallCheck(this, Sticky);\r\n    \r\n            if (!(node instanceof HTMLElement)) throw new Error('First argument must be HTMLElement');\r\n            if (stickies.some(function (sticky) {\r\n                return sticky._node === node;\r\n            })) throw new Error('Stickyfill is already applied to this node');\r\n    \r\n            this._node = node;\r\n            this._stickyMode = null;\r\n            this._active = false;\r\n    \r\n            stickies.push(this);\r\n    \r\n            this.refresh();\r\n        }\r\n    \r\n        _createClass(Sticky, [{\r\n            key: 'refresh',\r\n            value: function refresh() {\r\n                if (seppuku || this._removed) return;\r\n                if (this._active) this._deactivate();\r\n    \r\n                var node = this._node;\r\n    \r\n                /*\r\n                 * 1. Save node computed props\r\n                 */\r\n                var nodeComputedStyle = getComputedStyle(node);\r\n                var nodeComputedProps = {\r\n                    top: nodeComputedStyle.top,\r\n                    display: nodeComputedStyle.display,\r\n                    marginTop: nodeComputedStyle.marginTop,\r\n                    marginBottom: nodeComputedStyle.marginBottom,\r\n                    marginLeft: nodeComputedStyle.marginLeft,\r\n                    marginRight: nodeComputedStyle.marginRight,\r\n                    cssFloat: nodeComputedStyle.cssFloat\r\n                };\r\n    \r\n                /*\r\n                 * 2. Check if the node can be activated\r\n                 */\r\n                if (isNaN(parseFloat(nodeComputedProps.top)) || nodeComputedProps.display == 'table-cell' || nodeComputedProps.display == 'none') return;\r\n    \r\n                this._active = true;\r\n    \r\n                /*\r\n                 * 3. Get necessary node parameters\r\n                 */\r\n                var referenceNode = node.parentNode;\r\n                var parentNode = shadowRootExists && referenceNode instanceof ShadowRoot ? referenceNode.host : referenceNode;\r\n                var nodeWinOffset = node.getBoundingClientRect();\r\n                var parentWinOffset = parentNode.getBoundingClientRect();\r\n                var parentComputedStyle = getComputedStyle(parentNode);\r\n    \r\n                this._parent = {\r\n                    node: parentNode,\r\n                    styles: {\r\n                        position: parentNode.style.position\r\n                    },\r\n                    offsetHeight: parentNode.offsetHeight\r\n                };\r\n                this._offsetToWindow = {\r\n                    left: nodeWinOffset.left,\r\n                    right: document.documentElement.clientWidth - nodeWinOffset.right\r\n                };\r\n                this._offsetToParent = {\r\n                    top: nodeWinOffset.top - parentWinOffset.top - parseNumeric(parentComputedStyle.borderTopWidth),\r\n                    left: nodeWinOffset.left - parentWinOffset.left - parseNumeric(parentComputedStyle.borderLeftWidth),\r\n                    right: -nodeWinOffset.right + parentWinOffset.right - parseNumeric(parentComputedStyle.borderRightWidth)\r\n                };\r\n                this._styles = {\r\n                    position: node.style.position,\r\n                    top: node.style.top,\r\n                    bottom: node.style.bottom,\r\n                    left: node.style.left,\r\n                    right: node.style.right,\r\n                    width: node.style.width,\r\n                    marginTop: node.style.marginTop,\r\n                    marginLeft: node.style.marginLeft,\r\n                    marginRight: node.style.marginRight\r\n                };\r\n    \r\n                var nodeTopValue = parseNumeric(nodeComputedProps.top);\r\n                this._limits = {\r\n                    start: nodeWinOffset.top + window.pageYOffset - nodeTopValue,\r\n                    end: parentWinOffset.top + window.pageYOffset + parentNode.offsetHeight - parseNumeric(parentComputedStyle.borderBottomWidth) - node.offsetHeight - nodeTopValue - parseNumeric(nodeComputedProps.marginBottom)\r\n                };\r\n    \r\n                /*\r\n                 * 4. Ensure that the node will be positioned relatively to the parent node\r\n                 */\r\n                var parentPosition = parentComputedStyle.position;\r\n    \r\n                if (parentPosition != 'absolute' && parentPosition != 'relative') {\r\n                    parentNode.style.position = 'relative';\r\n                }\r\n    \r\n                /*\r\n                 * 5. Recalc node position.\r\n                 *    It’s important to do this before clone injection to avoid scrolling bug in Chrome.\r\n                 */\r\n                this._recalcPosition();\r\n    \r\n                /*\r\n                 * 6. Create a clone\r\n                 */\r\n                var clone = this._clone = {};\r\n                clone.node = document.createElement('div');\r\n    \r\n                // Apply styles to the clone\r\n                extend(clone.node.style, {\r\n                    width: nodeWinOffset.right - nodeWinOffset.left + 'px',\r\n                    height: nodeWinOffset.bottom - nodeWinOffset.top + 'px',\r\n                    marginTop: nodeComputedProps.marginTop,\r\n                    marginBottom: nodeComputedProps.marginBottom,\r\n                    marginLeft: nodeComputedProps.marginLeft,\r\n                    marginRight: nodeComputedProps.marginRight,\r\n                    cssFloat: nodeComputedProps.cssFloat,\r\n                    padding: 0,\r\n                    border: 0,\r\n                    borderSpacing: 0,\r\n                    fontSize: '1em',\r\n                    position: 'static'\r\n                });\r\n    \r\n                referenceNode.insertBefore(clone.node, node);\r\n                clone.docOffsetTop = getDocOffsetTop(clone.node);\r\n            }\r\n        }, {\r\n            key: '_recalcPosition',\r\n            value: function _recalcPosition() {\r\n                if (!this._active || this._removed) return;\r\n    \r\n                var stickyMode = scroll.top <= this._limits.start ? 'start' : scroll.top >= this._limits.end ? 'end' : 'middle';\r\n    \r\n                if (this._stickyMode == stickyMode) return;\r\n    \r\n                switch (stickyMode) {\r\n                    case 'start':\r\n                        extend(this._node.style, {\r\n                            position: 'absolute',\r\n                            left: this._offsetToParent.left + 'px',\r\n                            right: this._offsetToParent.right + 'px',\r\n                            top: this._offsetToParent.top + 'px',\r\n                            bottom: 'auto',\r\n                            width: 'auto',\r\n                            marginLeft: 0,\r\n                            marginRight: 0,\r\n                            marginTop: 0\r\n                        });\r\n                        break;\r\n    \r\n                    case 'middle':\r\n                        extend(this._node.style, {\r\n                            position: 'fixed',\r\n                            left: this._offsetToWindow.left + 'px',\r\n                            right: this._offsetToWindow.right + 'px',\r\n                            top: this._styles.top,\r\n                            bottom: 'auto',\r\n                            width: 'auto',\r\n                            marginLeft: 0,\r\n                            marginRight: 0,\r\n                            marginTop: 0\r\n                        });\r\n                        break;\r\n    \r\n                    case 'end':\r\n                        extend(this._node.style, {\r\n                            position: 'absolute',\r\n                            left: this._offsetToParent.left + 'px',\r\n                            right: this._offsetToParent.right + 'px',\r\n                            top: 'auto',\r\n                            bottom: 0,\r\n                            width: 'auto',\r\n                            marginLeft: 0,\r\n                            marginRight: 0\r\n                        });\r\n                        break;\r\n                }\r\n    \r\n                this._stickyMode = stickyMode;\r\n            }\r\n        }, {\r\n            key: '_fastCheck',\r\n            value: function _fastCheck() {\r\n                if (!this._active || this._removed) return;\r\n    \r\n                if (Math.abs(getDocOffsetTop(this._clone.node) - this._clone.docOffsetTop) > 1 || Math.abs(this._parent.node.offsetHeight - this._parent.offsetHeight) > 1) this.refresh();\r\n            }\r\n        }, {\r\n            key: '_deactivate',\r\n            value: function _deactivate() {\r\n                var _this = this;\r\n    \r\n                if (!this._active || this._removed) return;\r\n    \r\n                this._clone.node.parentNode.removeChild(this._clone.node);\r\n                delete this._clone;\r\n    \r\n                extend(this._node.style, this._styles);\r\n                delete this._styles;\r\n    \r\n                // Check whether element’s parent node is used by other stickies.\r\n                // If not, restore parent node’s styles.\r\n                if (!stickies.some(function (sticky) {\r\n                    return sticky !== _this && sticky._parent && sticky._parent.node === _this._parent.node;\r\n                })) {\r\n                    extend(this._parent.node.style, this._parent.styles);\r\n                }\r\n                delete this._parent;\r\n    \r\n                this._stickyMode = null;\r\n                this._active = false;\r\n    \r\n                delete this._offsetToWindow;\r\n                delete this._offsetToParent;\r\n                delete this._limits;\r\n            }\r\n        }, {\r\n            key: 'remove',\r\n            value: function remove() {\r\n                var _this2 = this;\r\n    \r\n                this._deactivate();\r\n    \r\n                stickies.some(function (sticky, index) {\r\n                    if (sticky._node === _this2._node) {\r\n                        stickies.splice(index, 1);\r\n                        return true;\r\n                    }\r\n                });\r\n    \r\n                this._removed = true;\r\n            }\r\n        }]);\r\n    \r\n        return Sticky;\r\n    }();\r\n    \r\n    /*\r\n     * 5. Stickyfill API\r\n     */\r\n    \r\n    \r\n    var Stickyfill = {\r\n        stickies: stickies,\r\n        Sticky: Sticky,\r\n    \r\n        addOne: function addOne(node) {\r\n            // Check whether it’s a node\r\n            if (!(node instanceof HTMLElement)) {\r\n                // Maybe it’s a node list of some sort?\r\n                // Take first node from the list then\r\n                if (node.length && node[0]) node = node[0];else return;\r\n            }\r\n    \r\n            // Check if Stickyfill is already applied to the node\r\n            // and return existing sticky\r\n            for (var i = 0; i < stickies.length; i++) {\r\n                if (stickies[i]._node === node) return stickies[i];\r\n            }\r\n    \r\n            // Create and return new sticky\r\n            return new Sticky(node);\r\n        },\r\n        add: function add(nodeList) {\r\n            // If it’s a node make an array of one node\r\n            if (nodeList instanceof HTMLElement) nodeList = [nodeList];\r\n            // Check if the argument is an iterable of some sort\r\n            if (!nodeList.length) return;\r\n    \r\n            // Add every element as a sticky and return an array of created Sticky instances\r\n            var addedStickies = [];\r\n    \r\n            var _loop = function _loop(i) {\r\n                var node = nodeList[i];\r\n    \r\n                // If it’s not an HTMLElement – create an empty element to preserve 1-to-1\r\n                // correlation with input list\r\n                if (!(node instanceof HTMLElement)) {\r\n                    addedStickies.push(void 0);\r\n                    return 'continue';\r\n                }\r\n    \r\n                // If Stickyfill is already applied to the node\r\n                // add existing sticky\r\n                if (stickies.some(function (sticky) {\r\n                    if (sticky._node === node) {\r\n                        addedStickies.push(sticky);\r\n                        return true;\r\n                    }\r\n                })) return 'continue';\r\n    \r\n                // Create and add new sticky\r\n                addedStickies.push(new Sticky(node));\r\n            };\r\n    \r\n            for (var i = 0; i < nodeList.length; i++) {\r\n                var _ret = _loop(i);\r\n    \r\n                if (_ret === 'continue') continue;\r\n            }\r\n    \r\n            return addedStickies;\r\n        },\r\n        refreshAll: function refreshAll() {\r\n            stickies.forEach(function (sticky) {\r\n                return sticky.refresh();\r\n            });\r\n        },\r\n        removeOne: function removeOne(node) {\r\n            // Check whether it’s a node\r\n            if (!(node instanceof HTMLElement)) {\r\n                // Maybe it’s a node list of some sort?\r\n                // Take first node from the list then\r\n                if (node.length && node[0]) node = node[0];else return;\r\n            }\r\n    \r\n            // Remove the stickies bound to the nodes in the list\r\n            stickies.some(function (sticky) {\r\n                if (sticky._node === node) {\r\n                    sticky.remove();\r\n                    return true;\r\n                }\r\n            });\r\n        },\r\n        remove: function remove(nodeList) {\r\n            // If it’s a node make an array of one node\r\n            if (nodeList instanceof HTMLElement) nodeList = [nodeList];\r\n            // Check if the argument is an iterable of some sort\r\n            if (!nodeList.length) return;\r\n    \r\n            // Remove the stickies bound to the nodes in the list\r\n    \r\n            var _loop2 = function _loop2(i) {\r\n                var node = nodeList[i];\r\n    \r\n                stickies.some(function (sticky) {\r\n                    if (sticky._node === node) {\r\n                        sticky.remove();\r\n                        return true;\r\n                    }\r\n                });\r\n            };\r\n    \r\n            for (var i = 0; i < nodeList.length; i++) {\r\n                _loop2(i);\r\n            }\r\n        },\r\n        removeAll: function removeAll() {\r\n            while (stickies.length) {\r\n                stickies[0].remove();\r\n            }\r\n        }\r\n    };\r\n    \r\n    /*\r\n     * 6. Setup events (unless the polyfill was disabled)\r\n     */\r\n    function init() {\r\n        // Watch for scroll position changes and trigger recalc/refresh if needed\r\n        function checkScroll() {\r\n            if (window.pageXOffset != scroll.left) {\r\n                scroll.top = window.pageYOffset;\r\n                scroll.left = window.pageXOffset;\r\n    \r\n                Stickyfill.refreshAll();\r\n            } else if (window.pageYOffset != scroll.top) {\r\n                scroll.top = window.pageYOffset;\r\n                scroll.left = window.pageXOffset;\r\n    \r\n                // recalc position for all stickies\r\n                stickies.forEach(function (sticky) {\r\n                    return sticky._recalcPosition();\r\n                });\r\n            }\r\n        }\r\n    \r\n        checkScroll();\r\n        window.addEventListener('scroll', checkScroll);\r\n    \r\n        // Watch for window resizes and device orientation changes and trigger refresh\r\n        window.addEventListener('resize', Stickyfill.refreshAll);\r\n        window.addEventListener('orientationchange', Stickyfill.refreshAll);\r\n    \r\n        //Fast dirty check for layout changes every 500ms\r\n        var fastCheckTimer = void 0;\r\n    \r\n        function startFastCheckTimer() {\r\n            fastCheckTimer = setInterval(function () {\r\n                stickies.forEach(function (sticky) {\r\n                    return sticky._fastCheck();\r\n                });\r\n            }, 500);\r\n        }\r\n    \r\n        function stopFastCheckTimer() {\r\n            clearInterval(fastCheckTimer);\r\n        }\r\n    \r\n        var docHiddenKey = void 0;\r\n        var visibilityChangeEventName = void 0;\r\n    \r\n        if ('hidden' in document) {\r\n            docHiddenKey = 'hidden';\r\n            visibilityChangeEventName = 'visibilitychange';\r\n        } else if ('webkitHidden' in document) {\r\n            docHiddenKey = 'webkitHidden';\r\n            visibilityChangeEventName = 'webkitvisibilitychange';\r\n        }\r\n    \r\n        if (visibilityChangeEventName) {\r\n            if (!document[docHiddenKey]) startFastCheckTimer();\r\n    \r\n            document.addEventListener(visibilityChangeEventName, function () {\r\n                if (document[docHiddenKey]) {\r\n                    stopFastCheckTimer();\r\n                } else {\r\n                    startFastCheckTimer();\r\n                }\r\n            });\r\n        } else startFastCheckTimer();\r\n    }\r\n    \r\n    if (!seppuku) init();\r\n    \r\n    /*\r\n     * 7. Expose Stickyfill\r\n     */\r\n    if (typeof module != 'undefined' && module.exports) {\r\n        module.exports = Stickyfill;\r\n    } else {\r\n        window.Stickyfill = Stickyfill;\r\n    }\r\n    \r\n})(window, document);","import StickyFill from 'stickyfilljs';\n\nexport const createPlaceholder = () => {\n  const placeholder = document.createElement('div');\n  placeholder.classList.add('sticky-placeholder');\n\n  return placeholder;\n};\n\nexport const isSticky = (el, scrollY, stickyTop, insertPlaceholder) => {\n  const top = Math.floor(el.offsetTop - scrollY);\n\n  if (top <= stickyTop && !el.classList.contains('is-stuck')) {\n    const placeholder = insertPlaceholder ? createPlaceholder() : null;\n    const heightBefore = el.offsetHeight;\n\n    el.classList.add('is-stuck');\n\n    if (insertPlaceholder) {\n      el.parentNode.insertBefore(placeholder, el.nextElementSibling);\n\n      placeholder.style.height = `${heightBefore - el.offsetHeight}px`;\n    }\n  } else if (top > stickyTop && el.classList.contains('is-stuck')) {\n    el.classList.remove('is-stuck');\n\n    if (insertPlaceholder && el.nextElementSibling && el.nextElementSibling.classList.contains('sticky-placeholder')) {\n      el.nextElementSibling.remove();\n    }\n  }\n};\n\n/**\n * Create a listener that will toggle a 'is-stuck' class, based on the current scroll position.\n *\n * - If the current environment does not support `position: sticky`, do nothing.\n *\n * @param {HTMLElement} el The `position: sticky` element.\n * @param {Number} stickyTop Used to determine when an element is stuck.\n * @param {Boolean} insertPlaceholder Should a placeholder element be created when element is stuck?\n */\nexport const stickyMonitor = (el, stickyTop, insertPlaceholder = true) => {\n  if (!el) return;\n\n  if (typeof CSS === 'undefined' || !(CSS.supports('(position: -webkit-sticky) or (position: sticky)'))) return;\n\n  document.addEventListener('scroll', () => isSticky(el, window.scrollY, stickyTop, insertPlaceholder), {\n    passive: true,\n  });\n};\n\n/**\n * Polyfill the `position: sticky` behavior.\n *\n * - If the current environment supports `position: sticky`, do nothing.\n * - Can receive an iterable element list (NodeList, jQuery collection, etc.) or single HTMLElement.\n */\nexport const polyfillSticky = (el) => {\n  StickyFill.add(el);\n};\n","import $ from 'jquery';\n\nexport default {\n  bind(el) {\n    $(el).tooltip({\n      trigger: 'hover',\n    });\n  },\n\n  componentUpdated(el) {\n    $(el).tooltip('_fixTitle');\n  },\n\n  unbind(el) {\n    $(el).tooltip('dispose');\n  },\n};\n","import Mousetrap from 'mousetrap';\nimport findAndFollowLink from './shortcuts_dashboard_navigation';\nimport Shortcuts from './shortcuts';\n\nexport default class ShortcutsNavigation extends Shortcuts {\n  constructor() {\n    super();\n\n    Mousetrap.bind('g p', () => findAndFollowLink('.shortcuts-project'));\n    Mousetrap.bind('g v', () => findAndFollowLink('.shortcuts-project-activity'));\n    Mousetrap.bind('g f', () => findAndFollowLink('.shortcuts-tree'));\n    Mousetrap.bind('g c', () => findAndFollowLink('.shortcuts-commits'));\n    Mousetrap.bind('g j', () => findAndFollowLink('.shortcuts-builds'));\n    Mousetrap.bind('g n', () => findAndFollowLink('.shortcuts-network'));\n    Mousetrap.bind('g d', () => findAndFollowLink('.shortcuts-repository-charts'));\n    Mousetrap.bind('g i', () => findAndFollowLink('.shortcuts-issues'));\n    Mousetrap.bind('g b', () => findAndFollowLink('.shortcuts-issue-boards'));\n    Mousetrap.bind('g m', () => findAndFollowLink('.shortcuts-merge_requests'));\n    Mousetrap.bind('g w', () => findAndFollowLink('.shortcuts-wiki'));\n    Mousetrap.bind('g s', () => findAndFollowLink('.shortcuts-snippets'));\n    Mousetrap.bind('g k', () => findAndFollowLink('.shortcuts-kubernetes'));\n    Mousetrap.bind('g e', () => findAndFollowLink('.shortcuts-environments'));\n    Mousetrap.bind('i', () => findAndFollowLink('.shortcuts-new-issue'));\n\n    this.enabledHelp.push('.hidden-shortcut.project');\n  }\n}\n","(function webpackUniversalModuleDefinition(root, factory) {\n\tif(typeof exports === 'object' && typeof module === 'object')\n\t\tmodule.exports = factory();\n\telse if(typeof define === 'function' && define.amd)\n\t\tdefine([], factory);\n\telse if(typeof exports === 'object')\n\t\texports[\"TaskList\"] = factory();\n\telse\n\t\troot[\"TaskList\"] = factory();\n})(this, function() {\nreturn /******/ (function(modules) { // webpackBootstrap\n/******/ \t// The module cache\n/******/ \tvar installedModules = {};\n/******/\n/******/ \t// The require function\n/******/ \tfunction __webpack_require__(moduleId) {\n/******/\n/******/ \t\t// Check if module is in cache\n/******/ \t\tif(installedModules[moduleId]) {\n/******/ \t\t\treturn installedModules[moduleId].exports;\n/******/ \t\t}\n/******/ \t\t// Create a new module (and put it into the cache)\n/******/ \t\tvar module = installedModules[moduleId] = {\n/******/ \t\t\ti: moduleId,\n/******/ \t\t\tl: false,\n/******/ \t\t\texports: {}\n/******/ \t\t};\n/******/\n/******/ \t\t// Execute the module function\n/******/ \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n/******/\n/******/ \t\t// Flag the module as loaded\n/******/ \t\tmodule.l = true;\n/******/\n/******/ \t\t// Return the exports of the module\n/******/ \t\treturn module.exports;\n/******/ \t}\n/******/\n/******/\n/******/ \t// expose the modules object (__webpack_modules__)\n/******/ \t__webpack_require__.m = modules;\n/******/\n/******/ \t// expose the module cache\n/******/ \t__webpack_require__.c = installedModules;\n/******/\n/******/ \t// identity function for calling harmony imports with the correct context\n/******/ \t__webpack_require__.i = function(value) { return value; };\n/******/\n/******/ \t// define getter function for harmony exports\n/******/ \t__webpack_require__.d = function(exports, name, getter) {\n/******/ \t\tif(!__webpack_require__.o(exports, name)) {\n/******/ \t\t\tObject.defineProperty(exports, name, {\n/******/ \t\t\t\tconfigurable: false,\n/******/ \t\t\t\tenumerable: true,\n/******/ \t\t\t\tget: getter\n/******/ \t\t\t});\n/******/ \t\t}\n/******/ \t};\n/******/\n/******/ \t// getDefaultExport function for compatibility with non-harmony modules\n/******/ \t__webpack_require__.n = function(module) {\n/******/ \t\tvar getter = module && module.__esModule ?\n/******/ \t\t\tfunction getDefault() { return module['default']; } :\n/******/ \t\t\tfunction getModuleExports() { return module; };\n/******/ \t\t__webpack_require__.d(getter, 'a', getter);\n/******/ \t\treturn getter;\n/******/ \t};\n/******/\n/******/ \t// Object.prototype.hasOwnProperty.call\n/******/ \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n/******/\n/******/ \t// __webpack_public_path__\n/******/ \t__webpack_require__.p = \"\";\n/******/\n/******/ \t// Load entry module and return exports\n/******/ \treturn __webpack_require__(__webpack_require__.s = 0);\n/******/ })\n/************************************************************************/\n/******/ ([\n/* 0 */\n/***/ (function(module, exports) {\n\nvar NodeArray, TaskList, closest, createEvent,\n  indexOf = [].indexOf || function(item) { for (var i = 0, l = this.length; i < l; i++) { if (i in this && this[i] === item) return i; } return -1; };\n\nNodeArray = function(nodeList) {\n  return Array.prototype.slice.apply(nodeList);\n};\n\nclosest = function(el, className) {\n  while (el && !el.classList.contains(className)) {\n    el = el.parentNode;\n  }\n  return el;\n};\n\ncreateEvent = function(eventName, detail) {\n  var event;\n  if (typeof Event === 'function') {\n    event = new Event(eventName, {\n      bubbles: true,\n      cancelable: true\n    });\n    event.detail = detail;\n  } else {\n    event = document.createEvent('CustomEvent');\n    event.initCustomEvent(eventName, true, true, detail);\n  }\n  return event;\n};\n\nTaskList = (function() {\n  function TaskList(el1) {\n    this.el = el1;\n    this.container = closest(this.el, 'js-task-list-container');\n    this.field = this.container.querySelector('.js-task-list-field');\n    this.container.addEventListener('change', (function(_this) {\n      return function(event) {\n        if (event.target.classList.contains('task-list-item-checkbox')) {\n          return _this.updateTaskList(event.target);\n        }\n      };\n    })(this));\n    this.enable();\n  }\n\n  TaskList.prototype.enable = function() {\n    var event;\n    if (this.container.querySelectorAll('.js-task-list-field').length > 0) {\n      NodeArray(this.container.querySelectorAll('.task-list-item')).forEach(function(item) {\n        return item.classList.add('enabled');\n      });\n      NodeArray(this.container.querySelectorAll('.task-list-item-checkbox')).forEach(function(checkbox) {\n        return checkbox.disabled = false;\n      });\n      this.container.classList.add('is-task-list-enabled');\n      event = createEvent('tasklist:enabled');\n      return this.container.dispatchEvent(event);\n    }\n  };\n\n  TaskList.prototype.disable = function() {\n    var event;\n    NodeArray(this.container.querySelectorAll('.task-list-item')).forEach(function(item) {\n      return item.classList.remove('enabled');\n    });\n    NodeArray(this.container.querySelectorAll('.task-list-item-checkbox')).forEach(function(checkbox) {\n      return checkbox.disabled = true;\n    });\n    this.container.classList.remove('is-task-list-enabled');\n    event = createEvent('tasklist:disabled');\n    return this.container.dispatchEvent(event);\n  };\n\n  TaskList.prototype.updateTaskList = function(item) {\n    var changeEvent, changedEvent, checkboxes, index;\n    checkboxes = this.container.querySelectorAll('.task-list-item-checkbox');\n    index = 1 + NodeArray(checkboxes).indexOf(item);\n    changeEvent = createEvent('tasklist:change', {\n      index: index,\n      checked: item.checked\n    });\n    this.field.dispatchEvent(changeEvent);\n    if (!changeEvent.defaultPrevented) {\n      this.field.value = TaskList.updateSource(this.field.value, index, item.checked);\n      changeEvent = createEvent('change');\n      this.field.dispatchEvent(changeEvent);\n      changedEvent = createEvent('tasklist:changed', {\n        index: index,\n        checked: item.checked\n      });\n      return this.field.dispatchEvent(changedEvent);\n    }\n  };\n\n  TaskList.incomplete = \"[ ]\";\n\n  TaskList.complete = \"[x]\";\n\n  TaskList.escapePattern = function(str) {\n    return str.replace(/([\\[\\]])/g, \"\\\\$1\").replace(/\\s/, \"\\\\s\").replace(\"x\", \"[xX]\");\n  };\n\n  TaskList.incompletePattern = RegExp(\"\" + (TaskList.escapePattern(TaskList.incomplete)));\n\n  TaskList.completePattern = RegExp(\"\" + (TaskList.escapePattern(TaskList.complete)));\n\n  TaskList.itemPattern = RegExp(\"^(?:\\\\s*(?:>\\\\s*)*(?:[-+*]|(?:\\\\d+\\\\.)))\\\\s*(\" + (TaskList.escapePattern(TaskList.complete)) + \"|\" + (TaskList.escapePattern(TaskList.incomplete)) + \")\\\\s+(?!\\\\(.*?\\\\))(?=(?:\\\\[.*?\\\\]\\\\s*(?:\\\\[.*?\\\\]|\\\\(.*?\\\\))\\\\s*)*(?:[^\\\\[]|$))\");\n\n  TaskList.startFencesPattern = /^`{3}.*$/;\n\n  TaskList.endFencesPattern = /^`{3}$/;\n\n  TaskList.itemsInParasPattern = RegExp(\"^(\" + (TaskList.escapePattern(TaskList.complete)) + \"|\" + (TaskList.escapePattern(TaskList.incomplete)) + \").+$\", \"g\");\n\n  TaskList.updateSource = function(source, itemIndex, checked) {\n    var clean, inCodeBlock, index, line, result;\n    clean = source.replace(/\\r/g, '').replace(this.itemsInParasPattern, '').split(\"\\n\");\n    index = 0;\n    inCodeBlock = false;\n    result = (function() {\n      var i, len, ref, results;\n      ref = source.split(\"\\n\");\n      results = [];\n      for (i = 0, len = ref.length; i < len; i++) {\n        line = ref[i];\n        if (inCodeBlock) {\n          if (line.match(this.endFencesPattern)) {\n            inCodeBlock = false;\n          }\n        } else if (line.match(this.startFencesPattern)) {\n          inCodeBlock = true;\n        } else if (indexOf.call(clean, line) >= 0 && line.match(this.itemPattern)) {\n          index += 1;\n          if (index === itemIndex) {\n            line = checked ? line.replace(this.incompletePattern, this.complete) : line.replace(this.completePattern, this.incomplete);\n          }\n        }\n        results.push(line);\n      }\n      return results;\n    }).call(this);\n    return result.join(\"\\n\");\n  };\n\n  return TaskList;\n\n})();\n\nif (typeof jQuery !== 'undefined') {\n  jQuery.fn.taskList = function(method) {\n    return this.each(function(index, el) {\n      var taskList;\n      taskList = jQuery(el).data('task-list');\n      if (!taskList) {\n        taskList = new TaskList(el);\n        jQuery(el).data('task-list', taskList);\n        if (!method || method === 'enable') {\n          return;\n        }\n      }\n      return taskList[method || 'enable']();\n    });\n  };\n}\n\nmodule.exports = TaskList;\n\n\n/***/ })\n/******/ ]);\n});","import $ from 'jquery';\nimport { stickyMonitor } from './lib/utils/sticky';\n\nexport default (stickyTop) => {\n  stickyMonitor(document.querySelector('.js-diff-files-changed'), stickyTop);\n\n  $('.js-diff-stats-dropdown').glDropdown({\n    filterable: true,\n    remoteFilter: false,\n  });\n};\n","import Notes from './notes';\n\nexport default () => {\n  const dataEl = document.querySelector('.js-notes-data');\n  const {\n    notesUrl,\n    notesIds,\n    now,\n    diffView,\n    autocomplete,\n  } = JSON.parse(dataEl.innerHTML);\n\n  // Create a singleton so that we don't need to assign\n  // into the window object, we can just access the current isntance with Notes.instance\n  Notes.initialize(notesUrl, notesIds, now, diffView, autocomplete);\n};\n","import $ from 'jquery';\nimport AccessorUtilities from './lib/utils/accessor';\n\nexport default class ProjectSelectComboButton {\n  constructor(select) {\n    this.projectSelectInput = $(select);\n    this.newItemBtn = $('.new-project-item-link');\n    this.resourceType = this.newItemBtn.data('type');\n    this.resourceLabel = this.newItemBtn.data('label');\n    this.formattedText = this.deriveTextVariants();\n    this.groupId = this.projectSelectInput.data('groupId');\n    this.bindEvents();\n    this.initLocalStorage();\n  }\n\n  bindEvents() {\n    this.projectSelectInput.siblings('.new-project-item-select-button')\n      .on('click', e => this.openDropdown(e));\n\n    this.newItemBtn.on('click', (e) => {\n      if (!this.getProjectFromLocalStorage()) {\n        e.preventDefault();\n        this.openDropdown(e);\n      }\n    });\n\n    this.projectSelectInput.on('change', () => this.selectProject());\n  }\n\n  initLocalStorage() {\n    const localStorageIsSafe = AccessorUtilities.isLocalStorageAccessSafe();\n\n    if (localStorageIsSafe) {\n      this.localStorageKey = ['group', this.groupId, this.formattedText.localStorageItemType, 'recent-project'].join('-');\n      this.setBtnTextFromLocalStorage();\n    }\n  }\n\n  // eslint-disable-next-line class-methods-use-this\n  openDropdown(event) {\n    $(event.currentTarget).siblings('.project-item-select').select2('open');\n  }\n\n  selectProject() {\n    const selectedProjectData = JSON.parse(this.projectSelectInput.val());\n    const projectUrl = `${selectedProjectData.url}/${this.projectSelectInput.data('relativePath')}`;\n    const projectName = selectedProjectData.name;\n\n    const projectMeta = {\n      url: projectUrl,\n      name: projectName,\n    };\n\n    this.setNewItemBtnAttributes(projectMeta);\n    this.setProjectInLocalStorage(projectMeta);\n  }\n\n  setBtnTextFromLocalStorage() {\n    const cachedProjectData = this.getProjectFromLocalStorage();\n\n    this.setNewItemBtnAttributes(cachedProjectData);\n  }\n\n  setNewItemBtnAttributes(project) {\n    if (project) {\n      this.newItemBtn.attr('href', project.url);\n      this.newItemBtn.text(`${this.formattedText.defaultTextPrefix} in ${project.name}`);\n    } else {\n      this.newItemBtn.text(`Select project to create ${this.formattedText.presetTextSuffix}`);\n    }\n  }\n\n  getProjectFromLocalStorage() {\n    const projectString = localStorage.getItem(this.localStorageKey);\n\n    return JSON.parse(projectString);\n  }\n\n  setProjectInLocalStorage(projectMeta) {\n    const projectString = JSON.stringify(projectMeta);\n\n    localStorage.setItem(this.localStorageKey, projectString);\n  }\n\n  deriveTextVariants() {\n    const defaultTextPrefix = this.resourceLabel;\n\n    // the trailing slice call depluralizes each of these strings (e.g. new-issues -> new-issue)\n    const localStorageItemType = `new-${this.resourceType.split('_').join('-').slice(0, -1)}`;\n    const presetTextSuffix = this.resourceType.split('_').join(' ').slice(0, -1);\n\n    return {\n      localStorageItemType, // new-issue / new-merge-request\n      defaultTextPrefix, // New issue / New merge request\n      presetTextSuffix, // issue / merge request\n    };\n  }\n}\n\n","/* eslint-disable func-names, space-before-function-paren, wrap-iife, prefer-arrow-callback, no-var, comma-dangle, object-shorthand, one-var, one-var-declaration-per-line, no-else-return, quotes, max-len */\n\nimport $ from 'jquery';\nimport Api from './api';\nimport ProjectSelectComboButton from './project_select_combo_button';\n\nexport default function projectSelect() {\n  $('.ajax-project-select').each(function(i, select) {\n    var placeholder;\n    const simpleFilter = $(select).data('simpleFilter') || false;\n    this.groupId = $(select).data('groupId');\n    this.includeGroups = $(select).data('includeGroups');\n    this.allProjects = $(select).data('allProjects') || false;\n    this.orderBy = $(select).data('orderBy') || 'id';\n    this.withIssuesEnabled = $(select).data('withIssuesEnabled');\n    this.withMergeRequestsEnabled = $(select).data('withMergeRequestsEnabled');\n\n    placeholder = \"Search for project\";\n    if (this.includeGroups) {\n      placeholder += \" or group\";\n    }\n\n    $(select).select2({\n      placeholder: placeholder,\n      minimumInputLength: 0,\n      query: (function (_this) {\n        return function (query) {\n          var finalCallback, projectsCallback;\n          finalCallback = function (projects) {\n            var data;\n            data = {\n              results: projects\n            };\n            return query.callback(data);\n          };\n          if (_this.includeGroups) {\n            projectsCallback = function (projects) {\n              var groupsCallback;\n              groupsCallback = function (groups) {\n                var data;\n                data = groups.concat(projects);\n                return finalCallback(data);\n              };\n              return Api.groups(query.term, {}, groupsCallback);\n            };\n          } else {\n            projectsCallback = finalCallback;\n          }\n          if (_this.groupId) {\n            return Api.groupProjects(_this.groupId, query.term, projectsCallback);\n          } else {\n            return Api.projects(query.term, {\n              order_by: _this.orderBy,\n              with_issues_enabled: _this.withIssuesEnabled,\n              with_merge_requests_enabled: _this.withMergeRequestsEnabled,\n              membership: !_this.allProjects,\n            }, projectsCallback);\n          }\n        };\n      })(this),\n      id: function(project) {\n        if (simpleFilter) return project.id;\n        return JSON.stringify({\n          name: project.name,\n          url: project.web_url,\n        });\n      },\n      text: function (project) {\n        return project.name_with_namespace || project.name;\n      },\n      dropdownCssClass: \"ajax-project-dropdown\"\n    });\n    if (simpleFilter) return select;\n    return new ProjectSelectComboButton(select);\n  });\n}\n","/* eslint-disable func-names, space-before-function-paren, no-var, consistent-return, no-new, prefer-arrow-callback, no-return-assign, one-var, one-var-declaration-per-line, object-shorthand, no-else-return, newline-per-chained-call, no-shadow, vars-on-top, prefer-template, max-len */\n\nimport $ from 'jquery';\nimport Cookies from 'js-cookie';\nimport { __ } from '~/locale';\nimport { visitUrl } from '~/lib/utils/url_utility';\nimport axios from '~/lib/utils/axios_utils';\nimport flash from '~/flash';\nimport projectSelect from '../../project_select';\n\nexport default class Project {\n  constructor() {\n    const $cloneOptions = $('ul.clone-options-dropdown');\n    const $projectCloneField = $('#project_clone');\n    const $cloneBtnText = $('a.clone-dropdown-btn span');\n\n    const selectedCloneOption = $cloneBtnText.text().trim();\n    if (selectedCloneOption.length > 0) {\n      $(`a:contains('${selectedCloneOption}')`, $cloneOptions).addClass('is-active');\n    }\n\n    $('a', $cloneOptions).on('click', (e) => {\n      const $this = $(e.currentTarget);\n      const url = $this.attr('href');\n      const activeText = $this.find('.dropdown-menu-inner-title').text();\n\n      e.preventDefault();\n\n      $('.is-active', $cloneOptions).not($this).removeClass('is-active');\n      $this.toggleClass('is-active');\n      $projectCloneField.val(url);\n      $cloneBtnText.text(activeText);\n\n      return $('.clone').text(url);\n    });\n    // Ref switcher\n    Project.initRefSwitcher();\n    $('.project-refs-select').on('change', function() {\n      return $(this).parents('form').submit();\n    });\n    $('.hide-no-ssh-message').on('click', function(e) {\n      Cookies.set('hide_no_ssh_message', 'false');\n      $(this).parents('.no-ssh-key-message').remove();\n      return e.preventDefault();\n    });\n    $('.hide-no-password-message').on('click', function(e) {\n      Cookies.set('hide_no_password_message', 'false');\n      $(this).parents('.no-password-message').remove();\n      return e.preventDefault();\n    });\n    Project.projectSelectDropdown();\n  }\n\n  static projectSelectDropdown() {\n    projectSelect();\n    $('.project-item-select').on('click', e => Project.changeProject($(e.currentTarget).val()));\n  }\n\n  static changeProject(url) {\n    return window.location = url;\n  }\n\n  static initRefSwitcher() {\n    var refListItem = document.createElement('li');\n    var refLink = document.createElement('a');\n\n    refLink.href = '#';\n\n    return $('.js-project-refs-dropdown').each(function() {\n      var $dropdown, selected;\n      $dropdown = $(this);\n      selected = $dropdown.data('selected');\n      return $dropdown.glDropdown({\n        data(term, callback) {\n          axios.get($dropdown.data('refsUrl'), {\n            params: {\n              ref: $dropdown.data('ref'),\n              search: term,\n            },\n          })\n          .then(({ data }) => callback(data))\n          .catch(() => flash(__('An error occurred while getting projects')));\n        },\n        selectable: true,\n        filterable: true,\n        filterRemote: true,\n        filterByText: true,\n        inputFieldName: $dropdown.data('inputFieldName'),\n        fieldName: $dropdown.data('fieldName'),\n        renderRow: function(ref) {\n          var li = refListItem.cloneNode(false);\n\n          if (ref.header != null) {\n            li.className = 'dropdown-header';\n            li.textContent = ref.header;\n          } else {\n            var link = refLink.cloneNode(false);\n\n            if (ref === selected) {\n              link.className = 'is-active';\n            }\n\n            link.textContent = ref;\n            link.dataset.ref = ref;\n\n            li.appendChild(link);\n          }\n\n          return li;\n        },\n        id: function(obj, $el) {\n          return $el.attr('data-ref');\n        },\n        toggleLabel: function(obj, $el) {\n          return $el.text().trim();\n        },\n        clicked: function(options) {\n          const { e } = options;\n          e.preventDefault();\n          if ($('input[name=\"ref\"]').length) {\n            var $form = $dropdown.closest('form');\n\n            var $visit = $dropdown.data('visit');\n            var shouldVisit = $visit ? true : $visit;\n            var action = $form.attr('action');\n            var divider = action.indexOf('?') === -1 ? '?' : '&';\n            if (shouldVisit) {\n              visitUrl(`${action}${divider}${$form.serialize()}`);\n            }\n          }\n        },\n      });\n    });\n  }\n}\n","/* eslint-disable object-shorthand, func-names, guard-for-in, no-restricted-syntax, comma-dangle, no-param-reassign, max-len */\n\nwindow.DiscussionMixins = {\n  computed: {\n    discussionCount: function () {\n      return Object.keys(this.discussions).length;\n    },\n    resolvedDiscussionCount: function () {\n      let resolvedCount = 0;\n\n      for (const discussionId in this.discussions) {\n        const discussion = this.discussions[discussionId];\n\n        if (discussion.isResolved()) {\n          resolvedCount += 1;\n        }\n      }\n\n      return resolvedCount;\n    },\n    unresolvedDiscussionCount: function () {\n      let unresolvedCount = 0;\n\n      for (const discussionId in this.discussions) {\n        const discussion = this.discussions[discussionId];\n\n        if (!discussion.isResolved()) {\n          unresolvedCount += 1;\n        }\n      }\n\n      return unresolvedCount;\n    }\n  }\n};\n","import Project from './project';\nimport ShortcutsNavigation from '../../shortcuts_navigation';\n\ndocument.addEventListener('DOMContentLoaded', () => {\n  new Project(); // eslint-disable-line no-new\n  new ShortcutsNavigation(); // eslint-disable-line no-new\n});\n","/* eslint-disable space-before-function-paren, camelcase, guard-for-in, no-restricted-syntax, no-unused-vars, max-len */\n/* global NoteModel */\n\nimport $ from 'jquery';\nimport Vue from 'vue';\nimport { localTimeAgo } from '../../lib/utils/datetime_utility';\n\nclass DiscussionModel {\n  constructor (discussionId) {\n    this.id = discussionId;\n    this.notes = {};\n    this.loading = false;\n    this.canResolve = false;\n  }\n\n  createNote (noteObj) {\n    Vue.set(this.notes, noteObj.noteId, new NoteModel(this.id, noteObj));\n  }\n\n  deleteNote (noteId) {\n    Vue.delete(this.notes, noteId);\n  }\n\n  getNote (noteId) {\n    return this.notes[noteId];\n  }\n\n  notesCount() {\n    return Object.keys(this.notes).length;\n  }\n\n  isResolved () {\n    for (const noteId in this.notes) {\n      const note = this.notes[noteId];\n\n      if (!note.resolved) {\n        return false;\n      }\n    }\n    return true;\n  }\n\n  resolveAllNotes (resolved_by) {\n    for (const noteId in this.notes) {\n      const note = this.notes[noteId];\n\n      if (!note.resolved) {\n        note.resolved = true;\n        note.resolved_by = resolved_by;\n      }\n    }\n  }\n\n  unResolveAllNotes () {\n    for (const noteId in this.notes) {\n      const note = this.notes[noteId];\n\n      if (note.resolved) {\n        note.resolved = false;\n        note.resolved_by = null;\n      }\n    }\n  }\n\n  updateHeadline (data) {\n    const discussionSelector = `.discussion[data-discussion-id=\"${this.id}\"]`;\n    const $discussionHeadline = $(`${discussionSelector} .js-discussion-headline`);\n\n    if (data.discussion_headline_html) {\n      if ($discussionHeadline.length) {\n        $discussionHeadline.replaceWith(data.discussion_headline_html);\n      } else {\n        $(`${discussionSelector} .discussion-header`).append(data.discussion_headline_html);\n      }\n\n      localTimeAgo($('.js-timeago', `${discussionSelector}`));\n    } else {\n      $discussionHeadline.remove();\n    }\n  }\n\n  isResolvable () {\n    if (!this.canResolve) {\n      return false;\n    }\n\n    for (const noteId in this.notes) {\n      const note = this.notes[noteId];\n\n      if (note.canResolve) {\n        return true;\n      }\n    }\n\n    return false;\n  }\n}\n\nwindow.DiscussionModel = DiscussionModel;\n","/* eslint-disable object-shorthand, func-names, camelcase, no-restricted-syntax, guard-for-in, comma-dangle, max-len, no-param-reassign */\n/* global DiscussionModel */\n\nimport Vue from 'vue';\n\nwindow.CommentsStore = {\n  state: {},\n  get: function (discussionId, noteId) {\n    return this.state[discussionId].getNote(noteId);\n  },\n  createDiscussion: function (discussionId, canResolve) {\n    let discussion = this.state[discussionId];\n    if (!this.state[discussionId]) {\n      discussion = new DiscussionModel(discussionId);\n      Vue.set(this.state, discussionId, discussion);\n    }\n\n    if (canResolve !== undefined) {\n      discussion.canResolve = canResolve;\n    }\n\n    return discussion;\n  },\n  create: function (noteObj) {\n    const discussion = this.createDiscussion(noteObj.discussionId);\n\n    discussion.createNote(noteObj);\n  },\n  update: function (discussionId, noteId, resolved, resolved_by) {\n    const discussion = this.state[discussionId];\n    const note = discussion.getNote(noteId);\n    note.resolved = resolved;\n    note.resolved_by = resolved_by;\n  },\n  delete: function (discussionId, noteId) {\n    const discussion = this.state[discussionId];\n    discussion.deleteNote(noteId);\n\n    if (discussion.notesCount() === 0) {\n      Vue.delete(this.state, discussionId);\n    }\n  },\n  unresolvedDiscussionIds: function () {\n    const ids = [];\n\n    for (const discussionId in this.state) {\n      const discussion = this.state[discussionId];\n\n      if (!discussion.isResolved()) {\n        ids.push(discussion.id);\n      }\n    }\n\n    return ids;\n  }\n};\n","/* global CommentsStore */\n\nimport Vue from 'vue';\nimport Flash from '../../flash';\nimport '../../vue_shared/vue_resource_interceptor';\n\nwindow.gl = window.gl || {};\n\nclass ResolveServiceClass {\n  constructor(root) {\n    this.noteResource = Vue.resource(`${root}/notes{/noteId}/resolve?html=true`);\n    this.discussionResource = Vue.resource(`${root}/merge_requests{/mergeRequestId}/discussions{/discussionId}/resolve?html=true`);\n  }\n\n  resolve(noteId) {\n    return this.noteResource.save({ noteId }, {});\n  }\n\n  unresolve(noteId) {\n    return this.noteResource.delete({ noteId }, {});\n  }\n\n  toggleResolveForDiscussion(mergeRequestId, discussionId) {\n    const discussion = CommentsStore.state[discussionId];\n    const isResolved = discussion.isResolved();\n    let promise;\n\n    if (isResolved) {\n      promise = this.unResolveAll(mergeRequestId, discussionId);\n    } else {\n      promise = this.resolveAll(mergeRequestId, discussionId);\n    }\n\n    promise\n      .then(resp => resp.json())\n      .then((data) => {\n        discussion.loading = false;\n        const resolvedBy = data ? data.resolved_by : null;\n\n        if (isResolved) {\n          discussion.unResolveAllNotes();\n        } else {\n          discussion.resolveAllNotes(resolvedBy);\n        }\n\n        if (gl.mrWidget) gl.mrWidget.checkStatus();\n        discussion.updateHeadline(data);\n        document.dispatchEvent(new CustomEvent('refreshVueNotes'));\n      })\n      .catch(() => new Flash('An error occurred when trying to resolve a discussion. Please try again.'));\n  }\n\n  resolveAll(mergeRequestId, discussionId) {\n    const discussion = CommentsStore.state[discussionId];\n\n    discussion.loading = true;\n\n    return this.discussionResource.save({\n      mergeRequestId,\n      discussionId,\n    }, {});\n  }\n\n  unResolveAll(mergeRequestId, discussionId) {\n    const discussion = CommentsStore.state[discussionId];\n\n    discussion.loading = true;\n\n    return this.discussionResource.delete({\n      mergeRequestId,\n      discussionId,\n    }, {});\n  }\n}\n\ngl.DiffNotesResolveServiceClass = ResolveServiceClass;\n","/* eslint-disable comma-dangle, object-shorthand, func-names, no-else-return, quotes, no-lonely-if, max-len */\n/* global CommentsStore */\n\nimport $ from 'jquery';\nimport Vue from 'vue';\n\nconst CommentAndResolveBtn = Vue.extend({\n  props: {\n    discussionId: String,\n  },\n  data() {\n    return {\n      textareaIsEmpty: true,\n      discussion: {},\n    };\n  },\n  computed: {\n    showButton: function () {\n      if (this.discussion) {\n        return this.discussion.isResolvable();\n      } else {\n        return false;\n      }\n    },\n    isDiscussionResolved: function () {\n      return this.discussion.isResolved();\n    },\n    buttonText: function () {\n      if (this.isDiscussionResolved) {\n        if (this.textareaIsEmpty) {\n          return \"Unresolve discussion\";\n        } else {\n          return \"Comment & unresolve discussion\";\n        }\n      } else {\n        if (this.textareaIsEmpty) {\n          return \"Resolve discussion\";\n        } else {\n          return \"Comment & resolve discussion\";\n        }\n      }\n    }\n  },\n  created() {\n    if (this.discussionId) {\n      this.discussion = CommentsStore.state[this.discussionId];\n    }\n  },\n  mounted: function () {\n    if (!this.discussionId) return;\n\n    const $textarea = $(`.js-discussion-note-form[data-discussion-id=${this.discussionId}] .note-textarea`);\n    this.textareaIsEmpty = $textarea.val() === '';\n\n    $textarea.on('input.comment-and-resolve-btn', () => {\n      this.textareaIsEmpty = $textarea.val() === '';\n    });\n  },\n  destroyed: function () {\n    if (!this.discussionId) return;\n\n    $(`.js-discussion-note-form[data-discussion-id=${this.discussionId}] .note-textarea`).off('input.comment-and-resolve-btn');\n  }\n});\n\nVue.component('comment-and-resolve-btn', CommentAndResolveBtn);\n","/* eslint-disable comma-dangle, object-shorthand, func-names, no-else-return, guard-for-in, no-restricted-syntax, one-var, space-before-function-paren, no-lonely-if, no-continue, brace-style, max-len, quotes */\n/* global DiscussionMixins */\n/* global CommentsStore */\n\nimport $ from 'jquery';\nimport Vue from 'vue';\n\nimport '../mixins/discussion';\n\nconst JumpToDiscussion = Vue.extend({\n  mixins: [DiscussionMixins],\n  props: {\n    discussionId: String\n  },\n  data: function () {\n    return {\n      discussions: CommentsStore.state,\n      discussion: {},\n    };\n  },\n  computed: {\n    buttonText: function () {\n      if (this.discussionId) {\n        return 'Jump to next unresolved discussion';\n      } else {\n        return 'Jump to first unresolved discussion';\n      }\n    },\n    allResolved: function () {\n      return this.unresolvedDiscussionCount === 0;\n    },\n    showButton: function () {\n      if (this.discussionId) {\n        if (this.unresolvedDiscussionCount > 1) {\n          return true;\n        } else {\n          return this.discussionId !== this.lastResolvedId;\n        }\n      } else {\n        return this.unresolvedDiscussionCount >= 1;\n      }\n    },\n    lastResolvedId: function () {\n      let lastId;\n      for (const discussionId in this.discussions) {\n        const discussion = this.discussions[discussionId];\n\n        if (!discussion.isResolved()) {\n          lastId = discussion.id;\n        }\n      }\n      return lastId;\n    }\n  },\n  methods: {\n    jumpToNextUnresolvedDiscussion: function () {\n      let discussionsSelector;\n      let discussionIdsInScope;\n      let firstUnresolvedDiscussionId;\n      let nextUnresolvedDiscussionId;\n      let activeTab = window.mrTabs.currentAction;\n      let hasDiscussionsToJumpTo = true;\n      let jumpToFirstDiscussion = !this.discussionId;\n\n      const discussionIdsForElements = function(elements) {\n        return elements.map(function() {\n          return $(this).attr('data-discussion-id');\n        }).toArray();\n      };\n\n      const discussions = this.discussions;\n\n      if (activeTab === 'diffs') {\n        discussionsSelector = '.diffs .notes[data-discussion-id]';\n        discussionIdsInScope = discussionIdsForElements($(discussionsSelector));\n\n        let unresolvedDiscussionCount = 0;\n\n        for (let i = 0; i < discussionIdsInScope.length; i += 1) {\n          const discussionId = discussionIdsInScope[i];\n          const discussion = discussions[discussionId];\n          if (discussion && !discussion.isResolved()) {\n            unresolvedDiscussionCount += 1;\n          }\n        }\n\n        if (this.discussionId && !this.discussion.isResolved()) {\n          // If this is the last unresolved discussion on the diffs tab,\n          // there are no discussions to jump to.\n          if (unresolvedDiscussionCount === 1) {\n            hasDiscussionsToJumpTo = false;\n          }\n        } else {\n          // If there are no unresolved discussions on the diffs tab at all,\n          // there are no discussions to jump to.\n          if (unresolvedDiscussionCount === 0) {\n            hasDiscussionsToJumpTo = false;\n          }\n        }\n      } else if (activeTab !== 'show') {\n        // If we are on the commits or builds tabs,\n        // there are no discussions to jump to.\n        hasDiscussionsToJumpTo = false;\n      }\n\n      if (!hasDiscussionsToJumpTo) {\n        // If there are no discussions to jump to on the current page,\n        // switch to the notes tab and jump to the first disucssion there.\n        window.mrTabs.activateTab('show');\n        activeTab = 'show';\n        jumpToFirstDiscussion = true;\n      }\n\n      if (activeTab === 'show') {\n        discussionsSelector = '.discussion[data-discussion-id]';\n        discussionIdsInScope = discussionIdsForElements($(discussionsSelector));\n      }\n\n      let currentDiscussionFound = false;\n      for (let i = 0; i < discussionIdsInScope.length; i += 1) {\n        const discussionId = discussionIdsInScope[i];\n        const discussion = discussions[discussionId];\n\n        if (!discussion) {\n          // Discussions for comments on commits in this MR don't have a resolved status.\n          continue;\n        }\n\n        if (!firstUnresolvedDiscussionId && !discussion.isResolved()) {\n          firstUnresolvedDiscussionId = discussionId;\n\n          if (jumpToFirstDiscussion) {\n            break;\n          }\n        }\n\n        if (!jumpToFirstDiscussion) {\n          if (currentDiscussionFound) {\n            if (!discussion.isResolved()) {\n              nextUnresolvedDiscussionId = discussionId;\n              break;\n            }\n            else {\n              continue;\n            }\n          }\n\n          if (discussionId === this.discussionId) {\n            currentDiscussionFound = true;\n          }\n        }\n      }\n\n      nextUnresolvedDiscussionId = nextUnresolvedDiscussionId || firstUnresolvedDiscussionId;\n\n      if (!nextUnresolvedDiscussionId) {\n        return;\n      }\n\n      let $target = $(`${discussionsSelector}[data-discussion-id=\"${nextUnresolvedDiscussionId}\"]`);\n\n      if (activeTab === 'show') {\n        $target = $target.closest('.note-discussion');\n\n        // If the next discussion is closed, toggle it open.\n        if ($target.find('.js-toggle-content').is(':hidden')) {\n          $target.find('.js-toggle-button i').trigger('click');\n        }\n      } else if (activeTab === 'diffs') {\n        // Resolved discussions are hidden in the diffs tab by default.\n        // If they are marked unresolved on the notes tab, they will still be hidden on the diffs tab.\n        // When jumping between unresolved discussions on the diffs tab, we show them.\n        $target.closest(\".content\").show();\n\n        const $notesHolder = $target.closest(\"tr.notes_holder\");\n\n        // Image diff discussions does not use notes_holder\n        // so we should keep original $target value in those cases\n        if ($notesHolder.length > 0) {\n          $target = $notesHolder;\n        }\n\n        $target.show();\n\n        // If we are on the diffs tab, we don't scroll to the discussion itself, but to\n        // 4 diff lines above it: the line the discussion was in response to + 3 context\n        let prevEl;\n        for (let i = 0; i < 4; i += 1) {\n          prevEl = $target.prev();\n\n          // If the discussion doesn't have 4 lines above it, we'll have to do with fewer.\n          if (!prevEl.hasClass(\"line_holder\")) {\n            break;\n          }\n\n          $target = prevEl;\n        }\n      }\n\n      $.scrollTo($target, {\n        offset: -150\n      });\n    }\n  },\n  created() {\n    this.discussion = this.discussions[this.discussionId];\n  },\n});\n\nVue.component('jump-to-discussion', JumpToDiscussion);\n","/* eslint-disable comma-dangle, object-shorthand, func-names, quote-props, no-else-return, camelcase, max-len */\n/* global CommentsStore */\n/* global ResolveService */\n\nimport $ from 'jquery';\nimport Vue from 'vue';\nimport Flash from '../../flash';\n\nconst ResolveBtn = Vue.extend({\n  props: {\n    noteId: Number,\n    discussionId: String,\n    resolved: Boolean,\n    canResolve: Boolean,\n    resolvedBy: String,\n    authorName: String,\n    authorAvatar: String,\n    noteTruncated: String,\n  },\n  data: function () {\n    return {\n      discussions: CommentsStore.state,\n      loading: false\n    };\n  },\n  watch: {\n    'discussions': {\n      handler: 'updateTooltip',\n      deep: true\n    }\n  },\n  computed: {\n    discussion: function () {\n      return this.discussions[this.discussionId];\n    },\n    note: function () {\n      return this.discussion ? this.discussion.getNote(this.noteId) : {};\n    },\n    buttonText: function () {\n      if (this.isResolved) {\n        return `Resolved by ${this.resolvedByName}`;\n      } else if (this.canResolve) {\n        return 'Mark as resolved';\n      } else {\n        return 'Unable to resolve';\n      }\n    },\n    isResolved: function () {\n      if (this.note) {\n        return this.note.resolved;\n      } else {\n        return false;\n      }\n    },\n    resolvedByName: function () {\n      return this.note.resolved_by;\n    },\n  },\n  methods: {\n    updateTooltip: function () {\n      this.$nextTick(() => {\n        $(this.$refs.button)\n          .tooltip('hide')\n          .tooltip('_fixTitle');\n      });\n    },\n    resolve: function () {\n      if (!this.canResolve) return;\n\n      let promise;\n      this.loading = true;\n\n      if (this.isResolved) {\n        promise = ResolveService\n          .unresolve(this.noteId);\n      } else {\n        promise = ResolveService\n          .resolve(this.noteId);\n      }\n\n      promise\n        .then(resp => resp.json())\n        .then((data) => {\n          this.loading = false;\n\n          const resolved_by = data ? data.resolved_by : null;\n\n          CommentsStore.update(this.discussionId, this.noteId, !this.isResolved, resolved_by);\n          this.discussion.updateHeadline(data);\n          gl.mrWidget.checkStatus();\n          document.dispatchEvent(new CustomEvent('refreshVueNotes'));\n\n          this.updateTooltip();\n        })\n        .catch(() => new Flash('An error occurred when trying to resolve a comment. Please try again.'));\n    }\n  },\n  mounted: function () {\n    $(this.$refs.button).tooltip({\n      container: 'body'\n    });\n  },\n  beforeDestroy: function () {\n    CommentsStore.delete(this.discussionId, this.noteId);\n  },\n  created: function () {\n    CommentsStore.create({\n      discussionId: this.discussionId,\n      noteId: this.noteId,\n      canResolve: this.canResolve,\n      resolved: this.resolved,\n      resolvedBy: this.resolvedBy,\n      authorName: this.authorName,\n      authorAvatar: this.authorAvatar,\n      noteTruncated: this.noteTruncated,\n    });\n  }\n});\n\nVue.component('resolve-btn', ResolveBtn);\n","/* eslint-disable comma-dangle, object-shorthand, func-names, no-param-reassign */\n/* global DiscussionMixins */\n/* global CommentsStore */\n\nimport Vue from 'vue';\n\nimport '../mixins/discussion';\n\nwindow.ResolveCount = Vue.extend({\n  mixins: [DiscussionMixins],\n  props: {\n    loggedOut: Boolean\n  },\n  data: function () {\n    return {\n      discussions: CommentsStore.state\n    };\n  },\n  computed: {\n    allResolved: function () {\n      return this.resolvedDiscussionCount === this.discussionCount;\n    },\n    resolvedCountText() {\n      return this.discussionCount === 1 ? 'discussion' : 'discussions';\n    }\n  }\n});\n","/* eslint-disable object-shorthand, func-names, space-before-function-paren, comma-dangle, no-else-return, quotes, max-len */\n/* global CommentsStore */\n/* global ResolveService */\n\nimport Vue from 'vue';\n\nconst ResolveDiscussionBtn = Vue.extend({\n  props: {\n    discussionId: String,\n    mergeRequestId: Number,\n    canResolve: Boolean,\n  },\n  data: function() {\n    return {\n      discussion: {},\n    };\n  },\n  computed: {\n    showButton: function () {\n      if (this.discussion) {\n        return this.discussion.isResolvable();\n      } else {\n        return false;\n      }\n    },\n    isDiscussionResolved: function () {\n      if (this.discussion) {\n        return this.discussion.isResolved();\n      } else {\n        return false;\n      }\n    },\n    buttonText: function () {\n      if (this.isDiscussionResolved) {\n        return \"Unresolve discussion\";\n      } else {\n        return \"Resolve discussion\";\n      }\n    },\n    loading: function () {\n      if (this.discussion) {\n        return this.discussion.loading;\n      } else {\n        return false;\n      }\n    }\n  },\n  methods: {\n    resolve: function () {\n      ResolveService.toggleResolveForDiscussion(this.mergeRequestId, this.discussionId);\n    }\n  },\n  created: function () {\n    CommentsStore.createDiscussion(this.discussionId, this.canResolve);\n\n    this.discussion = CommentsStore.state[this.discussionId];\n  }\n});\n\nVue.component('resolve-discussion-btn', ResolveDiscussionBtn);\n","/* global CommentsStore */\n\nimport $ from 'jquery';\nimport Vue from 'vue';\nimport collapseIcon from '../icons/collapse_icon.svg';\nimport Notes from '../../notes';\nimport userAvatarImage from '../../vue_shared/components/user_avatar/user_avatar_image.vue';\n\nconst DiffNoteAvatars = Vue.extend({\n  props: ['discussionId'],\n  data() {\n    return {\n      isVisible: false,\n      lineType: '',\n      storeState: CommentsStore.state,\n      shownAvatars: 3,\n      collapseIcon,\n    };\n  },\n  components: {\n    userAvatarImage,\n  },\n  template: `\n    <div class=\"diff-comment-avatar-holders\"\n      :class=\"discussionClassName\"\n      v-show=\"notesCount !== 0\">\n      <div v-if=\"!isVisible\">\n        <!-- FIXME: Pass an alt attribute here for accessibility -->\n        <user-avatar-image\n          v-for=\"note in notesSubset\"\n          :key=\"note.id\"\n          class=\"diff-comment-avatar js-diff-comment-avatar\"\n          @click.native=\"clickedAvatar($event)\"\n          :img-src=\"note.authorAvatar\"\n          :tooltip-text=\"getTooltipText(note)\"\n          :data-line-type=\"lineType\"\n          :size=\"19\"\n          data-html=\"true\"\n        />\n        <span v-if=\"notesCount > shownAvatars\"\n          class=\"diff-comments-more-count has-tooltip js-diff-comment-avatar\"\n          data-container=\"body\"\n          data-placement=\"top\"\n          ref=\"extraComments\"\n          role=\"button\"\n          :data-line-type=\"lineType\"\n          :title=\"extraNotesTitle\"\n          @click=\"clickedAvatar($event)\">{{ moreText }}</span>\n      </div>\n      <button class=\"diff-notes-collapse js-diff-comment-avatar\"\n        type=\"button\"\n        aria-label=\"Show comments\"\n        :data-line-type=\"lineType\"\n        @click=\"clickedAvatar($event)\"\n        v-if=\"isVisible\"\n        v-html=\"collapseIcon\">\n      </button>\n    </div>\n  `,\n  mounted() {\n    this.$nextTick(() => {\n      this.addNoCommentClass();\n      this.setDiscussionVisible();\n\n      this.lineType = $(this.$el).closest('.diff-line-num').hasClass('old_line') ? 'old' : 'new';\n    });\n\n    $(document).on('toggle.comments', () => {\n      this.$nextTick(() => {\n        this.setDiscussionVisible();\n      });\n    });\n  },\n  beforeDestroy() {\n    this.addNoCommentClass();\n    $(document).off('toggle.comments');\n  },\n  watch: {\n    storeState: {\n      handler() {\n        this.$nextTick(() => {\n          $('.has-tooltip', this.$el).tooltip('_fixTitle');\n\n          // We need to add/remove a class to an element that is outside the Vue instance\n          this.addNoCommentClass();\n        });\n      },\n      deep: true,\n    },\n  },\n  computed: {\n    discussionClassName() {\n      return `js-diff-avatars-${this.discussionId}`;\n    },\n    notesSubset() {\n      let notes = [];\n\n      if (this.discussion) {\n        notes = Object.keys(this.discussion.notes)\n          .slice(0, this.shownAvatars)\n          .map(noteId => this.discussion.notes[noteId]);\n      }\n\n      return notes;\n    },\n    extraNotesTitle() {\n      if (this.discussion) {\n        const extra = this.discussion.notesCount() - this.shownAvatars;\n\n        return `${extra} more comment${extra > 1 ? 's' : ''}`;\n      }\n\n      return '';\n    },\n    discussion() {\n      return this.storeState[this.discussionId];\n    },\n    notesCount() {\n      if (this.discussion) {\n        return this.discussion.notesCount();\n      }\n\n      return 0;\n    },\n    moreText() {\n      const plusSign = this.notesCount < 100 ? '+' : '';\n\n      return `${plusSign}${this.notesCount - this.shownAvatars}`;\n    },\n  },\n  methods: {\n    clickedAvatar(e) {\n      Notes.instance.onAddDiffNote(e);\n\n      // Toggle the active state of the toggle all button\n      this.toggleDiscussionsToggleState();\n\n      this.$nextTick(() => {\n        this.setDiscussionVisible();\n\n        $('.has-tooltip', this.$el).tooltip('_fixTitle');\n        $('.has-tooltip', this.$el).tooltip('hide');\n      });\n    },\n    addNoCommentClass() {\n      const notesCount = this.notesCount;\n\n      $(this.$el).closest('.js-avatar-container')\n        .toggleClass('no-comment-btn', notesCount > 0)\n        .nextUntil('.js-avatar-container')\n        .toggleClass('no-comment-btn', notesCount > 0);\n    },\n    toggleDiscussionsToggleState() {\n      const $notesHolders = $(this.$el).closest('.code').find('.notes_holder');\n      const $visibleNotesHolders = $notesHolders.filter(':visible');\n      const $toggleDiffCommentsBtn = $(this.$el).closest('.diff-file').find('.js-toggle-diff-comments');\n\n      $toggleDiffCommentsBtn.toggleClass('active', $notesHolders.length === $visibleNotesHolders.length);\n    },\n    setDiscussionVisible() {\n      this.isVisible = $(`.diffs .notes[data-discussion-id=\"${this.discussion.id}\"]`).is(':visible');\n    },\n    getTooltipText(note) {\n      return `${note.authorName}: ${note.noteTruncated}`;\n    },\n  },\n});\n\nVue.component('diff-note-avatars', DiffNoteAvatars);\n","/* global CommentsStore */\n\nimport Vue from 'vue';\n\nconst NewIssueForDiscussion = Vue.extend({\n  props: {\n    discussionId: {\n      type: String,\n      required: true,\n    },\n  },\n  data() {\n    return {\n      discussions: CommentsStore.state,\n    };\n  },\n  computed: {\n    discussion() {\n      return this.discussions[this.discussionId];\n    },\n    showButton() {\n      if (this.discussion) return !this.discussion.isResolved();\n      return false;\n    },\n  },\n});\n\nVue.component('new-issue-for-discussion-btn', NewIssueForDiscussion);\n","/* eslint-disable func-names, comma-dangle, new-cap, no-new, max-len */\n/* global ResolveCount */\n\nimport $ from 'jquery';\nimport Vue from 'vue';\nimport './models/discussion';\nimport './models/note';\nimport './stores/comments';\nimport './services/resolve';\nimport './mixins/discussion';\nimport './components/comment_resolve_btn';\nimport './components/jump_to_discussion';\nimport './components/resolve_btn';\nimport './components/resolve_count';\nimport './components/resolve_discussion_btn';\nimport './components/diff_note_avatars';\nimport './components/new_issue_for_discussion';\nimport { hasVueMRDiscussionsCookie } from '../lib/utils/common_utils';\n\nexport default () => {\n  const projectPathHolder = document.querySelector('.merge-request') || document.querySelector('.commit-box');\n  const projectPath = projectPathHolder.dataset.projectPath;\n  const COMPONENT_SELECTOR = 'resolve-btn, resolve-discussion-btn, jump-to-discussion, comment-and-resolve-btn, new-issue-for-discussion-btn';\n\n  window.gl = window.gl || {};\n  window.gl.diffNoteApps = {};\n\n  window.ResolveService = new gl.DiffNotesResolveServiceClass(projectPath);\n\n  gl.diffNotesCompileComponents = () => {\n    $('diff-note-avatars').each(function () {\n      const tmp = Vue.extend({\n        template: $(this).get(0).outerHTML\n      });\n      const tmpApp = new tmp().$mount();\n\n      $(this).replaceWith(tmpApp.$el);\n      $(tmpApp.$el).one('remove.vue', () => {\n        tmpApp.$destroy();\n        tmpApp.$el.remove();\n      });\n    });\n\n    const $components = $(COMPONENT_SELECTOR).filter(function () {\n      return $(this).closest('resolve-count').length !== 1;\n    });\n\n    if ($components) {\n      $components.each(function () {\n        const $this = $(this);\n        const noteId = $this.attr(':note-id');\n        const discussionId = $this.attr(':discussion-id');\n\n        if ($this.is('comment-and-resolve-btn') && !discussionId) return;\n\n        const tmp = Vue.extend({\n          template: $this.get(0).outerHTML\n        });\n        const tmpApp = new tmp().$mount();\n\n        if (noteId) {\n          gl.diffNoteApps[`note_${noteId}`] = tmpApp;\n        }\n\n        $this.replaceWith(tmpApp.$el);\n      });\n    }\n  };\n\n  gl.diffNotesCompileComponents();\n\n  const resolveCountAppEl = document.querySelector('#resolve-count-app');\n  if (!hasVueMRDiscussionsCookie() && resolveCountAppEl) {\n    new Vue({\n      el: resolveCountAppEl,\n      components: {\n        'resolve-count': ResolveCount\n      },\n    });\n  }\n\n  $(window).trigger('resize.nav');\n};\n","module.exports = \"<svg width=\\\"11\\\" height=\\\"11\\\" viewBox=\\\"0 0 9 13\\\"><path d=\\\"M2.57568253,6.49866948 C2.50548852,6.57199715 2.44637866,6.59708255 2.39835118,6.57392645 C2.3503237,6.55077034 2.32631032,6.48902165 2.32631032,6.38867852 L2.32631032,-2.13272614 C2.32631032,-2.23306927 2.3503237,-2.29481796 2.39835118,-2.31797406 C2.44637866,-2.34113017 2.50548852,-2.31604477 2.57568253,-2.24271709 L6.51022184,1.86747129 C6.53977721,1.8983461 6.56379059,1.93500939 6.5822627,1.97746225 L6.5822627,2.27849013 C6.56379059,2.31708364 6.53977721,2.35374693 6.51022184,2.38848109 L2.57568253,6.49866948 Z\\\" transform=\\\"translate(4.454287, 2.127976) rotate(90.000000) translate(-4.454287, -2.127976) \\\"></path><path d=\\\"M3.74312342,2.09553332 C3.74312342,1.99519019 3.77821989,1.9083561 3.8484139,1.83502843 C3.91860791,1.76170075 4.00173115,1.72503747 4.09778611,1.72503747 L4.80711151,1.72503747 C4.90316647,1.72503747 4.98628971,1.76170075 5.05648372,1.83502843 C5.12667773,1.9083561 5.16177421,1.99519019 5.16177421,2.09553332 L5.16177421,10.2464421 C5.16177421,10.3467853 5.12667773,10.4336194 5.05648372,10.506947 C4.98628971,10.5802747 4.90316647,10.616938 4.80711151,10.616938 L4.09778611,10.616938 C4.00173115,10.616938 3.91860791,10.5802747 3.8484139,10.506947 C3.77821989,10.4336194 3.74312342,10.3467853 3.74312342,10.2464421 L3.74312342,2.09553332 Z\\\" transform=\\\"translate(4.452449, 6.170988) rotate(-90.000000) translate(-4.452449, -6.170988) \\\"></path><path d=\\\"M2.57568253,14.6236695 C2.50548852,14.6969971 2.44637866,14.7220826 2.39835118,14.6989264 C2.3503237,14.6757703 2.32631032,14.6140216 2.32631032,14.5136785 L2.32631032,5.99227386 C2.32631032,5.89193073 2.3503237,5.83018204 2.39835118,5.80702594 C2.44637866,5.78386983 2.50548852,5.80895523 2.57568253,5.88228291 L6.51022184,9.99247129 C6.53977721,10.0233461 6.56379059,10.0600094 6.5822627,10.1024622 L6.5822627,10.4034901 C6.56379059,10.4420836 6.53977721,10.4787469 6.51022184,10.5134811 L2.57568253,14.6236695 Z\\\" transform=\\\"translate(4.454287, 10.252976) scale(1, -1) rotate(90.000000) translate(-4.454287, -10.252976) \\\"></path></svg>\\n\"","import $ from 'jquery';\nimport flash from './flash';\nimport axios from './lib/utils/axios_utils';\n\n/**\n * In each pipelines table we have a mini pipeline graph for each pipeline.\n *\n * When we click in a pipeline stage, we need to make an API call to get the\n * builds list to render in a dropdown.\n *\n * The container should be the table element.\n *\n * The stage icon clicked needs to have the following HTML structure:\n * <div class=\"dropdown\">\n *   <button class=\"dropdown js-builds-dropdown-button\" data-toggle=\"dropdown\"></button>\n *   <div class=\"js-builds-dropdown-container dropdown-menu\"></div>\n * </div>\n */\n\nexport default class MiniPipelineGraph {\n  constructor(opts = {}) {\n    this.container = opts.container || '';\n    this.dropdownListSelector = '.js-builds-dropdown-container';\n    this.getBuildsList = this.getBuildsList.bind(this);\n  }\n\n  /**\n   * Adds the event listener when the dropdown is opened.\n   * All dropdown events are fired at the .dropdown-menu's parent element.\n   */\n  bindEvents() {\n    $(document)\n      .off('shown.bs.dropdown', this.container)\n      .on('shown.bs.dropdown', this.container, this.getBuildsList);\n  }\n\n  /**\n   * When the user right clicks or cmd/ctrl + click in the job name\n   * the dropdown should not be closed and the link should open in another tab,\n   * so we stop propagation of the click event inside the dropdown.\n   *\n   * Since this component is rendered multiple times per page we need to guarantee we only\n   * target the click event of this component.\n   */\n  stopDropdownClickPropagation() {\n    $(document).on(\n      'click',\n      `${this.container} .js-builds-dropdown-list a.mini-pipeline-graph-dropdown-item`,\n      (e) => {\n        e.stopPropagation();\n      },\n    );\n  }\n\n  /**\n   * For the clicked stage, renders the given data in the dropdown list.\n   *\n   * @param  {HTMLElement} stageContainer\n   * @param  {Object} data\n   */\n  renderBuildsList(stageContainer, data) {\n    const dropdownContainer = stageContainer.parentElement.querySelector(\n      `${this.dropdownListSelector} .js-builds-dropdown-list ul`,\n    );\n\n    dropdownContainer.innerHTML = data;\n  }\n\n  /**\n   * For the clicked stage, gets the list of builds.\n   *\n   * All dropdown events have a relatedTarget property,\n   * whose value is the toggling anchor element.\n   *\n   * @param  {Object} e bootstrap dropdown event\n   * @return {Promise}\n   */\n  getBuildsList(e) {\n    const button = e.relatedTarget;\n    const endpoint = button.dataset.stageEndpoint;\n\n    this.renderBuildsList(button, '');\n    this.toggleLoading(button);\n\n    axios.get(endpoint)\n      .then(({ data }) => {\n        this.toggleLoading(button);\n        this.renderBuildsList(button, data.html);\n        this.stopDropdownClickPropagation();\n      })\n      .catch(() => {\n        this.toggleLoading(button);\n        if ($(button).parent().hasClass('open')) {\n          $(button).dropdown('toggle');\n        }\n        flash('An error occurred while fetching the builds.', 'alert');\n      });\n  }\n\n  /**\n   * Toggles the visibility of the loading icon.\n   *\n   * @param  {HTMLElement} stageContainer\n   * @return {type}\n   */\n  toggleLoading(stageContainer) {\n    stageContainer.parentElement.querySelector(\n      `${this.dropdownListSelector} .js-builds-dropdown-loading`,\n    ).classList.toggle('hidden');\n  }\n}\n","/* eslint-disable camelcase, no-unused-vars */\n\nclass NoteModel {\n  constructor(discussionId, noteObj) {\n    this.discussionId = discussionId;\n    this.id = noteObj.noteId;\n    this.canResolve = noteObj.canResolve;\n    this.resolved = noteObj.resolved;\n    this.resolved_by = noteObj.resolvedBy;\n    this.authorName = noteObj.authorName;\n    this.authorAvatar = noteObj.authorAvatar;\n    this.noteTruncated = noteObj.noteTruncated;\n  }\n}\n\nwindow.NoteModel = NoteModel;\n","/* global Flash */\n\nimport $ from 'jquery';\nimport axios from './lib/utils/axios_utils';\nimport { n__, s__ } from './locale';\n\nexport function getHeaderText(childElementCount, mergeRequestCount) {\n  if (childElementCount === 0) {\n    return `${mergeRequestCount} ${n__('merge request', 'merge requests', mergeRequestCount)}`;\n  }\n  return ',';\n}\n\nexport function createHeader(childElementCount, mergeRequestCount) {\n  const headerText = getHeaderText(childElementCount, mergeRequestCount);\n\n  return $('<span />', {\n    class: 'append-right-5',\n    text: headerText,\n  });\n}\n\nexport function createLink(mergeRequest) {\n  return $('<a />', {\n    class: 'append-right-5',\n    href: mergeRequest.path,\n    text: `!${mergeRequest.iid}`,\n  });\n}\n\nexport function createTitle(mergeRequest) {\n  return $('<span />', {\n    text: mergeRequest.title,\n  });\n}\n\nexport function createItem(mergeRequest) {\n  const $item = $('<span />');\n  const $link = createLink(mergeRequest);\n  const $title = createTitle(mergeRequest);\n  $item.append($link);\n  $item.append($title);\n\n  return $item;\n}\n\nexport function createContent(mergeRequests) {\n  const $content = $('<span />');\n\n  if (mergeRequests.length === 0) {\n    $content.text(s__('Commits|No related merge requests found'));\n  } else {\n    mergeRequests.forEach((mergeRequest) => {\n      const $header = createHeader($content.children().length, mergeRequests.length);\n      const $item = createItem(mergeRequest);\n      $content.append($header);\n      $content.append($item);\n    });\n  }\n\n  return $content;\n}\n\nexport function fetchCommitMergeRequests() {\n  const $container = $('.merge-requests');\n\n  axios.get($container.data('projectCommitPath'))\n    .then((response) => {\n      const $content = createContent(response.data);\n\n      $container.html($content);\n    })\n    .catch(() => Flash(s__('Commits|An error occurred while fetching merge requests data.')));\n}\n","/* eslint-disable no-new */\n\nimport $ from 'jquery';\nimport Diff from '~/diff';\nimport ZenMode from '~/zen_mode';\nimport ShortcutsNavigation from '~/shortcuts_navigation';\nimport MiniPipelineGraph from '~/mini_pipeline_graph_dropdown';\nimport initNotes from '~/init_notes';\nimport initChangesDropdown from '~/init_changes_dropdown';\nimport initDiffNotes from '~/diff_notes/diff_notes_bundle';\nimport { fetchCommitMergeRequests } from '~/commit_merge_requests';\n\ndocument.addEventListener('DOMContentLoaded', () => {\n  new Diff();\n  new ZenMode();\n  new ShortcutsNavigation();\n  new MiniPipelineGraph({\n    container: '.js-commit-pipeline-graph',\n  }).bindEvents();\n  initNotes();\n  const stickyBarPaddingTop = 16;\n  initChangesDropdown(document.querySelector('.navbar-gitlab').offsetHeight - stickyBarPaddingTop);\n  $('.commit-info.branches').load(document.querySelector('.js-commit-box').dataset.commitPath);\n  fetchCommitMergeRequests();\n  initDiffNotes();\n});\n","import $ from 'jquery';\nimport Dropzone from 'dropzone';\nimport _ from 'underscore';\nimport './preview_markdown';\nimport csrf from './lib/utils/csrf';\nimport axios from './lib/utils/axios_utils';\n\nDropzone.autoDiscover = false;\n\nexport default function dropzoneInput(form) {\n  const divHover = '<div class=\"div-dropzone-hover\"></div>';\n  const iconPaperclip = '<i class=\"fa fa-paperclip div-dropzone-icon\"></i>';\n  const $attachButton = form.find('.button-attach-file');\n  const $attachingFileMessage = form.find('.attaching-file-message');\n  const $cancelButton = form.find('.button-cancel-uploading-files');\n  const $retryLink = form.find('.retry-uploading-link');\n  const $uploadProgress = form.find('.uploading-progress');\n  const $uploadingErrorContainer = form.find('.uploading-error-container');\n  const $uploadingErrorMessage = form.find('.uploading-error-message');\n  const $uploadingProgressContainer = form.find('.uploading-progress-container');\n  const uploadsPath = window.uploads_path || null;\n  const maxFileSize = gon.max_file_size || 10;\n  const formTextarea = form.find('.js-gfm-input');\n  let handlePaste;\n  let pasteText;\n  let addFileToForm;\n  let updateAttachingMessage;\n  let isImage;\n  let getFilename;\n  let uploadFile;\n\n  formTextarea.wrap('<div class=\"div-dropzone\"></div>');\n  formTextarea.on('paste', event => handlePaste(event));\n\n  // Add dropzone area to the form.\n  const $mdArea = formTextarea.closest('.md-area');\n  form.setupMarkdownPreview();\n  const $formDropzone = form.find('.div-dropzone');\n  $formDropzone.parent().addClass('div-dropzone-wrapper');\n  $formDropzone.append(divHover);\n  $formDropzone.find('.div-dropzone-hover').append(iconPaperclip);\n\n  if (!uploadsPath) {\n    $formDropzone.addClass('js-invalid-dropzone');\n    return;\n  }\n\n  const dropzone = $formDropzone.dropzone({\n    url: uploadsPath,\n    dictDefaultMessage: '',\n    clickable: true,\n    paramName: 'file',\n    maxFilesize: maxFileSize,\n    uploadMultiple: false,\n    headers: csrf.headers,\n    previewContainer: false,\n    processing: () => $('.div-dropzone-alert').alert('close'),\n    dragover: () => {\n      $mdArea.addClass('is-dropzone-hover');\n      form.find('.div-dropzone-hover').css('opacity', 0.7);\n    },\n    dragleave: () => {\n      $mdArea.removeClass('is-dropzone-hover');\n      form.find('.div-dropzone-hover').css('opacity', 0);\n    },\n    drop: () => {\n      $mdArea.removeClass('is-dropzone-hover');\n      form.find('.div-dropzone-hover').css('opacity', 0);\n      formTextarea.focus();\n    },\n    success(header, response) {\n      const processingFileCount = this.getQueuedFiles().length + this.getUploadingFiles().length;\n      const shouldPad = processingFileCount >= 1;\n\n      pasteText(response.link.markdown, shouldPad);\n      // Show 'Attach a file' link only when all files have been uploaded.\n      if (!processingFileCount) $attachButton.removeClass('hide');\n      addFileToForm(response.link.url);\n    },\n    error: (file, errorMessage = 'Attaching the file failed.', xhr) => {\n      // If 'error' event is fired by dropzone, the second parameter is error message.\n      // If the 'errorMessage' parameter is empty, the default error message is set.\n      // If the 'error' event is fired by backend (xhr) error response, the third parameter is\n      // xhr object (xhr.responseText is error message).\n      // On error we hide the 'Attach' and 'Cancel' buttons\n      // and show an error.\n\n      // If there's xhr error message, let's show it instead of dropzone's one.\n      const message = xhr ? xhr.responseText : errorMessage;\n\n      $uploadingErrorContainer.removeClass('hide');\n      $uploadingErrorMessage.html(message);\n      $attachButton.addClass('hide');\n      $cancelButton.addClass('hide');\n    },\n    totaluploadprogress(totalUploadProgress) {\n      updateAttachingMessage(this.files, $attachingFileMessage);\n      $uploadProgress.text(`${Math.round(totalUploadProgress)}%`);\n    },\n    sending: () => {\n      // DOM elements already exist.\n      // Instead of dynamically generating them,\n      // we just either hide or show them.\n      $attachButton.addClass('hide');\n      $uploadingErrorContainer.addClass('hide');\n      $uploadingProgressContainer.removeClass('hide');\n      $cancelButton.removeClass('hide');\n    },\n    removedfile: () => {\n      $attachButton.removeClass('hide');\n      $cancelButton.addClass('hide');\n      $uploadingProgressContainer.addClass('hide');\n      $uploadingErrorContainer.addClass('hide');\n    },\n    queuecomplete: () => {\n      $('.dz-preview').remove();\n      $('.markdown-area').trigger('input');\n\n      $uploadingProgressContainer.addClass('hide');\n      $cancelButton.addClass('hide');\n    },\n  });\n\n  const child = $(dropzone[0]).children('textarea');\n\n  // removeAllFiles(true) stops uploading files (if any)\n  // and remove them from dropzone files queue.\n  $cancelButton.on('click', (e) => {\n    e.preventDefault();\n    e.stopPropagation();\n    Dropzone.forElement($formDropzone.get(0)).removeAllFiles(true);\n  });\n\n  // If 'error' event is fired, we store a failed files,\n  // clear dropzone files queue, change status of failed files to undefined,\n  // and add that files to the dropzone files queue again.\n  // addFile() adds file to dropzone files queue and upload it.\n  $retryLink.on('click', (e) => {\n    const dropzoneInstance = Dropzone.forElement(e.target.closest('.js-main-target-form').querySelector('.div-dropzone'));\n    const failedFiles = dropzoneInstance.files;\n\n    e.preventDefault();\n\n    // 'true' parameter of removeAllFiles() cancels\n    // uploading of files that are being uploaded at the moment.\n    dropzoneInstance.removeAllFiles(true);\n\n    failedFiles.map((failedFile) => {\n      const file = failedFile;\n\n      if (file.status === Dropzone.ERROR) {\n        file.status = undefined;\n        file.accepted = undefined;\n      }\n\n      return dropzoneInstance.addFile(file);\n    });\n  });\n  // eslint-disable-next-line consistent-return\n  handlePaste = (event) => {\n    const pasteEvent = event.originalEvent;\n    if (pasteEvent.clipboardData && pasteEvent.clipboardData.items) {\n      const image = isImage(pasteEvent);\n      if (image) {\n        event.preventDefault();\n        const filename = getFilename(pasteEvent) || 'image.png';\n        const text = `{{${filename}}}`;\n        pasteText(text);\n        return uploadFile(image.getAsFile(), filename);\n      }\n    }\n  };\n\n  isImage = (data) => {\n    let i = 0;\n    while (i < data.clipboardData.items.length) {\n      const item = data.clipboardData.items[i];\n      if (item.type.indexOf('image') !== -1) {\n        return item;\n      }\n      i += 1;\n    }\n    return false;\n  };\n\n  pasteText = (text, shouldPad) => {\n    let formattedText = text;\n    if (shouldPad) {\n      formattedText += '\\n\\n';\n    }\n    const textarea = child.get(0);\n    const caretStart = textarea.selectionStart;\n    const caretEnd = textarea.selectionEnd;\n    const textEnd = $(child).val().length;\n    const beforeSelection = $(child).val().substring(0, caretStart);\n    const afterSelection = $(child).val().substring(caretEnd, textEnd);\n    $(child).val(beforeSelection + formattedText + afterSelection);\n    textarea.setSelectionRange(caretStart + formattedText.length, caretEnd + formattedText.length);\n    textarea.style.height = `${textarea.scrollHeight}px`;\n    formTextarea.get(0).dispatchEvent(new Event('input'));\n    return formTextarea.trigger('input');\n  };\n\n  addFileToForm = (path) => {\n    $(form).append(`<input type=\"hidden\" name=\"files[]\" value=\"${_.escape(path)}\">`);\n  };\n\n  getFilename = (e) => {\n    let value;\n    if (window.clipboardData && window.clipboardData.getData) {\n      value = window.clipboardData.getData('Text');\n    } else if (e.clipboardData && e.clipboardData.getData) {\n      value = e.clipboardData.getData('text/plain');\n    }\n    value = value.split('\\r');\n    return value[0];\n  };\n\n  const showSpinner = () => $uploadingProgressContainer.removeClass('hide');\n\n  const closeSpinner = () => $uploadingProgressContainer.addClass('hide');\n\n  const showError = (message) => {\n    $uploadingErrorContainer.removeClass('hide');\n    $uploadingErrorMessage.html(message);\n  };\n\n  const closeAlertMessage = () => form.find('.div-dropzone-alert').alert('close');\n\n  const insertToTextArea = (filename, url) => {\n    const $child = $(child);\n    $child.val((index, val) => val.replace(`{{${filename}}}`, url));\n\n    $child.trigger('change');\n  };\n\n  uploadFile = (item, filename) => {\n    const formData = new FormData();\n    formData.append('file', item, filename);\n\n    showSpinner();\n    closeAlertMessage();\n\n    axios.post(uploadsPath, formData)\n      .then(({ data }) => {\n        const md = data.link.markdown;\n\n        insertToTextArea(filename, md);\n        closeSpinner();\n      })\n      .catch((e) => {\n        showError(e.response.data.message);\n        closeSpinner();\n      });\n  };\n\n  updateAttachingMessage = (files, messageContainer) => {\n    let attachingMessage;\n    const filesCount = files.filter(file => file.status === 'uploading' || file.status === 'queued').length;\n\n    // Dinamycally change uploading files text depending on files number in\n    // dropzone files queue.\n    if (filesCount > 1) {\n      attachingMessage = `Attaching ${filesCount} files -`;\n    } else {\n      attachingMessage = 'Attaching a file -';\n    }\n\n    messageContainer.text(attachingMessage);\n  };\n\n  form.find('.markdown-selector').click(function onMarkdownClick(e) {\n    e.preventDefault();\n    $(this).closest('.gfm-form').find('.div-dropzone').click();\n    formTextarea.focus();\n  });\n}\n","/* eslint-disable import/prefer-default-export, func-names, space-before-function-paren, wrap-iife, no-var, no-param-reassign, no-cond-assign, quotes, one-var, one-var-declaration-per-line, operator-assignment, no-else-return, prefer-template, prefer-arrow-callback, no-empty, max-len, consistent-return, no-unused-vars, no-return-assign, max-len, vars-on-top */\nimport $ from 'jquery';\nimport { insertText } from '~/lib/utils/common_utils';\n\nfunction selectedText(text, textarea) {\n  return text.substring(textarea.selectionStart, textarea.selectionEnd);\n}\n\nfunction lineBefore(text, textarea) {\n  var split;\n  split = text.substring(0, textarea.selectionStart).trim().split('\\n');\n  return split[split.length - 1];\n}\n\nfunction lineAfter(text, textarea) {\n  return text.substring(textarea.selectionEnd).trim().split('\\n')[0];\n}\n\nfunction blockTagText(text, textArea, blockTag, selected) {\n  const before = lineBefore(text, textArea);\n  const after = lineAfter(text, textArea);\n  if (before === blockTag && after === blockTag) {\n    // To remove the block tag we have to select the line before & after\n    if (blockTag != null) {\n      textArea.selectionStart = textArea.selectionStart - (blockTag.length + 1);\n      textArea.selectionEnd = textArea.selectionEnd + (blockTag.length + 1);\n    }\n    return selected;\n  } else {\n    return blockTag + \"\\n\" + selected + \"\\n\" + blockTag;\n  }\n}\n\nfunction moveCursor(textArea, tag, wrapped, removedLastNewLine) {\n  var pos;\n  if (!textArea.setSelectionRange) {\n    return;\n  }\n  if (textArea.selectionStart === textArea.selectionEnd) {\n    if (wrapped) {\n      pos = textArea.selectionStart - tag.length;\n    } else {\n      pos = textArea.selectionStart;\n    }\n\n    if (removedLastNewLine) {\n      pos -= 1;\n    }\n\n    return textArea.setSelectionRange(pos, pos);\n  }\n}\n\nexport function insertMarkdownText(textArea, text, tag, blockTag, selected, wrap) {\n  var textToInsert, inserted, selectedSplit, startChar, removedLastNewLine, removedFirstNewLine, currentLineEmpty, lastNewLine;\n  removedLastNewLine = false;\n  removedFirstNewLine = false;\n  currentLineEmpty = false;\n\n  // Remove the first newline\n  if (selected.indexOf('\\n') === 0) {\n    removedFirstNewLine = true;\n    selected = selected.replace(/\\n+/, '');\n  }\n\n  // Remove the last newline\n  if (textArea.selectionEnd - textArea.selectionStart > selected.replace(/\\n$/, '').length) {\n    removedLastNewLine = true;\n    selected = selected.replace(/\\n$/, '');\n  }\n\n  selectedSplit = selected.split('\\n');\n\n  if (!wrap) {\n    lastNewLine = textArea.value.substr(0, textArea.selectionStart).lastIndexOf('\\n');\n\n    // Check whether the current line is empty or consists only of spaces(=handle as empty)\n    if (/^\\s*$/.test(textArea.value.substring(lastNewLine, textArea.selectionStart))) {\n      currentLineEmpty = true;\n    }\n  }\n\n  startChar = !wrap && !currentLineEmpty && textArea.selectionStart > 0 ? '\\n' : '';\n\n  if (selectedSplit.length > 1 && (!wrap || (blockTag != null && blockTag !== ''))) {\n    if (blockTag != null && blockTag !== '') {\n      textToInsert = blockTagText(text, textArea, blockTag, selected);\n    } else {\n      textToInsert = selectedSplit.map(function(val) {\n        if (val.indexOf(tag) === 0) {\n          return \"\" + (val.replace(tag, ''));\n        } else {\n          return \"\" + tag + val;\n        }\n      }).join('\\n');\n    }\n  } else {\n    textToInsert = \"\" + startChar + tag + selected + (wrap ? tag : ' ');\n  }\n\n  if (removedFirstNewLine) {\n    textToInsert = '\\n' + textToInsert;\n  }\n\n  if (removedLastNewLine) {\n    textToInsert += '\\n';\n  }\n\n  insertText(textArea, textToInsert);\n  return moveCursor(textArea, tag, wrap, removedLastNewLine);\n}\n\nfunction updateText(textArea, tag, blockTag, wrap) {\n  var $textArea, selected, text;\n  $textArea = $(textArea);\n  textArea = $textArea.get(0);\n  text = $textArea.val();\n  selected = selectedText(text, textArea);\n  $textArea.focus();\n  return insertMarkdownText(textArea, text, tag, blockTag, selected, wrap);\n}\n\nfunction replaceRange(s, start, end, substitute) {\n  return s.substring(0, start) + substitute + s.substring(end);\n}\n\nexport function addMarkdownListeners(form) {\n  return $('.js-md', form).off('click').on('click', function() {\n    const $this = $(this);\n    return updateText($this.closest('.md-area').find('textarea'), $this.data('mdTag'), $this.data('mdBlock'), !$this.data('mdPrepend'));\n  });\n}\n\nexport function removeMarkdownListeners(form) {\n  return $('.js-md', form).off('click');\n}\n","import $ from 'jquery';\nimport autosize from 'autosize';\nimport GfmAutoComplete from './gfm_auto_complete';\nimport dropzoneInput from './dropzone_input';\nimport { addMarkdownListeners, removeMarkdownListeners } from './lib/utils/text_markdown';\n\nexport default class GLForm {\n  constructor(form, enableGFM = false) {\n    this.form = form;\n    this.textarea = this.form.find('textarea.js-gfm-input');\n    this.enableGFM = enableGFM;\n    // Before we start, we should clean up any previous data for this form\n    this.destroy();\n    // Setup the form\n    this.setupForm();\n    this.form.data('glForm', this);\n  }\n\n  destroy() {\n    // Clean form listeners\n    this.clearEventListeners();\n    if (this.autoComplete) {\n      this.autoComplete.destroy();\n    }\n    this.form.data('glForm', null);\n  }\n\n  setupForm() {\n    const isNewForm = this.form.is(':not(.gfm-form)');\n    this.form.removeClass('js-new-note-form');\n    if (isNewForm) {\n      this.form.find('.div-dropzone').remove();\n      this.form.addClass('gfm-form');\n      // remove notify commit author checkbox for non-commit notes\n      gl.utils.disableButtonIfEmptyField(this.form.find('.js-note-text'), this.form.find('.js-comment-button, .js-note-new-discussion'));\n      this.autoComplete = new GfmAutoComplete(gl.GfmAutoComplete && gl.GfmAutoComplete.dataSources);\n      this.autoComplete.setup(this.form.find('.js-gfm-input'), {\n        emojis: true,\n        members: this.enableGFM,\n        issues: this.enableGFM,\n        milestones: this.enableGFM,\n        mergeRequests: this.enableGFM,\n        labels: this.enableGFM,\n      });\n      dropzoneInput(this.form);\n      autosize(this.textarea);\n    }\n    // form and textarea event listeners\n    this.addEventListeners();\n    addMarkdownListeners(this.form);\n    // hide discard button\n    this.form.find('.js-note-discard').hide();\n    this.form.show();\n    if (this.isAutosizeable) this.setupAutosize();\n  }\n\n  setupAutosize() {\n    this.textarea.off('autosize:resized')\n      .on('autosize:resized', this.setHeightData.bind(this));\n\n    this.textarea.off('mouseup.autosize')\n      .on('mouseup.autosize', this.destroyAutosize.bind(this));\n\n    setTimeout(() => {\n      autosize(this.textarea);\n      this.textarea.css('resize', 'vertical');\n    }, 0);\n  }\n\n  setHeightData() {\n    this.textarea.data('height', this.textarea.outerHeight());\n  }\n\n  destroyAutosize() {\n    const outerHeight = this.textarea.outerHeight();\n\n    if (this.textarea.data('height') === outerHeight) return;\n\n    autosize.destroy(this.textarea);\n\n    this.textarea.data('height', outerHeight);\n    this.textarea.outerHeight(outerHeight);\n    this.textarea.css('max-height', window.outerHeight);\n  }\n\n  clearEventListeners() {\n    this.textarea.off('focus');\n    this.textarea.off('blur');\n    removeMarkdownListeners(this.form);\n  }\n\n  addEventListeners() {\n    this.textarea.on('focus', function focusTextArea() {\n      $(this).closest('.md-area').addClass('is-focused');\n    });\n    this.textarea.on('blur', function blurTextArea() {\n      $(this).closest('.md-area').removeClass('is-focused');\n    });\n  }\n}\n","/* eslint-disable func-names, space-before-function-paren, wrap-iife, prefer-arrow-callback, no-unused-vars, consistent-return, camelcase, comma-dangle, max-len, class-methods-use-this */\n\n// Zen Mode (full screen) textarea\n//\n/*= provides zen_mode:enter */\n/*= provides zen_mode:leave */\n\nimport $ from 'jquery';\nimport 'vendor/jquery.scrollTo';\nimport Dropzone from 'dropzone';\nimport Mousetrap from 'mousetrap';\nimport 'mousetrap/plugins/pause/mousetrap-pause';\n\nDropzone.autoDiscover = false;\n\n//\n// ### Events\n//\n// `zen_mode:enter`\n//\n// Fired when the \"Edit in fullscreen\" link is clicked.\n//\n// **Synchronicity** Sync\n// **Bubbles** Yes\n// **Cancelable** No\n// **Target** a.js-zen-enter\n//\n// `zen_mode:leave`\n//\n// Fired when the \"Leave Fullscreen\" link is clicked.\n//\n// **Synchronicity** Sync\n// **Bubbles** Yes\n// **Cancelable** No\n// **Target** a.js-zen-leave\n//\n\nexport default class ZenMode {\n  constructor() {\n    this.active_backdrop = null;\n    this.active_textarea = null;\n    $(document).on('click', '.js-zen-enter', function(e) {\n      e.preventDefault();\n      return $(e.currentTarget).trigger('zen_mode:enter');\n    });\n    $(document).on('click', '.js-zen-leave', function(e) {\n      e.preventDefault();\n      return $(e.currentTarget).trigger('zen_mode:leave');\n    });\n    $(document).on('zen_mode:enter', (function(_this) {\n      return function(e) {\n        return _this.enter($(e.target).closest('.md-area').find('.zen-backdrop'));\n      };\n    })(this));\n    $(document).on('zen_mode:leave', (function(_this) {\n      return function(e) {\n        return _this.exit();\n      };\n    })(this));\n    $(document).on('keydown', function(e) {\n      // Esc\n      if (e.keyCode === 27) {\n        e.preventDefault();\n        return $(document).trigger('zen_mode:leave');\n      }\n    });\n  }\n\n  enter(backdrop) {\n    Mousetrap.pause();\n    this.active_backdrop = $(backdrop);\n    this.active_backdrop.addClass('fullscreen');\n    this.active_textarea = this.active_backdrop.find('textarea');\n    // Prevent a user-resized textarea from persisting to fullscreen\n    this.active_textarea.removeAttr('style');\n    this.active_textarea.focus();\n  }\n\n  exit() {\n    if (this.active_textarea) {\n      Mousetrap.unpause();\n      this.active_textarea.closest('.zen-backdrop').removeClass('fullscreen');\n      this.scrollTo(this.active_textarea);\n      this.active_textarea = null;\n      this.active_backdrop = null;\n\n      const $dropzone = $('.div-dropzone');\n      if ($dropzone && !$dropzone.hasClass('js-invalid-dropzone')) {\n        Dropzone.forElement('.div-dropzone').enable();\n      }\n    }\n  }\n\n  scrollTo(zen_area) {\n    return $.scrollTo(zen_area, 0, {\n      offset: -150\n    });\n  }\n}\n","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('img',{directives:[{name:\"tooltip\",rawName:\"v-tooltip\"}],staticClass:\"avatar\",class:( _obj = {\n    lazy: _vm.lazy\n  }, _obj[_vm.avatarSizeClass] = true, _obj[_vm.cssClasses] = true, _obj ),attrs:{\"data-boundary\":\"window\",\"src\":_vm.resultantSrcAttribute,\"width\":_vm.size,\"height\":_vm.size,\"alt\":_vm.imgAlt,\"data-src\":_vm.sanitizedSource,\"data-container\":_vm.tooltipContainer,\"data-placement\":_vm.tooltipPlacement,\"title\":_vm.tooltipText}})\nvar _obj;}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","import mod from \"-!../../../../../../node_modules/babel-loader/lib/index.js??ref--0!../../../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./user_avatar_image.vue?vue&type=script&lang=js\"; export default mod; export * from \"-!../../../../../../node_modules/babel-loader/lib/index.js??ref--0!../../../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./user_avatar_image.vue?vue&type=script&lang=js\"","<script>\n\n/* This is a re-usable vue component for rendering a user avatar that\n  does not need to link to the user's profile. The image and an optional\n  tooltip can be configured by props passed to this component.\n\n  Sample configuration:\n\n  <user-avatar-image\n    :lazy=\"true\"\n    :img-src=\"userAvatarSrc\"\n    :img-alt=\"tooltipText\"\n    :tooltip-text=\"tooltipText\"\n    tooltip-placement=\"top\"\n  />\n\n*/\n\nimport defaultAvatarUrl from 'images/no_avatar.png';\nimport { placeholderImage } from '../../../lazy_loader';\nimport tooltip from '../../directives/tooltip';\n\nexport default {\n  name: 'UserAvatarImage',\n  directives: {\n    tooltip,\n  },\n  props: {\n    lazy: {\n      type: Boolean,\n      required: false,\n      default: false,\n    },\n    imgSrc: {\n      type: String,\n      required: false,\n      default: defaultAvatarUrl,\n    },\n    cssClasses: {\n      type: String,\n      required: false,\n      default: '',\n    },\n    imgAlt: {\n      type: String,\n      required: false,\n      default: 'user avatar',\n    },\n    size: {\n      type: Number,\n      required: false,\n      default: 20,\n    },\n    tooltipText: {\n      type: String,\n      required: false,\n      default: '',\n    },\n    tooltipPlacement: {\n      type: String,\n      required: false,\n      default: 'top',\n    },\n  },\n  computed: {\n    // API response sends null when gravatar is disabled and\n    // we provide an empty string when we use it inside user avatar link.\n    // In both cases we should render the defaultAvatarUrl\n    sanitizedSource() {\n      return this.imgSrc === '' || this.imgSrc === null ? defaultAvatarUrl : this.imgSrc;\n    },\n    resultantSrcAttribute() {\n      return this.lazy ? placeholderImage : this.sanitizedSource;\n    },\n    tooltipContainer() {\n      return this.tooltipText ? 'body' : null;\n    },\n    avatarSizeClass() {\n      return `s${this.size}`;\n    },\n  },\n};\n</script>\n\n<template>\n  <img\n    v-tooltip\n    class=\"avatar\"\n    data-boundary=\"window\"\n    :class=\"{\n      lazy: lazy,\n      [avatarSizeClass]: true,\n      [cssClasses]: true\n    }\"\n    :src=\"resultantSrcAttribute\"\n    :width=\"size\"\n    :height=\"size\"\n    :alt=\"imgAlt\"\n    :data-src=\"sanitizedSource\"\n    :data-container=\"tooltipContainer\"\n    :data-placement=\"tooltipPlacement\"\n    :title=\"tooltipText\"\n  />\n</template>\n","import { render, staticRenderFns } from \"./user_avatar_image.vue?vue&type=template&id=322edd8c\"\nimport script from \"./user_avatar_image.vue?vue&type=script&lang=js\"\nexport * from \"./user_avatar_image.vue?vue&type=script&lang=js\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../../../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n  script,\n  render,\n  staticRenderFns,\n  false,\n  null,\n  null,\n  null\n  \n)\n\nexport default component.exports","module.exports = \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEsAAABLCAAAAAAdJSU2AAACNElEQVR4AdXYBa7jMBCA4b3/JZahzIkjp2qt+BWUWnG5ln2XxaJJb2b5F2ukL4wvzK/rP7bUcbf92u6oftLSe1ldk8efsfaVeEjusZZeC6e1RllaCk/yG6ag1lZ4WwPX69uyD6tAe/g2ipAlNMRS37awDLaFrpcMWxXQOi0jnWCWjFkSZomYJWDWKmatYNZyEWkJsvQimoZYah5NgdaLxagCtF6GRy0DshZPkeYwS/KIJWGWYjwYUzDLxCwDtJ54OKglimBLqHWahii2g1pmHLLGBmwVoRjcKlmgOdw65H5qKuGWCVi5Qlhs6m1sENZi4q3AWNvca5UYy2RjT/SAsiZey6CsIvc0wVlV5lJ0ibPMyLUGCmlxQq0IM0hLdWyro7CWEc3sXsqaK4O2zLxOsmtpfW5Q1u68ZrVmepaaNXEewawtI9X5Xl3U3n1qND6+rfPzvqoIWz/fklNCSLY153YV53J/XUxGCJnKZ1lajsn3/Ffegf6Y5pV2LUsSNL2UHzxUfh3TlYpZqqTpXZm0KZk9zJcqaEmaWPHDw0pxe05K7bWOLHFLWXVetqpYmrjle4+1y0aBaF4UOQ1NU+lYezJClkjLUnSEjqhH6zjAW4OjtY39Ibq+sawUb6W2RQfoqG0VeKuwrRJvlba17faRdbe2pTtYq6Nty/S7yAbGsQjWIq41wVoT1+IdZNy1djUcVdu5lklQWC0xHkt1X31qNEE1Pr3qKv/9XiSNj6Aaifj3/69+AYujsR/MvkpZAAAAAElFTkSuQmCC\"","/* eslint-disable no-param-reassign, prefer-template, no-var, no-void, consistent-return */\n\nimport AccessorUtilities from './lib/utils/accessor';\n\nexport default class Autosave {\n  constructor(field, key) {\n    this.field = field;\n\n    this.isLocalStorageAvailable = AccessorUtilities.isLocalStorageAccessSafe();\n    if (key.join != null) {\n      key = key.join('/');\n    }\n    this.key = 'autosave/' + key;\n    this.field.data('autosave', this);\n    this.restore();\n    this.field.on('input', () => this.save());\n  }\n\n  restore() {\n    if (!this.isLocalStorageAvailable) return;\n    if (!this.field.length) return;\n\n    const text = window.localStorage.getItem(this.key);\n\n    if ((text != null ? text.length : void 0) > 0) {\n      this.field.val(text);\n    }\n\n    this.field.trigger('input');\n    // v-model does not update with jQuery trigger\n    // https://github.com/vuejs/vue/issues/2804#issuecomment-216968137\n    const event = new Event('change', { bubbles: true, cancelable: false });\n    const field = this.field.get(0);\n    field.dispatchEvent(event);\n  }\n\n  save() {\n    if (!this.field.length) return;\n\n    const text = this.field.val();\n\n    if (this.isLocalStorageAvailable && (text != null ? text.length : void 0) > 0) {\n      return window.localStorage.setItem(this.key, text);\n    }\n\n    return this.reset();\n  }\n\n  reset() {\n    if (!this.isLocalStorageAvailable) return;\n\n    return window.localStorage.removeItem(this.key);\n  }\n}\n"],"sourceRoot":""}