Added feature to limit and sort collection

remote: Support for password authentication was removed on August 13, 2021.
remote: Please see https://docs.github.com/en/get-started/getting-started-with-git/about-remote-repositories#cloning-with-https-urls for information on currently recommended modes of authentication.
fatal: Authentication failed for 'https://github.com/slash7it/warbot.git/'


Refactor graph.attr(transform) parse for Zoom

--- app/scripts/alchemy/core/interactions.coffee
+++ app/scripts/alchemy/core/interactions.coffee
@@ -174,11 +174,8 @@
                  .on "zoom", ->
                     graph = d3.select(".alchemy svg g")
                     currTransform = graph.attr("transform")
-                                        .replace(/[a-zA-Z()]/g, "")
-                                        .split(/[\s,]/)
-                                        .map( (a) ->
-                                            return parseFloat(a)
-                                        )
+                                        .match(/(-*\d+\.*\d*)/g)
+                                        .map( (a) -> return parseFloat(a) )
                     graph
                       .attr("transform","translate(#{currTransform[0]},#{currTransform[1]}) scale(#{currTransform[2]+0.28})")
                       return


add comments

add comments

remote: Support for password authentication was removed on August 13, 2021.
remote: Please see https://docs.github.com/en/get-started/getting-started-with-git/about-remote-repositories#cloning-with-https-urls for information on currently recommended modes of authentication.
fatal: Authentication failed for 'https://github.com/clochix/cozy-data-system.git/'


drag view to handle channel order update

error: pathspec 'apps/channel/client/channel_drag_view.coffee' did not match any file(s) known to git

--- apps/channel/client/channel_drag_view.coffee
+++ apps/channel/client/channel_drag_view.coffee
@@ -0,0 +1,59 @@
+Backbone = require "backbone"
+_ = require 'underscore'
+sd = require("sharify").data
+Sortable = require 'sortablejs'
+mediator = require '../../../lib/mediator.coffee'
+analytics = require '../../../lib/analytics.coffee'
+
+module.exports = class ChannelFileDropView extends Backbone.View
+  frozen: []
+  viewOrder: 'desc'
+
+  setupDragAndDrop: ->
+    @sortable = new Sortable @el,
+      draggable: '.grid__block'
+      filter: '.grid__block--new-block'
+      scroll: true
+      onStart: @freezeNewBlock
+      onMove: @onMove
+      onEnd: @onEnd
+      scrollSensitivity: 100
+      onUpdate: @updateOrder
+
+  freezeNewBlock: =>
+    @frozen = this.el.querySelector '.grid__block--new-block'
+    mediator.shared.state.set 'isDraggingBlocks', yes
+
+  onMove: (e) =>
+    clearTimeout @pid
+
+    @pid = setTimeout ->
+      list = e.to
+      if list.firstElementChild is @frozen
+        list.insertBefore @frozen, list.children[2]
+    , 0
+
+    return false if e.related.nextElementSibling is @frozen
+    return @frozen isnt e.related
+
+  onEnd: =>
+    mediator.shared.state.set 'isDraggingBlocks', no
+
+  updateOrder: (e) =>
+    item = e.item
+
+    blocks = @$(".grid__block:not(.grid__block--new-block)")
+    if @viewOrder is 'desc'
+      index = (blocks.length - blocks.index(this)) + 1
+    else
+      index = blocks.index($(item)) + 1
+
+    $.ajax
+      url: "#{sd.API_URL}/channels/#{@model.id}/sort"
+      type: 'PUT'
+      dataType: 'json'
+      data:
+        ids: [
+          index: index
+          id: $(item).data('id')
+        ]


If link is found, navigate to it onclick

remote: Support for password authentication was removed on August 13, 2021.
remote: Please see https://docs.github.com/en/get-started/getting-started-with-git/about-remote-repositories#cloning-with-https-urls for information on currently recommended modes of authentication.
fatal: Authentication failed for 'https://github.com/core-network/client-threejs.git/'


Adhere to `CoffeeScript.compile` contract

...which always returns the source map as a string. This is needed because
`Buffer` now requires to be initialized with either a number, a buffer, an array
or a string.

remote: Support for password authentication was removed on August 13, 2021.
remote: Please see https://docs.github.com/en/get-started/getting-started-with-git/about-remote-repositories#cloning-with-https-urls for information on currently recommended modes of authentication.
fatal: Authentication failed for 'https://github.com/beni55/atom.git/'


debug: log configuration object on startup

remote: Support for password authentication was removed on August 13, 2021.
remote: Please see https://docs.github.com/en/get-started/getting-started-with-git/about-remote-repositories#cloning-with-https-urls for information on currently recommended modes of authentication.
fatal: Authentication failed for 'https://github.com/keboola/kbc-ui-tde-exporter.git/'


fix set jobUriTemplate only if found in config

remote: Support for password authentication was removed on August 13, 2021.
remote: Please see https://docs.github.com/en/get-started/getting-started-with-git/about-remote-repositories#cloning-with-https-urls for information on currently recommended modes of authentication.
fatal: Authentication failed for 'https://github.com/keboola/kbc-ui-ex-gdrive.git/'


Only banks with accounts are displayed

Only banks with accounts are displayed

remote: Support for password authentication was removed on August 13, 2021.
remote: Please see https://docs.github.com/en/get-started/getting-started-with-git/about-remote-repositories#cloning-with-https-urls for information on currently recommended modes of authentication.
fatal: Authentication failed for 'https://github.com/goofy-bz/kresus.git/'


Prevent merging before splitted.

Prevent merging before splitted.

remote: Support for password authentication was removed on August 13, 2021.
remote: Please see https://docs.github.com/en/get-started/getting-started-with-git/about-remote-repositories#cloning-with-https-urls for information on currently recommended modes of authentication.
fatal: Authentication failed for 'https://github.com/andrewjcasal/koding.git/'


Collaboration: Implemented realtime file create and delete logic.

--- client/ide/AppController.coffee
+++ client/ide/AppController.coffee
@@ -1077,12 +1077,17 @@
     { channelId } = @workspaceData

     if channelId
-      @isRealtimeSessionActive channelId, (isActive) =>
-
-        return @continuePrivateMessage callback  if isActive
-
-        @statusBar.share.show()
-        log 'start collaboration'
+
+      @fetchSocialChannel (channel) =>
+
+        @createChatPaneView channel
+
+        @isRealtimeSessionActive channelId, (isActive) =>
+
+          return @continuePrivateMessage callback  if isActive
+
+          @statusBar.share.show()
+          log 'start collaboration'

     else
       @initPrivateMessage callback
@@ -1102,20 +1107,21 @@

     log 'continuePrivateMessage'
     @statusBar.avatars.show()
+    @chat.emit 'CollaborationStarted'

   isRealtimeSessionActive: (id, callback) ->

-    hostName = if @amIHost then KD.nick() else @collaborationHost
-    title    = "#{hostName}.#{id}"
-
     @rtm.once 'FileQueryFinished', (file) =>

       if file.result.items.length > 0
-      then callback yes
-      else callback no
-
-    @rtm.fetchFileByTitle title
+        log 'file found'
+        callback yes
+      else
+        log 'file not found'
+        callback no
+
+    @rtm.fetchFileByTitle @getRealTimeFileName id

   initPrivateMessage: (callback) ->
@@ -1167,6 +1173,12 @@
       channelId  : @socialChannel.id
     , callback

+    @rtm.once 'FileCreated', (file) =>
+      log 'file created', file
+      @chat.emit 'CollaborationStarted'
+
+    @rtm.createFile @getRealTimeFileName()
+

   stopCollaborationSession: (callback) ->

@@ -1180,3 +1192,8 @@
       payload    : 'system-message' : 'stop'
       channelId  : @socialChannel.id
     , callback
+
+    @rtm.deleteFile @getRealTimeFileName()
+
+    @rtm.once 'FileDeleted', =>
+      log 'file deleted'


AppController: Unfocus dummy editor.

AppController: Unfocus dummy editor.


Added level banner.

Added level banner.

error: pathspec 'app/assets/javascripts/app/controllers/widget/dev_banner.js.coffee' did not match any file(s) known to git

--- app/assets/javascripts/app/controllers/widget/dev_banner.js.coffee
+++ app/assets/javascripts/app/controllers/widget/dev_banner.js.coffee
@@ -0,0 +1,21 @@
+class Widget
+  constructor: ->
+    return if App.Config.get('developer_mode')
+    banner = """
+|                                                _
+|  _____                                       __(_)
+| /__  /  ____ _____ ___  ____ ___  ____ _____/ /
+|   / /  / __ `/ __ `__ \\/ __ `__ \\/ __ `/ __  /
+|  / /__/ /_/ / / / / / / / / / / / /_/ / /_/ /
+| /____/\\__,_/_/ /_/ /_/_/ /_/ /_/\\__,_/\\__,_/
+|
+| Hi there, nice to meet you!
+|
+| Visit %chttp://zammad.com/jobs%c to learn about our current job openings.
+|
+| Your Zammad Team!
+|
+"""
+    console.log(banner, "text-decoration: underline;", "text-decoration: none;")
+
+App.Config.set( 'dev_banner', Widget, 'Widgets' )


client/redux: add promise middleware

client/redux: add promise middleware

error: pathspec 'client/app/lib/redux/middleware/promise.coffee' did not match any file(s) known to git

--- client/app/lib/redux/middleware/promise.coffee
+++ client/app/lib/redux/middleware/promise.coffee
@@ -0,0 +1,23 @@
+{ assign, omit } = require 'lodash'
+
+module.exports = promiseMiddleware = (store) -> (next) -> (action) ->
+
+  if typeof action is 'function'
+    return action(store.dispatch, store.getState)
+
+  { promise, types } = action
+
+  return next action  unless promise
+
+  [BEGIN, SUCCESS, FAIL] = types
+
+  action = omit action, ['promise', 'types']
+
+  begin = -> next(assign {}, action, { type: BEGIN })
+  success = (result) -> next(assign {}, action, { result, type: SUCCESS })
+  fail = (error) -> next(assign {}, action, { error, type: FAIL })
+
+  begin()
+  return promise().then(success, fail).catch(fail)
+
+


config: koodingrs => koodingrs0

config: koodingrs => koodingrs0

I wrote the name of the replica set wrong


changed .children() to .find() for additional selector

remote: Support for password authentication was removed on August 13, 2021.
remote: Please see https://docs.github.com/en/get-started/getting-started-with-git/about-remote-repositories#cloning-with-https-urls for information on currently recommended modes of authentication.
fatal: Authentication failed for 'https://github.com/saijim/filterbarium.git/'


Implement helper method for XML escaping

error: pathspec 'lib/helpers.coffee' did not match any file(s) known to git

--- lib/helpers.coffee
+++ lib/helpers.coffee
@@ -0,0 +1,7 @@
+escapeXMLCharacter = (c) ->
+	'&' + { '&': 'amp', '<': 'lt', '>': 'gt', "'": 'apos', '"': 'quot'}[c] + ';'
+
+escapeXML = (s) ->
+  s.replace(/([&<>'"])/g, escapeXMLCharacter)
+
+module.exports.escapeXML = escapeXML


Rename getRealPath to getRealPathSync

Rename getRealPath to getRealPathSync

--- src/directory.coffee
+++ src/directory.coffee
@@ -44,7 +44,7 @@
   #
   # All relative directory entries are removed and symlinks are resolved to
   # their final destination.
-  getRealPath: ->
+  getRealPathSync: ->
     unless @realPath?
       try
         @realPath = fs.realpathSync(@path)
@@ -59,7 +59,7 @@

     if pathToCheck.indexOf(path.join(@getPath(), path.sep)) is 0
       true
-    else if pathToCheck.indexOf(path.join(@getRealPath(), path.sep)) is 0
+    else if pathToCheck.indexOf(path.join(@getRealPathSync(), path.sep)) is 0
       true
     else
       false
@@ -75,10 +75,10 @@
       ''
     else if fullPath.indexOf(path.join(@getPath(), path.sep)) is 0
       fullPath.substring(@getPath().length + 1)
-    else if fullPath is @getRealPath()
+    else if fullPath is @getRealPathSync()
       ''
-    else if fullPath.indexOf(path.join(@getRealPath(), path.sep)) is 0
-      fullPath.substring(@getRealPath().length + 1)
+    else if fullPath.indexOf(path.join(@getRealPathSync(), path.sep)) is 0
+      fullPath.substring(@getRealPathSync().length + 1)
     else
       fullPath


Sidebar: missing navigationitem itself added

error: pathspec 'client/Main/navigation/navigationitem.coffee' did not match any file(s) known to git

--- client/Main/navigation/navigationitem.coffee
+++ client/Main/navigation/navigationitem.coffee
@@ -0,0 +1,42 @@
+class NavigationItem extends JTreeItemView
+
+  JView.mixin @prototype
+
+  constructor:(options = {}, data)->
+
+    options.type or= 'main-nav'
+
+    super options, data
+
+
+    data  = @getData()
+    @type = data.type
+
+    if data.jMachine
+      @type  = 'machine'
+      @setClass 'machine'
+      @child = new NavigationMachineItem {}, data
+    else if data.type is 'title'
+      @setClass 'sub-title'
+      @child = new KDCustomHTMLView tagName : 'h3', partial : data.title
+    else if data.type is 'workspace'
+      @setClass 'workspace'
+      @child = new KDCustomHTMLView
+        partial : """
+

+          #{data.title}
+          """
+    else if data.type is 'app'
+      @setClass 'app'
+      @child = new KDCustomHTMLView
+        partial : """
+

+          #{data.title}
+          """
+
+
+  pistachio: ->
+
+    """
+    {{> @child}}
+    """


Add a benchmark.

Add a benchmark.

error: pathspec 'test/benchmark.coffee' did not match any file(s) known to git

--- test/benchmark.coffee
+++ test/benchmark.coffee
@@ -0,0 +1,56 @@
+fs = require "fs"
+
+env = do -> this
+env.eval(fs.readFileSync("../curve255.js").toString())
+
+stdout  = process.stdout
+stderr  = process.stderr
+write   = (x) -> stdout.write x
+echo    = (x) -> write x + "\n"
+
+fromHex  = env.c255lhexdecode
+toHex    = env.c255lhexencode
+
+hex2ibh = (x) ->
+  x = new Array(64 + 1 - x.length).join("0") + x; # Pad with '0' at the front
+  # Invert bytes
+  return x.split(/(..)/).reverse().join("");
+
+toIbh = (x) -> hex2ibh(toHex x)
+
+printKey = (x) -> write(toIbh x)
+
+cmp = env.c255lbigintcmp
+xor = (a, b) ->
+  r = env.c255lzero()
+  for x in [15..0]
+    r[x] = a[x] ^ b[x]
+  r
+
+doit = (e, k) ->
+  # printKey e
+  # write " "
+  # printKey k
+  # write " "
+  ek = env.curve25519_raw e, k
+  # printKey ek
+  # write "\n"
+  ek
+
+e1  = fromHex "3"
+e2  = fromHex "5"
+k   = fromHex "9"
+
+l = 0
+while l < 50
+  e1k    = doit e1, k
+  e2e1k  = doit e2, e1k
+  e2k    = doit e2, k
+  e1e2k  = doit e1, e2k
+  if cmp e1e2k, e2e1k
+    echo "fail"
+    process.exit 1
+  e1  = xor e1,  e2k
+  e2  = xor e2,  e1k
+  k   = xor k,   e1e2k
+  l++


Tree test: use test repo

Tree test: use test repo

--- test/test.tree.coffee
+++ test/test.tree.coffee
@@ -4,15 +4,15 @@
 utils = require "./utils"
 fixtures = require "./fixtures"

-secondCommit = fixtures.projectRepo.secondCommit
+secondCommit = fixtures.testRepo.secondCommit

 describe "Tree", ->
 	repo = null
 	tree = null

-	describe "Using the project repo...", ->
+	describe "Using the test repo...", ->
 		it "can find second commit tree (#{secondCommit.tree})", (done) ->
-			gitteh.openRepository fixtures.projectRepo.path, (err, _repo) ->
+			gitteh.openRepository fixtures.testRepo.path, (err, _repo) ->
 				repo = _repo

 				repo.tree secondCommit.tree, (err, _tree) ->
@@ -27,4 +27,4 @@
 			it "is immutable", -> utils.checkImmutable tree, "id"
 		describe "#entries", ->
 			it "are correct", ->
-				+


Rename ::disposables to ::subscriptions in PaneView

Now that emissary’s Subscriber no longer conflicts with the name

--- src/pane-view.coffee
+++ src/pane-view.coffee
@@ -34,7 +34,7 @@
   previousActiveItem: null

   initialize: (args...) ->
-    @disposables = new CompositeDisposable
+    @subscriptions = new CompositeDisposable

     if args[0] instanceof Pane
       @model = args[0]
@@ -47,13 +47,13 @@
     @handleEvents()

   handleEvents: ->
-    @disposables.add @model.observeActiveItem(@onActiveItemChanged)
-    @disposables.add @model.onDidAddItem(@onItemAdded)
-    @disposables.add @model.onDidRemoveItem(@onItemRemoved)
-    @disposables.add @model.onDidMoveItem(@onItemMoved)
-    @disposables.add @model.onWillDestroyItem(@onBeforeItemDestroyed)
-    @disposables.add @model.onDidActivate(@onActivated)
-    @disposables.add @model.observeActive(@onActiveStatusChanged)
+    @subscriptions.add @model.observeActiveItem(@onActiveItemChanged)
+    @subscriptions.add @model.onDidAddItem(@onItemAdded)
+    @subscriptions.add @model.onDidRemoveItem(@onItemRemoved)
+    @subscriptions.add @model.onDidMoveItem(@onItemMoved)
+    @subscriptions.add @model.onWillDestroyItem(@onBeforeItemDestroyed)
+    @subscriptions.add @model.onDidActivate(@onActivated)
+    @subscriptions.add @model.observeActive(@onActiveStatusChanged)

     @subscribe this, 'focusin', => @model.focus()
     @subscribe this, 'focusout', => @model.blur()
@@ -222,7 +222,7 @@
     @closest('.panes').view()

   beforeRemove: ->
-    @disposables.dispose()
+    @subscriptions.dispose()
     @model.destroy() unless @model.isDestroyed()

   remove: (selector, keepData) ->


Update zh-HANT.coffee

Update zh-HANT.coffee

--- app/locale/zh-HANT.coffee
+++ app/locale/zh-HANT.coffee
@@ -29,7 +29,7 @@
     legal: "版權聲明"
     about: "關於"
     contact: "聯繫我們"
-    twitter_follow: "在Twitter關注"
+    twitter_follow: "在 Twitter 關注"
     teachers: "教師"

   modal:
@@ -1039,78 +1039,78 @@
     multiplayer_sign_in_leaderboard: "註冊並且登入帳號，就可以將您的成就放在排行榜上."

   legal:
-    page_title: "Legal"
+    page_title: "條文"
     opensource_intro: "CodeCombat是完全的開源."
     opensource_description_prefix: "查看 "
     github_url: "我們的 GitHub"
-#    opensource_description_center: "and help out if you like! CodeCombat is built on dozens of open source projects, and we love them. See "
-#    archmage_wiki_url: "our Archmage wiki"
-#    opensource_description_suffix: "for a list of the software that makes this game possible."
-#    practices_title: "Respectful Best Practices"
-#    practices_description: "These are our promises to you, the player, in slightly less legalese."
-#    privacy_title: "Privacy"
-#    privacy_description: "We will not sell any of your personal information."
-#    security_title: "Security"
-#    security_description: "We strive to keep your personal information safe. As an open source project, our site is freely open to anyone to review and improve our security systems."
-#    email_title: "Email"
-#    email_description_prefix: "We will not inundate you with spam. Through"
-#    email_settings_url: "your email settings"
-#    email_description_suffix: "or through links in the emails we send, you can change your preferences and easily unsubscribe at any time."
-#    cost_title: "Cost"
-#    cost_description: "CodeCombat is free to play for all of its core levels, with a $9.99 USD/mo subscription for access to extra level branches and 3500 bonus gems per month. You can cancel with a click, and we offer a 100% money-back guarantee."
-#    copyrights_title: "Copyrights and Licenses"
-#    contributor_title: "Contributor License Agreement"
-#    contributor_description_prefix: "All contributions, both on the site and on our GitHub repository, are subject to our"
+    opensource_description_center: "並且如果有興趣也歡迎您的幫助! CodeCombat是建立在許多的開源專案上, 並且我們深愛它們. 查看 "
+    archmage_wiki_url: "我們的大法師wiki"
+    opensource_description_suffix: " 尋求創造這款遊戲的相關軟體列表."
+    practices_title: "值得尊敬的最佳實踐"
+    practices_description: "這些是我們給您, 給玩家的承諾, 儘管這在法律上略顯不足."
+    privacy_title: "隱私"
+    privacy_description: "我們將不會賣出任何關於您個人的資訊."
+    security_title: "安全"
+    security_description: "我們渴望保持您的個人資訊是安全的. 身為一個開源的專案, 我們的網站是開放給任何人來檢視並且提升我們的安全系統."
+    email_title: "郵件"
+    email_description_prefix: "我們將不會使您的信箱氾濫的收到垃圾信. 不論"
+    email_settings_url: " 在您的郵件設定 "
+    email_description_suffix: "或在我們送出的信件上都有留著我們的聯結, 您可以更改您的喜好並且輕易的隨時取消訂閱."
+    cost_title: "花費"
+    cost_description: "CodeCombat在核心的關卡是全部免費, 但只要花費一個月$9.99美金來訂閱, 您將在每個月取得額外的關卡和3500顆寶石. 您可以輕易地取消訂閱並且保證取得100%的退費."
+    copyrights_title: "版權和許可"
+    contributor_title: "貢獻者許可協議"
+    contributor_description_prefix: "所有在本網站或是 GitHub 代碼庫上的貢獻都依照我們的"
     cla_url: "貢獻者許可協議"
-#    contributor_description_suffix: "to which you should agree before contributing."
+    contributor_description_suffix: "而這在您貢獻之前就應該已经同意."
     code_title: "Code - MIT"
-#    code_description_prefix: "All code owned by CodeCombat or hosted on codecombat.com, both in the GitHub repository or in the codecombat.com database, is licensed under the"
-#    mit_license_url: "MIT license"
-#    code_description_suffix: "This includes all code in Systems and Components that are made available by CodeCombat for the purpose of creating levels."
-#    art_title: "Art/Music - Creative Commons "
-#    art_description_prefix: "All common content is available under the"
-#    cc_license_url: "Creative Commons Attribution 4.0 International License"
-#    art_description_suffix: "Common content is anything made generally available by CodeCombat for the purpose of creating Levels. This includes:"
-#    art_music: "Music"
-#    art_sound: "Sound"
-#    art_artwork: "Artwork"
-#    art_sprites: "Sprites"
-#    art_other: "Any and all other non-code creative works that are made available when creating Levels."
-#    art_access: "Currently there is no universal, easy system for fetching these assets. In general, fetch them from the URLs as used by the site, contact us for assistance, or help us in extending the site to make these assets more easily accessible."
-#    art_paragraph_1: "For attribution, please name and link to codecombat.com near where the source is used or where appropriate for the medium. For example:"
-#    use_list_1: "If used in a movie or another game, include codecombat.com in the credits."
-#    use_list_2: "If used on a website, include a link near the usage, for example underneath an image, or in a general attributions page where you might also mention other Creative Commons works and open source software being used on the site. Something that's already clearly referencing CodeCombat, such as a blog post mentioning CodeCombat, does not need some separate attribution."
-#    art_paragraph_2: "If the content being used is created not by CodeCombat but instead by a user of codecombat.com, attribute them instead, and follow attribution directions provided in that resource's description if there are any."
-#    rights_title: "Rights Reserved"
-#    rights_desc: "All rights are reserved for Levels themselves. This includes"
-#    rights_scripts: "Scripts"
-#    rights_unit: "Unit configuration"
-#    rights_description: "Description"
-#    rights_writings: "Writings"
-#    rights_media: "Media (sounds, music) and any other creative content made specifically for that Level and not made generally available when creating Levels."
-#    rights_clarification: "To clarify, anything that is made available in the Level Editor for the purpose of making levels is under CC, whereas the content created with the Level Editor or uploaded in the course of creation of Levels is not."
-#    nutshell_title: "In a Nutshell"
-#    nutshell_description: "Any resources we provide in the Level Editor are free to use as you like for creating Levels. But we reserve the right to restrict distribution of the Levels themselves (that are created on codecombat.com) so that they may be charged for in the future, if that's what ends up happening."
-#    canonical: "The English version of this document is the definitive, canonical version. If there are any discrepencies between translations, the English document takes precedence."
+    code_description_prefix: "所有由 CodeCombat 擁有或是托管在 codecombat.com 的代码，在 GitHub 代碼庫或者 codecombat.com 數據庫，以上許可協議都依照"
+    mit_license_url: "MIT license"
+    code_description_suffix: "這包括所有 CodeCombat 公開製作關卡用的系统和組件代碼."
+    art_title: "藝術/音樂 - Creative Commons "
+    art_description_prefix: "所有共通的内容都在"
+    cc_license_url: "Creative Commons Attribution 4.0 International License"
+    art_description_suffix: "共通内容是指所有 CodeCombat 發佈出来用于製作關卡的内容。包括:"
+    art_music: "音樂"
+    art_sound: "聲音"
+    art_artwork: "藝術作品"
+    art_sprites: "貼圖"
+    art_other: "所有製作關卡時公開的，不是代碼的創造性產品."
+    art_access: "目前還没有簡便通用的下载素材方式. 一般来說，從網站上使用的URL下载，或者聯繫我们尋求幫助. 當然您也可以幫助我们拓展網站，使這些資源更容易下載."
+    art_paragraph_1: "為了歸屬, 請在使用處或適當的地方說明, 或者留下一個聯結至codecombat.com. 例如:"
+    use_list_1: "如果使用在電影或者另一款遊戲中, 請在製作人員表中加入codecombat.com."
+    use_list_2: "如果使用在網站上, 請在使用處留下codecombat.com, 例如在圖片下面或一個您專門放置Creative Commons和開源專案的地方. 如果您的内容明確提到關於 CodeCombat, 那您就不需要額外署名."
+    art_paragraph_2: "如果您使用的內容非由CodeCombat製作但由一位codecombat.com中的使用者, 那您應該署名他. 並且如果相對應的頁面上有標記署名指示, 那您應該遵照其指示."
+    rights_title: "保留權利"
+    rights_desc: "所有版權由關卡本身擁有, 這包含："
+    rights_scripts: "腳本"
+    rights_unit: "單元配置"
+    rights_description: "描述"
+    rights_writings: "寫作"
+    rights_media: "聲音、音樂以及其他專門為某道關卡製作, 而不對其他關卡開放的創造性内容."
+    rights_clarification: "澄清一下, 所有在關卡编辑器裡公開用於制作關卡的資源都是在CC協議下發佈的, 然而使用關卡编辑器製作，或者在關卡製作過程中上傳的内容则不是."
+    nutshell_title: "簡而言之"
+    nutshell_description: "我们在關卡编辑器里公開的任何資源, 您都可以在製作關卡時隨意使用, 但我们保留在 codecombat.com 之上創建的關卡本身傳播的權利, 因为我们往後可能決定以它們收費."
+    canonical: "我們宣告這篇說明的英文版本是權威版本. 如果各個翻譯版本之間有任何衝突, 以英文版為準."

   ladder_prizes:
-#    title: "Tournament Prizes" # This section was for an old tournament and doesn't need new translations now.
-#    blurb_1: "These prizes will be awarded according to"
-#    blurb_2: "the tournament rules"
-#    blurb_3: "to the top human and ogre players."
-#    blurb_4: "Two teams means double the prizes!"
-#    blurb_5: "(There will be two first place winners, two second-place winners, etc.)"
+    title: "錦標賽獎項" # This section was for an old tournament and doesn't need new translations now.
+    blurb_1: "依據"
+    blurb_2: "錦標賽規則"
+    blurb_3: ", 這些獎項將被頒發給頂尖的人類和怪物玩家."
+    blurb_4: "兩隊意指獎項是兩倍!"
+    blurb_5: "(將有兩個第一名, 兩個第二名, etc.)"
     rank: "排名"
     prizes: "獎項"
-#    total_value: "Total Value"
+    total_value: "總價值"
     in_cash: "現金"
-#    custom_wizard: "Custom CodeCombat Wizard"
-#    custom_avatar: "Custom CodeCombat avatar"
+    custom_wizard: "客制 CodeCombat 巫師"
+    custom_avatar: "客制 CodeCombat 頭像"
 #    heap: "for six months of \"Startup\" access"
-#    credits: "credits"
+    credits: "信譽"
 #    one_month_coupon: "coupon: choose either Rails or HTML"
 #    one_month_discount: "discount, 30% off: choose either Rails or HTML"
-#    license: "license"
+    license: "許可證"
 #    oreilly: "ebook of your choice"

   account_profile:
@@ -1221,7 +1221,7 @@
   employers:
     deprecation_warning_title: "抱歉, CodeCombat現在並沒有在徵才."
     deprecation_warning: "我們暫且主要專注在找到初級有潛力的開發者而非高級的開發者."
-#    hire_developers_not_credentials: "Hire developers, not credentials." # We are not actively recruiting right now, so there's no need to add new translations for the rest of this section.
+    hire_developers_not_credentials: "僱用真正的開發者, 而非一張證書." # We are not actively recruiting right now, so there's no need to add new translations for the rest of this section.
     get_started: "開始"
     already_screened: "我們已經技術上考核過我們所有的候選人"
     filter_further: ", 但是您還是可以更加嚴苛的過濾:"


Delete safe option -> flatten array for have array with object

remote: Support for password authentication was removed on August 13, 2021.
remote: Please see https://docs.github.com/en/get-started/getting-started-with-git/about-remote-repositories#cloning-with-https-urls for information on currently recommended modes of authentication.
fatal: Authentication failed for 'https://github.com/metidia/dynoga.git/'


Add missing CommandInstaller require

Add missing CommandInstaller require

Closes #3729

--- src/workspace.coffee
+++ src/workspace.coffee
@@ -102,7 +102,7 @@
     @emit 'editor-created', editor

   installShellCommands: ->
-    CommandInstaller.installShellCommandsInteractively()
+    require('./command-installer').installShellCommandsInteractively()

   subscribeToActiveItem: ->
     @updateWindowTitle()


Backbone.Ultimate.Router with strip slashes on routes.

error: pathspec 'app/assets/javascripts/backbone/ultimate/router.js.coffee' did not match any file(s) known to git

--- app/assets/javascripts/backbone/ultimate/router.js.coffee
+++ app/assets/javascripts/backbone/ultimate/router.js.coffee
@@ -0,0 +1,13 @@
+Backbone.Ultimate ||= {}
+
+class Backbone.Ultimate.Router extends Backbone.Router
+
+  namedParam    = /:\w+/g
+  splatParam    = /\*\w+/g
+  escapeRegExp  = /[-[\]{}()+?.,\\^$|#\s]/g
+
+  _routeToRegExp: (route) ->
+    route = route.replace(escapeRegExp, '\\$&')
+                 .replace(namedParam, '([^\/]+)')
+                 .replace(splatParam, '(.*?)')
+    new RegExp("^\/?#{route}\/?$")


open link in new tab

open link in new tab

error: pathspec 'app/assets/javascripts/modules/mod-target-blank.js.coffee' did not match any file(s) known to git

--- app/assets/javascripts/modules/mod-target-blank.js.coffee
+++ app/assets/javascripts/modules/mod-target-blank.js.coffee
@@ -0,0 +1,8 @@
+# Desc
+#   open link in newtab
+# Usage:
+
+$ ->
+  $('a[href^=http]')
+    .not('[href*="' + location.hostname + '"]')
+    .attr({target:"_blank"})


Now we can use admin panel.

Now we can use admin panel.

remote: Support for password authentication was removed on August 13, 2021.
remote: Please see https://docs.github.com/en/get-started/getting-started-with-git/about-remote-repositories#cloning-with-https-urls for information on currently recommended modes of authentication.
fatal: Authentication failed for 'https://github.com/deamonsoft/salo.git/'


Ensure all dataspec properties are updated before glyph render

remote: Support for password authentication was removed on August 13, 2021.
remote: Please see https://docs.github.com/en/get-started/getting-started-with-git/about-remote-repositories#cloning-with-https-urls for information on currently recommended modes of authentication.
fatal: Authentication failed for 'https://github.com/aiguofer/bokeh.git/'


removing cruft from client.coffee

removing cruft from client.coffee

remote: Support for password authentication was removed on August 13, 2021.
remote: Please see https://docs.github.com/en/get-started/getting-started-with-git/about-remote-repositories#cloning-with-https-urls for information on currently recommended modes of authentication.
fatal: Authentication failed for 'https://github.com/damianb/crimson.git/'


created model file to save application key and secret


whitelist keys for settings_json

whitelist keys for settings_json

--- src/steroids/AppSettings.coffee
+++ src/steroids/AppSettings.coffee
@@ -4,12 +4,21 @@

 class AppSettings

+  WHITELISTED_SETTING_KEYS = [
+    "appearance"
+    "preloads"
+  ]
+
   constructor: ->

   getJSON: ->
     converter = new Converter

-    settingsObject = converter.configToAnkaFormat()
+    tempSettingsObject = converter.configToAnkaFormat()
+
+    settingsObject = {}
+    for whitelisted_keys in WHITELISTED_SETTING_KEYS
+      settingsObject[whitelisted_keys] = tempSettingsObject[whitelisted_keys]

     JSON.stringify settingsObject


Home/Flux: add noop catch handler, code tidy up

--- client/home/lib/flux/actions.coffee
+++ client/home/lib/flux/actions.coffee
@@ -85,15 +85,19 @@

     return

-  queryKites().then (result) ->
+  queryKites()

-    if result?.length
-      return markAsDone 'installKd'
+    .then (result) ->

-    unless reactor.evaluate HomeGetters.areStepsFinished
-      mainController.emit 'AllWelcomeStepsNotDoneYet'
+      if result?.length
+        return markAsDone 'installKd'

-    queryForKd()
+      unless reactor.evaluate HomeGetters.areStepsFinished
+        mainController.emit 'AllWelcomeStepsNotDoneYet'
+
+      queryForKd()
+
+    .catch kd.noop

 checkStacksForBuild = (stacks, unobserve) ->


Fix level numbering on /students

Fix level numbering on /students

--- app/models/Classroom.coffee
+++ app/models/Classroom.coffee
@@ -123,6 +123,7 @@
     levelsTotal = 0
     levelsLeft = 0
     lastPlayed = null
+    lastPlayedNumber = null
     playtime = 0
     levels = []
     for level, index in courseLevels.models
@@ -132,7 +133,7 @@
         complete = session.get('state').complete ? false
         playtime += session.get('playtime') ? 0
         lastPlayed = level
-        lastPlayedNumber = index + 1
+        lastPlayedNumber = @getLevelNumber(level.get('original'), index + 1)
         if complete
           currentIndex = index
         else
@@ -154,9 +155,6 @@
     nextLevel = courseLevels.models[nextIndex]
     nextLevel ?= _.find courseLevels.models, (level) -> not levelSessionMap[level.get('original')]?.get('state')?.complete

-    lastPlayedNumber ?= 1
-    if courseLevels.length >= 1 and lastPlayedNumber < courseLevels.length
-      lastPlayedNumber = @getLevelNumber(courseLevels.models[lastPlayedNumber - 1].get('original'), lastPlayedNumber)
     stats =
       levels:
         size: levelsTotal


Fixed the new build queue system for levels where there are multiple builders for a single thang type.

--- app/models/ThangType.coffee
+++ app/models/ThangType.coffee
@@ -138,7 +138,7 @@
     key = @spriteSheetKey(@options)
     spriteSheet = null
     if @options.async
-      buildQueue.push @
+      buildQueue.push @builder
       @builder.buildAsync() unless buildQueue.length > 1
       @builder.on 'complete', @onBuildSpriteSheetComplete, @, true, key
       return true
@@ -150,7 +150,7 @@

   onBuildSpriteSheetComplete: (e, key) ->
     buildQueue = buildQueue.slice(1)
-    buildQueue[0]?.builder.buildAsync()
+    buildQueue[0]?.buildAsync()
     @spriteSheets[key] = e.target.spriteSheet
     delete @building[key]
     @trigger 'build-complete'


Nodejs Web Server Tests: add impersonatehelper file


context menu: get + undo

context menu: get + undo

remote: Support for password authentication was removed on August 13, 2021.
remote: Please see https://docs.github.com/en/get-started/getting-started-with-git/about-remote-repositories#cloning-with-https-urls for information on currently recommended modes of authentication.
fatal: Authentication failed for 'https://github.com/ivangabriele/atom-tfs.git/'


move one card at a time on scroll

move one card at a time on scroll

--- client/main.coffee
+++ client/main.coffee
@@ -212,15 +212,20 @@
   maxHeight: ->
     400

-Template.vertical_narrative.events
+moveOneCardThrottled = _.throttle moveOneCard, 1000, trailing: false
+
+verticalNarrativeScrollHandler = (e) ->
+  wheelDeltaY = e.originalEvent.wheelDeltaY
+  if Math.abs(wheelDeltaY) > 30
+    moveOneCardThrottled wheelDeltaY
+  e.preventDefault()
+
+Template.vertical_narrative.events
+  'mousewheel': verticalNarrativeScrollHandler
   "click #card-down": ->
-    currentY = Session.get("currentY")
-    newY = currentY + 1
-    goToXY(0, newY)
   "click #card-up": ->
-    currentY = Session.get("currentY")
     newY = currentY - 1
-    goToXY(0, newY)
+    goUpOneCard()
   "click section": (d) ->
     $('#to-story, .attribution').fadeOut()
     srcE = if d.srcElement then d.srcElement else d.target


Fuckin' parametric site

Fuckin' parametric site

--- scripts/ayp.coffee
+++ scripts/ayp.coffee
@@ -16,7 +16,7 @@
 AYP_AWS_BUCKET = process.env.AYP_AWS_BUCKET

 # AYP The website hooks
-AYP_SITE = "http://ayp.wtf.cat/"
+AYP_SITE = process.env.AYP_SITE or "http://ayp.wtf.cat/"
 AYP_ENDPOINT = "#{AYP_SITE}new/"
 AYP_SECRET = process.env.AYP_SECRET


Add tests for partner page templates.

Add tests for partner page templates.

error: pathspec 'apps/partner/test/templates.coffee' did not match any file(s) known to git

--- apps/partner/test/templates.coffee
+++ apps/partner/test/templates.coffee
@@ -0,0 +1,41 @@
+jade            = require 'jade'
+path            = require 'path'
+fs              = require 'fs'
+Backbone        = require 'backbone'
+{ fabricate }   = require 'antigravity'
+Profile         = require '../../../models/profile'
+
+render = (templateName) ->
+  filename = path.resolve __dirname, "../templates/#{templateName}.jade"
+  jade.compile(
+    fs.readFileSync(filename),
+    { filename: filename }
+  )
+
+describe 'Partner header', ->
+  describe 'canonical links', ->
+    beforeEach ->
+      @profile = new Profile fabricate 'profile'
+
+    it 'has a canonical link to the full artist page on partner artist pages', ->
+      @template = render('index')(
+        profile: @profile
+        sd:
+          APP_URL: 'http://localhost:3004'
+          CURRENT_PATH: '/pace-gallery'
+        params:
+          id: 'pace-gallery'
+          artistId: 'yoshitomo-nara'
+      )
+      @template.should.include '<link rel="canonical" href="http://localhost:3004/artist/yoshitomo-nara">'
+
+    it 'has a canonical link to current url on other pages', ->
+      @template = render('index')(
+        profile: @profile
+        sd:
+          APP_URL: 'http://localhost:3004'
+          CURRENT_PATH: '/pace-gallery'
+        params:
+          id: 'pace-gallery'
+      )
+      @template.should.include '<link rel="canonical" href="http://localhost:3004/pace-gallery">'


Change the default key binding for pin to be <a-f>

See #926

--- background_scripts/commands.coffee
+++ background_scripts/commands.coffee
@@ -170,7 +170,7 @@
   "x": "removeTab"
   "X": "restoreTab"

-  ".": "togglePinTab"
+  "<a-p>": "togglePinTab"

   "o": "Vomnibar.activate"
   "O": "Vomnibar.activateInNewTab"


Adding a comprehension/jump test.

Adding a comprehension/jump test.

remote: Support for password authentication was removed on August 13, 2021.
remote: Please see https://docs.github.com/en/get-started/getting-started-with-git/about-remote-repositories#cloning-with-https-urls for information on currently recommended modes of authentication.
fatal: Authentication failed for 'https://github.com/maowug/coffeescript.git/'


Eliminate unverified jobs.

Eliminate unverified jobs.

remote: Support for password authentication was removed on August 13, 2021.
remote: Please see https://docs.github.com/en/get-started/getting-started-with-git/about-remote-repositories#cloning-with-https-urls for information on currently recommended modes of authentication.
fatal: Authentication failed for 'https://github.com/philbooth/GitHubReminder.git/'


payments: re add accidentally remove endpoint

remote: Support for password authentication was removed on August 13, 2021.
remote: Please see https://docs.github.com/en/get-started/getting-started-with-git/about-remote-repositories#cloning-with-https-urls for information on currently recommended modes of authentication.
fatal: Authentication failed for 'https://github.com/andrewjcasal/koding.git/'


Adds selectize coffeescript

Adds selectize coffeescript

remote: Support for password authentication was removed on August 13, 2021.
remote: Please see https://docs.github.com/en/get-started/getting-started-with-git/about-remote-repositories#cloning-with-https-urls for information on currently recommended modes of authentication.
fatal: Authentication failed for 'https://github.com/pisaq/para.git/'


create viewport class

create viewport class

error: pathspec 'src/game/Viewport.coffee' did not match any file(s) known to git

--- src/game/Viewport.coffee
+++ src/game/Viewport.coffee
@@ -0,0 +1,126 @@
+###*
+ # Represents a clipping viewport of the current scene
+ # Really useful when you got a playable character and want your world to move
+ # around him
+ # @class Rotten.Viewport
+###
+class Rotten.Viewport
+
+
+    ###*
+     # Constructs your viewport
+     # @constructor
+     # @param {Rotten.Game} game - Your current game
+     # @param {Object} options - { x: int, y: int, max_x: int, max_y: int, width: int, height: int }
+    ###
+    constructor: (@game, options) ->
+        if not options then options = {}
+
+        # X position of your viewport
+        @x = options.x or 0
+
+        # Y position of your viewport
+        @y = options.y or 0
+
+        # Max possible x position of viewport (usually end of current map)
+        @max_x = options.max_x or @game.render.getWidth()
+
+        # Max possible y position of viewport (usually end of current map)
+        @max_y = options.max_y or @game.render.getHeight()
+
+        # Viewport width
+        @width = options.width or @game.render.getWidth()
+
+        # Viewport height
+        @height = options.height or @game.render.getHeight()
+
+        # Whether viewport should actually move or not :
+        # When approaching walls, viewport should not show empty zone after map
+        # so basically, this avoid viewport to move if there's nothing behind
+        # the current max_x & max_y
+        @moving = false
+
+
+    ###*
+     # Move to a relative position
+     # @method move
+     # @param {int} x - X relative position
+     # @param {int} y - Y relative position
+    ###
+    move: (x, y) ->
+        @x+= x or 0
+        @y+= y or 0
+
+        @check()
+
+
+    ###*
+     # Move to an absolute position
+     # @method moveTo
+     # @param {int} x - X absolute position
+     # @param {int} y - Y absolute position
+    ###
+    moveTo: (x, y) ->
+        @x = x or @x
+        @y = y or @y
+
+        @check()
+
+
+    centerAround: (object) ->
+        @x = Math.floor object.x - @width / 2
+        @y = Math.floor object.y - @height / 2
+
+        @check()
+
+
+    ###*
+     # Check whether viewport should be moving or not
+     # Cannot think of something more accurate than this for now
+     # @TODO Find a way to make it better, lol
+     # @method check
+    ###
+    check: ->
+        moving_axis = 0
+
+        offset_x = @max_x - @width
+        offset_y = @max_y - @height
+
+        # Check x axis
+        if @x < 0 then @x = 0
+        else moving_axis++
+
+        if @x > offset_x then @x = offset_x
+        else moving_axis++
+
+        # Check y axis
+        if @y < 0 then @y = 0
+        else moving_axis++
+
+        if @y > offset_y then @y = offset_y
+        else moving_axis++
+
+        # Then
+        @moving = if moving_axis > 2 then true else false
+
+
+    ###*
+     # Draw object in viewport
+     # @method draw
+     # @param {Rotten.Drawable} object - Stuff to draw
+    ###
+    draw: (object) ->
+        @game.render.save()
+        @game.render.translate -@x, -@y
+
+        if @isPartlyInside object
+            object.draw()
+        @game.render.restore()
+
+
+    isPartlyInside: (object) ->
+        rect = object.rect()
+        rect.right = rect.x + rect.width
+        rect.bottom = rect.y + rect.height
+
+        return (rect.right >= @x) and (rect.x <= @x + @width) and (rect.bottom >= @y) and (rect.y <= @y + @height)


better dev process

better dev process

error: pathspec 'test/gulpfile.coffee' did not match any file(s) known to git

--- test/gulpfile.coffee
+++ test/gulpfile.coffee
@@ -0,0 +1,24 @@
+# copyright 2014 Jess Austin, all rights reserved
+
+gulp = require 'gulp'
+jade = require 'gulp-jade'
+map = require 'map-stream'
+coffee = require 'gulp-coffee'
+
+gulp.task 'coffee', ->
+  gulp.src '../gulp-nav.coffee'
+    .pipe coffee()
+    .pipe gulp.dest '..'
+
+gulp.task 'default', ['coffee'], ->
+  nav  = require '..'
+  gulp.src '**/*.jade'
+    .pipe nav()
+      # read the short_title and order vars from jade file
+#       vars = /(?:^|\n) *- *(var [^\n]*)(?:$|\n)/.exec file.contents.toString()
+#       eval vars[1]
+    .pipe map (file, callback) ->
+      console.log file.tree
+      callback null, file
+    .pipe jade pretty: true
+    .pipe gulp.dest 'dist'


reorder and clean connector's test

reorder and clean connector's test

--- test/connector_tests.coffee
+++ test/connector_tests.coffee
@@ -11,18 +11,34 @@
     before helpers.clearDB db
     before helpers.instantiateApp

-    before ->
-        data = [
+    before (done) ->
+        accounts = [
             { label: 'compte courant', balance: '1000' }
             { label: 'livret A', balance: '2000' }
         ]
-        indexer = fakeServer data, 200, (url, body) ->
+        operations = [
+            account: 'livret A'
+            label: 'remise cheque'
+            amount: '50.00'
+            date: '2012-12-31T00:00:00Z'
+        ,
+            account: 'livret A'
+            label: 'achat supermarche'
+            amount: '-100.00'
+            date: '2012-12-31T00:00:00Z'
+        ]
+        indexer = fakeServer null, 200, (url, body) ->

             if url is '/connectors/bank/bnp/'
                 should.exist body.login
                 should.exist body.password
+                return accounts
+            if url is '/connectors/bank/bnp/history/'
+                should.exist body.login
+                should.exist body.password
+                return operations

-        @indexerServer = indexer.listen 9092
+        @indexerServer = indexer.listen 9092, done

     after ->
         @indexerServer.close()
@@ -31,7 +47,7 @@
     after helpers.clearDB db

-    describe 'Bank account data retrieval', ->
+    describe 'Bank accounts data retrieval', ->

         it 'When I send a request for my bank account data', (done) ->
             data =
@@ -51,37 +67,8 @@
             @body[1].label.should.equal 'livret A'
             @body[1].balance.should.equal '2000'

-describe 'Connectors - Bank History', ->

-    # Start application before starting tests.
-    before helpers.instantiateApp
-
-    before ->
-        data = [
-            account: 'livret A'
-            label: 'remise cheque'
-            amount: '50.00'
-            date: '2012-12-31T00:00:00Z'
-        ,
-            account: 'livret A'
-            label: 'achat supermarche'
-            amount: '-100.00'
-            date: '2012-12-31T00:00:00Z'
-        ]
-        indexer = fakeServer data, 200, (url, body) ->
-            if url is '/connectors/bank/bnp/history/'
-                should.exist body.login
-                should.exist body.password
-
-        @indexerServer = indexer.listen 9092
-
-    after ->
-        @indexerServer.close()
-
-    after helpers.closeApp
-
-
-    describe 'Bank account data retrieval', ->
+    describe 'Bank operations data retrieval', ->

         it 'When I send a request for my bank account data', (done) ->
             data =


CLASSIC OFF BY ONE. :gun: :head:

CLASSIC OFF BY ONE. :gun: :head:

Lern 2 count

--- scripts/ayp.coffee
+++ scripts/ayp.coffee
@@ -105,7 +105,7 @@
     fs.readdir BG_BASE, (err, files) ->
       cb(err, null) if err
       files = files.filter (f) -> f[0] != '.'
-      selected = files[Math.round(Math.random() * files.length)]
+      selected = files[Math.round(Math.random() * (files.length - 1))]
       ext = selected[-3..].toLowerCase()
       loader = loaders[ext]


Only say one thing

Only say one thing

--- scripts/ayp.coffee
+++ scripts/ayp.coffee
@@ -132,15 +132,20 @@
             s3.put name, info, (err) ->
               return msg.reply "Woooops! Failed to upload: #{err}" if err
               strip_url = "http://s3.amazonaws.com/#{AYP_AWS_BUCKET}/#{name}"
-              msg.reply "I made a thing: #{strip_url}"

               # Now let's tell `ayp.wtf.cat` about our great work here
-              return msg.reply "I'd update the site, but I don't know the secret :(" unless AYP_SECRET
+              return msg.reply "I'd update the site, but I don't know the secret :( Though, the image is #{strip_url}" unless AYP_SECRET
               robot.http(AYP_ENDPOINT).
                 header('Content-Type', 'application/json').
                 post JSON.stringify(url: strip_url, time: now, secret: AYP_SECRET), (err, res, body) ->
                   return msg.reply "Bad news. I was fed shit when I tried to update the site: #{err}" if err
-                  msg.reply "GOOD NEWS EVERYONE: #{AYP_SITE} got some fresh data"
+                  prefix = msg.random [
+                    "GOOD NEWS EVERYONE:",
+                    "This is awkward...",
+                    "Turns out,",
+                    "Despite my best efforts",
+                  ]
+                  msg.reply "#{prefix} #{AYP_SITE}/at/#{now}/ is now -> #{strip_url}"

 # This wraps up everything that builds the image strips of the comic
 #


Social: create helper for fetching the group

error: pathspec 'workers/social/lib/social/models/socialapi/message.coffee' did not match any file(s) known to git

--- workers/social/lib/social/models/socialapi/message.coffee
+++ workers/social/lib/social/models/socialapi/message.coffee
@@ -0,0 +1,109 @@
+Bongo          = require "bongo"
+{Relationship} = require "jraphical"
+request        = require 'request'
+
+{secure, daisy, dash, signature, Base} = Bongo
+{uniq} = require 'underscore'
+
+
+module.exports = class SocialMessage extends Base
+  @share()
+
+  @set
+    sharedMethods :
+      static   :
+        post   :
+          (signature Object, Function)
+        reply  :
+          (signature Object, Function)
+        edit   :
+          (signature Object, Function)
+        delete :
+          (signature Object, Function)
+        like   :
+          (signature Object, Function)
+        unlike :
+          (signature Object, Function)
+
+    schema          :
+      id               : Number
+      body             : String
+      accountId        : Number
+      initialChannelId : Number
+      createdAt        : Date
+      updatedAt        : Date
+
+  JAccount = require '../account'
+
+  {fetchGroup} = require "./helper"
+
+  @ensureGroupChannel = (client, callback)->
+    fetchGroup client, (err, group)->
+      return callback err  if err
+      group.createSocialApiChannelId (err, socialApiChannelId)->
+        return callback err  if err
+        callback null, socialApiChannelId
+
+  @post = secure (client, data, callback)->
+    {connection:{delegate}} = client
+    delegate.createSocialApiId (err, socialApiId)->
+      return callback err if err
+      SocialMessage.ensureGroupChannel client, (err, socialApiChannelId)->
+        return callback err  if err
+        {postToChannel} = require './requests'
+
+        data.channelId = socialApiChannelId
+        data.accountId = socialApiId
+
+        postToChannel data, (err, activities)->
+          callback err, activities
+
+  @reply = secure (client, data, callback)->
+    {connection:{delegate}} = client
+    delegate.createSocialApiId (err, socialApiId)=>
+      return callback err if err
+      if not data.messageId or not data.body
+        return callback { message: "Request is not valid for add a reply to the message" }
+      data.accountId = socialApiId
+      (require './requests').addReply data, (err, result)->
+        callback err, result
+
+  # todo add permission here
+  @edit = secure (client, data, callback)->
+    if not data.body or not data.id
+      return callback { message: "Request is not valid for editing a message"}
+    {editMessage} = require './requests'
+    editMessage data, (err, activities)->
+      callback err, activities
+
+  # todo add permission here
+  @delete = secure (client, data, callback)->
+    if not data.id
+      return callback { message: "Request is not valid for deleting a message"}
+    {deleteMessage} = require './requests'
+    deleteMessage data, (err, activities)->
+      callback err, activities
+
+  # todo add permission here
+  @like = secure (client, data, callback)->
+    {connection:{delegate}} = client
+    delegate.createSocialApiId (err, socialApiId)=>
+      return callback err if err
+      if not data.id
+        return callback { message: "Request is not valid for liking a message"}
+      data.accountId = socialApiId
+      {likeMessage} = require './requests'
+      likeMessage data, (err, result)->
+        callback err, result
+
+  # todo add permission here
+  @unlike = secure (client, data, callback)->
+    {connection:{delegate}} = client
+    delegate.createSocialApiId (err, socialApiId)=>
+      return callback err if err
+      if not data.id
+        return callback { message: "Request is not valid for unliking a message"}
+      data.accountId = socialApiId
+      {unlikeMessage} = require './requests'
+      unlikeMessage data, (err, result)->
+        callback err, result


document analytics code

document analytics code

remote: Support for password authentication was removed on August 13, 2021.
remote: Please see https://docs.github.com/en/get-started/getting-started-with-git/about-remote-repositories#cloning-with-https-urls for information on currently recommended modes of authentication.
fatal: Authentication failed for 'https://github.com/caffeinelabs/channel.build.git/'


commits table component to support pagination [#67023622]

remote: Support for password authentication was removed on August 13, 2021.
remote: Please see https://docs.github.com/en/get-started/getting-started-with-git/about-remote-repositories#cloning-with-https-urls for information on currently recommended modes of authentication.
fatal: Authentication failed for 'https://github.com/netguru/review.git/'


fix eui-modal-open class not getting removed when programatic modal is closed

remote: Support for password authentication was removed on August 13, 2021.
remote: Please see https://docs.github.com/en/get-started/getting-started-with-git/about-remote-repositories#cloning-with-https-urls for information on currently recommended modes of authentication.
fatal: Authentication failed for 'https://github.com/artsyca/emberui.git/'


Chests working.

Chests working.

remote: Support for password authentication was removed on August 13, 2021.
remote: Please see https://docs.github.com/en/get-started/getting-started-with-git/about-remote-repositories#cloning-with-https-urls for information on currently recommended modes of authentication.
fatal: Authentication failed for 'https://github.com/4eek/unknown.git/'


koding vagrant config

koding vagrant config


Added login form handler

Added login form handler

remote: Support for password authentication was removed on August 13, 2021.
remote: Please see https://docs.github.com/en/get-started/getting-started-with-git/about-remote-repositories#cloning-with-https-urls for information on currently recommended modes of authentication.
fatal: Authentication failed for 'https://github.com/mcervco/miguelcervantesco.git/'


some fix

some fix

remote: Support for password authentication was removed on August 13, 2021.
remote: Please see https://docs.github.com/en/get-started/getting-started-with-git/about-remote-repositories#cloning-with-https-urls for information on currently recommended modes of authentication.
fatal: Authentication failed for 'https://github.com/Akravish/developer_starter_kit.git/'


missing imports

missing imports

--- lib/ensime-server-update.coffee
+++ lib/ensime-server-update.coffee
@@ -1,7 +1,8 @@
 {packageDir, mkClasspathFileName, log} = require './utils'
 EnsimeServerUpdateLogView = require './views/ensime-server-update-log-view'
 {spawn} = require('child_process')
-
+fs = require('fs')
+path = require('path')

 createSbtClasspathBuild = (scalaVersion, ensimeServerVersion, classpathFile) ->
   """


delay

delay

remote: Support for password authentication was removed on August 13, 2021.
remote: Please see https://docs.github.com/en/get-started/getting-started-with-git/about-remote-repositories#cloning-with-https-urls for information on currently recommended modes of authentication.
fatal: Authentication failed for 'https://github.com/drsdrs/dooropener.git/'


try hardcoding rootUrl

try hardcoding rootUrl

error: pathspec 'raw/lib/main.coffee' did not match any file(s) known to git

--- raw/lib/main.coffee
+++ raw/lib/main.coffee
@@ -0,0 +1,3 @@
+Meteor.absoluteUrl({
+  rootUrl:"http://52.10.14.68"
+});


Going back to the list of examples

Going back to the list of examples

remote: Support for password authentication was removed on August 13, 2021.
remote: Please see https://docs.github.com/en/get-started/getting-started-with-git/about-remote-repositories#cloning-with-https-urls for information on currently recommended modes of authentication.
fatal: Authentication failed for 'https://github.com/AppGyver/kitchensink.git/'


detect logout on request and send to login page

add logout detection

remote: Support for password authentication was removed on August 13, 2021.
remote: Please see https://docs.github.com/en/get-started/getting-started-with-git/about-remote-repositories#cloning-with-https-urls for information on currently recommended modes of authentication.
fatal: Authentication failed for 'https://github.com/clochix/cozy-home.git/'


Update rude.coffee

Update rude.coffee

remote: Support for password authentication was removed on August 13, 2021.
remote: Please see https://docs.github.com/en/get-started/getting-started-with-git/about-remote-repositories#cloning-with-https-urls for information on currently recommended modes of authentication.
fatal: Authentication failed for 'https://github.com/gilhooley/borgbot.git/'


[parser] Assign numeric names to symbols

remote: Support for password authentication was removed on August 13, 2021.
remote: Please see https://docs.github.com/en/get-started/getting-started-with-git/about-remote-repositories#cloning-with-https-urls for information on currently recommended modes of authentication.
fatal: Authentication failed for 'https://github.com/demhydraz/cafe.git/'


[parser] Bring back the other symbol-isation


Forgot to add quittin-time script

Forgot to add quittin-time script

error: pathspec 'scripts/quittin-time.coffee' did not match any file(s) known to git

--- scripts/quittin-time.coffee
+++ scripts/quittin-time.coffee
@@ -0,0 +1,26 @@
+# Description:
+#   Hubot tells you if it's quittin' time
+#
+# Dependencies:
+#   None
+#
+# Configuration:
+#   None
+#
+# Commands:
+#   hubot is it quittin' time - Tells you if it's quittin' time
+#
+# Author:
+#   mottum
+
+responses = [
+  "winners never quit and quitters never win",
+  "it's five o'clock somewhere!",
+  "let me check my watch...yup, it's beer o'clock",
+  "ask your manager",
+  "yeah! let's head to Prizefighter!"
+]
+
+module.exports = (robot) ->
+  robot.respond /.* is it quittin[g']? time\??/i, (msg) ->
+    msg.reply msg.random responses


Fixes tinymce bug:
    On using the image plugin, the image was not appearing in the
    visual editor immediately after using the command.

    Selenium test added.

remote: Support for password authentication was removed on August 13, 2021.
remote: Please see https://docs.github.com/en/get-started/getting-started-with-git/about-remote-repositories#cloning-with-https-urls for information on currently recommended modes of authentication.
fatal: Authentication failed for 'https://github.com/bmedx/modulestore.git/'


fixed code style on servers.lib.server.humanstxt.coffee

--- servers/lib/server/humanstxt.coffee
+++ servers/lib/server/humanstxt.coffee
@@ -1,17 +1,17 @@
 bongo = require './bongo'

-generateHumanstxt = (req, res)->
-  {JAccount}       = bongo.models
-  JAccount.some {'globalFlags': 'staff'}, {}, (err, accounts)->
+generateHumanstxt = (req, res) ->
+  { JAccount }       = bongo.models
+  JAccount.some { 'globalFlags': 'staff' }, {}, (err, accounts) ->
     if err or not accounts
       return res.status(500).end()
     else
-      body = ""
+      body = ''
       for acc in accounts

         if acc?.profile?.nickname?
-          {firstName, lastName, nickname} = acc.profile
-          person = ""
+          { firstName, lastName, nickname } = acc.profile
+          person = ''
           if firstName
             person = "#{firstName} "
             person += "#{lastName}\n" if lastName
@@ -21,10 +21,11 @@

           if acc?.locationTags?
             person +=  "Location: #{acc.locationTags}\n"
-          person += "\n"
+          person += '\n'

           body += person

+      # coffeelint: disable=no_unnecessary_double_quotes
       header =
         """
         /* TEAM */
@@ -55,8 +56,10 @@
                                                   /\\____/
                                                   \\_/__/
         """
+      # coffeelint: enable=no_unnecessary_double_quotes
+
       content = header + body + footer
       res.setHeader 'Content-Type', 'text/plain'
       return res.status(200).send content

-module.exports = { generateHumanstxt }+module.exports = { generateHumanstxt }


add @no_team_users update method

add @no_team_users update method

[#77265396]

remote: Support for password authentication was removed on August 13, 2021.
remote: Please see https://docs.github.com/en/get-started/getting-started-with-git/about-remote-repositories#cloning-with-https-urls for information on currently recommended modes of authentication.
fatal: Authentication failed for 'https://github.com/netguru/people.git/'


Tweaked lights a bit.

Tweaked lights a bit.


modf and mod snippets

modf and mod snippets

remote: Support for password authentication was removed on August 13, 2021.
remote: Please see https://docs.github.com/en/get-started/getting-started-with-git/about-remote-repositories#cloning-with-https-urls for information on currently recommended modes of authentication.
fatal: Authentication failed for 'https://github.com/AlexKVal/dotfiles.git/'


[added] 'fa-icon' snippet

[added] 'fa-icon' snippet


Removing leading and trailing new lines from snippets.

/bin/sh: 1: Syntax error: "(" unexpected


update tests

update tests


add in click event handlers for backbone-projects view for some reason we lost them

remote: Support for password authentication was removed on August 13, 2021.
remote: Please see https://docs.github.com/en/get-started/getting-started-with-git/about-remote-repositories#cloning-with-https-urls for information on currently recommended modes of authentication.
fatal: Authentication failed for 'https://github.com/kristenhazard/epm-catalog.git/'


initial

initial

error: pathspec 'coffee/test/asyncTest.coffee' did not match any file(s) known to git

--- coffee/test/asyncTest.coffee
+++ coffee/test/asyncTest.coffee
@@ -0,0 +1,78 @@
+_async = require 'async'
+
+_ = require 'lodash'
+{assert} = require 'chai'
+{deepEqual,isNull} = assert
+
+asyncFunction = (msec,cb)->
+  setTimeout ()->
+    cb null, msec / 1000
+  ,msec
+
+describe "async test (Collections)", ->
+  it "map(coll, iteratee, callback)",(done) ->
+    # 処理は並列で行われるが、resultsは順番通りに返る
+    arr = []
+    _async.map [200,400,100],(msec,next)->
+      asyncFunction msec,(err,sec)->
+        return next err if err
+        arr.push msec
+        next(null,sec)
+    ,(err,results)->
+      isNull err
+      deepEqual arr,[ 100,200,400 ]
+      deepEqual results,[ 0.2, 0.4, 0.1 ]
+      done()
+  it "mapLimit(coll, limit, iteratee, callback)",(done) ->
+    # 処理はLimit数まで並列で行われる
+    # 処理が終わったら随時次の処理を行う
+    arr = []
+    _async.mapLimit [200,400,50,100],2,(msec,next)->
+      asyncFunction msec,(err,sec)->
+        return next err if err
+        arr.push msec
+        next(null,sec)
+    ,(err,results)->
+      isNull err
+      deepEqual arr,[ 200,50,100,400 ]
+      # !!!: ↑間隔が狭すぎると順番が変わることがある
+      deepEqual results,[ 0.2, 0.4,0.05, 0.1 ]
+      done()
+  it "mapSeries(coll, iteratee, callback)",(done) ->
+    # 処理が終わるのを待ってから次の処理を行う
+    arr = []
+    _async.mapSeries [200,400,100],(msec,next)->
+      asyncFunction msec,(err,sec)->
+        return next err if err
+        arr.push msec
+        next(null,sec)
+    ,(err,results)->
+      isNull err
+      deepEqual arr,[ 200,400,100 ]
+      deepEqual results,[ 0.2, 0.4, 0.1 ]
+      done()
+  it "mapValues(obj, iteratee, callbackopt)",(done) ->
+    # 第一引数はArrayではなくObject
+    # 処理は並列で行われる
+    vals = []
+    keys = []
+    _async.mapValues {
+      f1:200
+      f2:400
+      f3:100
+      },(val,key,next)->
+        asyncFunction val,(err,sec)->
+          return next err if err
+          vals.push val
+          keys.push key
+          next(null,sec)
+          # 返り値はObjectになる(Arrayではない)
+          # この場合{key:sec}がmergeされる
+    ,(err,result)->
+      isNull err
+      deepEqual vals,[ 100,200,400 ]
+      deepEqual keys,[ 'f3','f1','f2' ]
+      deepEqual result,{ f3: 0.1, f1: 0.2, f2: 0.4 }
+      done()
+  it "mapValuesLimit(obj, limit, iteratee, callback)"
+  it "mapValuesSeries(obj, iteratee, callback)"


Add ostest.coffee with the same functionality as ostest.js.

error: pathspec 'ostest.coffee' did not match any file(s) known to git

--- ostest.coffee
+++ ostest.coffee
@@ -0,0 +1,91 @@
+#!/usr/bin/env coffee
+
+"""
+Linux        ->   22 -> green
+Windows 8    ->  135 -> blue
+Windows 7    -> 3389 -> cyan
+Server       -> 1022 -> magenta
+Camera       ->  554 -> yellow
+Unresponsive -> ???? -> red
+"""
+
+fs = require 'fs'
+net = require 'net'
+async = require 'async'
+colors = require 'colors'
+
+ports = [22, 135, 3389, 1022, 554]
+timeout = 40
+
+portProbe = (port, host, timeout, callback) ->
+  socket = new net.Socket()
+  status = null
+  error = null
+
+  socket.setTimeout timeout
+
+  socket.on 'connect', () ->
+    status = 'open'
+    socket.destroy()
+
+  socket.on 'timeout', () ->
+    status = 'closed'
+    socket.destroy()
+
+  socket.on 'error', (exception) ->
+    error = exception
+    status = 'closed'
+
+  socket.on 'close', () ->
+    callback error, status
+
+  socket.connect port, host
+
+osTest = (ports, host, timeout, callback) ->
+  foundPort = false
+  numberOfPortsChecked = 0
+  portIndex = 0
+  port = ports[portIndex]
+
+  if host == ''
+    return
+
+  hasFoundPort = () ->
+    return foundPort or numberOfPortsChecked is (ports.length - 1)
+
+  checkNextPort = (callback) ->
+    portProbe port, host, timeout, (error, statusOfPort) ->
+      numberOfPortsChecked++
+      if statusOfPort is 'open'
+        foundPort = true
+        callback error
+      else
+        portIndex++
+        port = ports[portIndex]
+        callback null
+
+  async.until hasFoundPort, checkNextPort, (error) ->
+    if error
+      callback error, port
+    else if foundPort
+      callback null, port
+    else
+      callback null, false
+
+processHost = (host) ->
+  osTest ports, host, timeout, (error, port) ->
+    if port is false
+      console.log host.red
+    else
+      switch port
+        when 22 then console.log host.green
+        when 135 then console.log host.blue
+        when 3389 then console.log host.cyan
+        when 1022 then console.log  host.magenta
+        when 554 then console.log host.yellow
+        else console.log host.red
+
+fs.readFile process.argv[2], 'utf-8', (err, data) ->
+  if err then throw err
+  hosts = data.toString().split '\n'
+  hosts.forEach processHost


Create main.coffee

Create main.coffee

error: pathspec 'lib/main.coffee' did not match any file(s) known to git

--- lib/main.coffee
+++ lib/main.coffee
@@ -0,0 +1,72 @@
+fs = require 'fs'
+path = require 'path'
+
+keywordSelectorPrefixPattern = /([a-zA-Z]+)\s*$/
+
+module.exports =
+  selector: '.source.r'
+  disableForSelector: '.source.r .comment'
+  filterSuggestions: true
+
+  getSuggestions: (request) ->
+    completions = null
+    {prefix} = request
+    scopes = request.scopeDescriptor.getScopesArray()
+
+    if @isCompletingKeywordSelector(request)
+      keywordCompletions = @getKeywordCompletions(request)
+      if keywordCompletions?.length
+        completions ?= []
+        completions = completions.concat(keywordCompletions)
+
+    completions
+
+  onDidInsertSuggestion: ({editor, suggestion}) ->
+    setTimeout(@triggerAutocomplete.bind(this, editor), 1) if suggestion.type is 'property'
+
+  triggerAutocomplete: (editor) ->
+    atom.commands.dispatch(atom.views.getView(editor), 'autocomplete-plus:activate', {activatedManually: false})
+
+  loadKeywords: ->
+    @keywords = {}
+    fs.readFile path.resolve(__dirname, '..', 'completions.json'), (error, content) =>
+      {@keywords} = JSON.parse(content) unless error?
+      return
+
+  isCompletingKeywordSelector: ({editor, scopeDescriptor, bufferPosition}) ->
+    scopes = scopeDescriptor.getScopesArray()
+    keywordSelectorPrefix = @getKeywordSelectorPrefix(editor, bufferPosition)
+    return false unless keywordSelectorPrefix?.length
+
+    true
+
+  getKeywordCompletions: ({bufferPosition, editor, prefix}) ->
+    completions = []
+    for keyword, options of @keywords when firstCharsEqual(keyword, prefix)
+      completions.push(@buildKeywordCompletion(keyword, options))
+    completions
+
+  getKeywordSelectorPrefix: (editor, bufferPosition) ->
+    line = editor.getTextInRange([[bufferPosition.row, 0], bufferPosition])
+    keywordSelectorPrefixPattern.exec(line)?[1]
+
+  buildKeywordCompletion: (keyword, {snippet, displayText, descriptionMoreURL, description, leftLabel}) ->
+    completion =
+      description: description
+      descriptionMoreURL: descriptionMoreURL
+
+    if displayText?.length
+      completion.displayText = displayText
+
+    if leftLabel?.length
+      completion.leftLabel = leftLabel
+
+    if snippet?.length
+      completion.snippet = snippet
+    else
+      completion.text = "#{keyword}"
+
+    completion
+
+firstCharsEqual = (str1, str2) ->
+  str1[0] is str2[0]


Use helper for mock creation and add resolution value test.

remote: Support for password authentication was removed on August 13, 2021.
remote: Please see https://docs.github.com/en/get-started/getting-started-with-git/about-remote-repositories#cloning-with-https-urls for information on currently recommended modes of authentication.
fatal: Authentication failed for 'https://github.com/JoshuaToenyes/stout-core.git/'


update demo for new assembler features.

update demo for new assembler features.

remote: Support for password authentication was removed on August 13, 2021.
remote: Please see https://docs.github.com/en/get-started/getting-started-with-git/about-remote-repositories#cloning-with-https-urls for information on currently recommended modes of authentication.
fatal: Authentication failed for 'https://github.com/robey/carrot16.git/'


Remove within one point validation, yay

Remove within one point validation, yay

remote: Support for password authentication was removed on August 13, 2021.
remote: Please see https://docs.github.com/en/get-started/getting-started-with-git/about-remote-repositories#cloning-with-https-urls for information on currently recommended modes of authentication.
fatal: Authentication failed for 'https://github.com/UM-USElab/gradecraft-development.git/'


Add atom package list for syncing

Add atom package list for syncing

Signed-off-by: Thanh Ha <ddef40ffcf330e0c1e91b15bb1b0d4953f1680d8@linux.com>

remote: Support for password authentication was removed on August 13, 2021.
remote: Please see https://docs.github.com/en/get-started/getting-started-with-git/about-remote-repositories#cloning-with-https-urls for information on currently recommended modes of authentication.
fatal: Authentication failed for 'https://github.com/zxiiro/dotfiles.git/'


Remove "[object Object]" output from tests

--- spec/app/root-view-spec.coffee
+++ spec/app/root-view-spec.coffee
@@ -89,7 +89,6 @@
           expect(rootView.getEditors().length).toBe 0

           viewState = rootView.serialize()
-          console.log viewState
           rootView.deactivate()
           window.rootView = RootView.deserialize(viewState)


Add spec only for merge tests

Add spec only for merge tests

error: pathspec 'specs/access/merge.spec.coffee' did not match any file(s) known to git

--- specs/access/merge.spec.coffee
+++ specs/access/merge.spec.coffee
@@ -0,0 +1,28 @@
+{ A, _ } = h = require('../test-helper')
+require('../live-db')
+
+TableGateway = h.requireSrc('access/table-gateway')
+ActiveRecord = h.requireSrc('access/active-record')
+
+testData = h.testData
+db = schema = tables = null
+
+before () ->
+    db = h.liveDb
+    schema = db.schema
+    tables = schema.tablesByMany
+
+describe('Merge', () ->
+    it('merges an array of data', (done) ->
+        A.series([
+            (cb) -> db.fighters.deleteMany(id: ">": 0, cb)
+            (cb) -> db.fighters.merge(testData.fighters, cb)
+            (cb) -> db.fighters.all(cb)
+        ], (err, results) ->
+            return done(err) if err?
+            fighters = results[2]
+            fighters.length.should.eql(4)
+            done()
+        )
+    )
+)


Add a Selection menu

Add a Selection menu

--- menus/base.cson
+++ menus/base.cson
@@ -95,6 +95,25 @@
   }

   {
+    label: 'Selection'
+    submenu: [
+      { label: 'Add Selection Above', command: 'editor:add-selection-above' }
+      { label: 'Add Selection Below', command: 'editor:add-selection-below' }
+      { type: 'separator' }
+      { label: 'Select to Top', command: 'core:select-to-top' }
+      { label: 'Select to Bottom', command: 'core:select-to-bottom' }
+      { type: 'separator' }
+      { label: 'Select Line', command: 'editor:select-line' }
+      { label: 'Select Word', command: 'editor:select-word' }
+      { label: 'Select to Beginning of Word', command: 'editor:select-to-beginning-of-word' }
+      { label: 'Select to Beginning of Line', command: 'editor:select-to-beginning-of-line' }
+      { label: 'Select to First Character of Line', command: 'editor:select-to-first-character-of-line' }
+      { label: 'Select to End of Word', command: 'editor:select-to-end-of-word' }
+      { label: 'Select to End of Line', command: 'editor:select-to-end-of-line' }
+    ]
+  }
+
+  {
     label: 'View'
     submenu: [
       { label: 'Reload', command: 'window:reload' }


Add "request" event firing.

Add "request" event firing.


Simplify auto reconnect

Simplify auto reconnect

remote: Support for password authentication was removed on August 13, 2021.
remote: Please see https://docs.github.com/en/get-started/getting-started-with-git/about-remote-repositories#cloning-with-https-urls for information on currently recommended modes of authentication.
fatal: Authentication failed for 'https://github.com/caresx/PO-Client-Tools.git/'


deprecate obsoleted isStarted

deprecate obsoleted isStarted

remote: Support for password authentication was removed on August 13, 2021.
remote: Please see https://docs.github.com/en/get-started/getting-started-with-git/about-remote-repositories#cloning-with-https-urls for information on currently recommended modes of authentication.
fatal: Authentication failed for 'https://github.com/AppGyver/supersonic.git/'


fix: correct syntax error for optHeigh

fix: correct syntax error for optHeigh

fixes #586

--- src/dropzone.coffee
+++ src/dropzone.coffee
@@ -234,7 +234,7 @@
       info.optWidth = @options.thumbnailWidth
       info.optHeight = @options.thumbnailHeight

-      if not (info.optWidth? and info.optHeigh?)
+      if not (info.optWidth? and info.optHeight?)
         # automatically calculate dimensions if not specified
         if not info.optWidth? and not info.optHeight?
           info.optWidth = info.srcWidth


I hate Mac. 10.10

I hate Mac. 10.10

--- views/components/main/parts/miniship.cjsx
+++ views/components/main/parts/miniship.cjsx
@@ -294,69 +294,67 @@
           shipInfo = $ships[ship.api_ship_id]
           shipType = $shipTypes[shipInfo.api_stype].api_name
           status = getStatusArray shipId
-          [
-

-              <OverlayTrigger placement="top" overlay={
-                <Popover className="ship-pop">
-

-

-                      <Slotitems data={ship.api_slot.concat(ship.api_slot_ex || -1)} onslot={ship.api_onslot} maxeq={ship.api_maxeq} />
+

+            <OverlayTrigger placement="top" overlay={
+              <Popover className="ship-pop">
+

+

+                    <Slotitems data={ship.api_slot.concat(ship.api_slot_ex || -1)} onslot={ship.api_onslot} maxeq={ship.api_maxeq} />
+

+

+

+

+
+                        {ship.api_fuel} / {shipInfo.api_fuel_max}
+

+

+                        <ProgressBar bsStyle={getMaterialStyle ship.api_fuel / shipInfo.api_fuel_max * 100}
+                                     now={ship.api_fuel / shipInfo.api_fuel_max * 100} />
+

-

-

-

-
-                          {ship.api_fuel} / {shipInfo.api_fuel_max}
-

-

-                          <ProgressBar bsStyle={getMaterialStyle ship.api_fuel / shipInfo.api_fuel_max * 100}
-                                       now={ship.api_fuel / shipInfo.api_fuel_max * 100} />
-

+

+

+
+                        {ship.api_bull} / {shipInfo.api_bull_max}

-

-

-
-                          {ship.api_bull} / {shipInfo.api_bull_max}
-

-

-                          <ProgressBar bsStyle={getMaterialStyle ship.api_bull / shipInfo.api_bull_max * 100}
-                                       now={ship.api_bull / shipInfo.api_bull_max * 100} />
-

+

+                        <ProgressBar bsStyle={getMaterialStyle ship.api_bull / shipInfo.api_bull_max * 100}
+                                     now={ship.api_bull / shipInfo.api_bull_max * 100} />

-                </Popover>
-              }>
-

-

-

-
-                        {shipInfo.api_name}
-
-
-                        {ship.api_nowhp} / {ship.api_maxhp}
-
-

-
-                          ★{ship.api_cond}
-
-

-

-

-

-

-
-                        Lv. {ship.api_lv} ({ship.api_exp[1]})
-
-
-                        <ProgressBar bsStyle={getHpStyle ship.api_nowhp / ship.api_maxhp * 100} now={ship.api_nowhp / ship.api_maxhp * 100} />
+

+              </Popover>
+            }>
+

+

+

+
+                      {shipInfo.api_name}
+
+
+                      {ship.api_nowhp} / {ship.api_maxhp}
+
+

+
+                        ★{ship.api_cond}

-              </OverlayTrigger>
-

-          ]
+

+

+
+                      Lv. {ship.api_lv} ({ship.api_exp[1]})
+
+
+                      <ProgressBar bsStyle={getHpStyle ship.api_nowhp / ship.api_maxhp * 100} now={ship.api_nowhp / ship.api_maxhp * 100} />
+
+

+

+

+            </OverlayTrigger>
+

       }


Track pageviews for manual calls to navigate

--- app/core/Router.coffee
+++ app/core/Router.coffee
@@ -206,6 +206,7 @@
     if (e.route is document.location.pathname) and not manualView
       return document.location.reload()
     @navigate e.route, {trigger: not manualView}
+    @_trackPageView()
     return unless manualView
     if e.viewClass
       args = e.viewArgs or []


added file

added file

remote: Support for password authentication was removed on August 13, 2021.
remote: Please see https://docs.github.com/en/get-started/getting-started-with-git/about-remote-repositories#cloning-with-https-urls for information on currently recommended modes of authentication.
fatal: Authentication failed for 'https://github.com/jonasby/trello-sprints.git/'


comments factory

comments factory

error: pathspec 'tests/factories/comments.coffee' did not match any file(s) known to git

--- tests/factories/comments.coffee
+++ tests/factories/comments.coffee
@@ -0,0 +1,5 @@
+module.exports =
+  Factory.define 'comment'
+    .sequence 'id'
+    .sequence 'content', (n) -> "Op! #{n}"
+


Align file->commands for readability

Align file->commands for readability

remote: Support for password authentication was removed on August 13, 2021.
remote: Please see https://docs.github.com/en/get-started/getting-started-with-git/about-remote-repositories#cloning-with-https-urls for information on currently recommended modes of authentication.
fatal: Authentication failed for 'https://github.com/rafalprzywarski/test-status.git/'


Fix archive view status on userstory editing

--- app/coffee/modules/kanban/main.coffee
+++ app/coffee/modules/kanban/main.coffee
@@ -138,13 +138,20 @@
             @scope.userstories = userstories

             usByStatus = _.groupBy(userstories, "status")
+            us_archived = []
             for status in @scope.usStatusList
                 if not usByStatus[status.id]?
                     usByStatus[status.id] = []
+                if @scope.usByStatus?
+                    for us in @scope.usByStatus[status.id]
+                        if us.status != status.id
+                            us_archived.push(us)

                 # Must preserve the archived columns if loaded
-                if status.is_archived and @scope.usByStatus?
-                    usByStatus[status.id]  = @scope.usByStatus[status.id]
+                if status.is_archived and @scope.usByStatus? and @scope.usByStatus[status.id].length != 0
+                    for us in @scope.usByStatus[status.id].concat(us_archived)
+                        if us.status == status.id
+                            usByStatus[status.id].push(us)

                 usByStatus[status.id] = _.sortBy(usByStatus[status.id], "kanban_order")


Work around chromium bug where focus gets stolen from shadow DOM

Fixes #4255

--- src/text-editor-element.coffee
+++ src/text-editor-element.coffee
@@ -103,7 +103,9 @@
     )
     @component = React.renderComponent(@componentDescriptor, @rootElement)

-    unless @useShadowDOM
+    if @useShadowDOM
+      @shadowRoot.addEventListener('blur', @shadowRootBlurred.bind(this), true)
+    else
       inputNode = @component.refs.input.getDOMNode()
       inputNode.addEventListener 'focus', @focused.bind(this)
       inputNode.addEventListener 'blur', => @dispatchEvent(new FocusEvent('blur', bubbles: false))
@@ -127,6 +129,16 @@
         return

     @component?.blurred()
+
+  # Work around what seems to be a bug in Chromium. Focus can be stolen from the
+  # hidden input when clicking on the gutter and transferred to the
+  # already-focused host element. The host element never gets a 'focus' event
+  # however, which leaves us in a limbo state where the text editor element is
+  # focused but the hidden input isn't focused. This always refocuses the hidden
+  # input if a blur event occurs in the shadow DOM that is transferring focus
+  # back to the host element.
+  shadowRootBlurred: (event) ->
+    @component.focused() if event.relatedTarget is this

   addGrammarScopeAttribute: ->
     grammarScope = @model.getGrammar()?.scopeName?.replace(/\./g, ' ')


New function added to lib.coffee for showing notification...

remote: Support for password authentication was removed on August 13, 2021.
remote: Please see https://docs.github.com/en/get-started/getting-started-with-git/about-remote-repositories#cloning-with-https-urls for information on currently recommended modes of authentication.
fatal: Authentication failed for 'https://github.com/shihabahmed/demo-chat-server-with-push-notification.git/'


updating cataloger

updating cataloger

remote: Support for password authentication was removed on August 13, 2021.
remote: Please see https://docs.github.com/en/get-started/getting-started-with-git/about-remote-repositories#cloning-with-https-urls for information on currently recommended modes of authentication.
fatal: Authentication failed for 'https://github.com/stormpack-core/stormpack-client-js.git/'


[FIX] issue 519 and PR #807 (#812)

[FIX] issue 519 and PR #807 (#812)

* [FIX] binding to view
* [refactor] make synthax shorter

remote: Support for password authentication was removed on August 13, 2021.
remote: Please see https://docs.github.com/en/get-started/getting-started-with-git/about-remote-repositories#cloning-with-https-urls for information on currently recommended modes of authentication.
fatal: Authentication failed for 'https://github.com/clochix/cozy-home.git/'


Loop over sorted keys

Loop over sorted keys

"for k of data" goes through the keys in some order. We get the data
sorted from the backend and it is easier for a human to find what he's
looking for when the values are in order, so iterate using sorted keys.

remote: Support for password authentication was removed on August 13, 2021.
remote: Please see https://docs.github.com/en/get-started/getting-started-with-git/about-remote-repositories#cloning-with-https-urls for information on currently recommended modes of authentication.
fatal: Authentication failed for 'https://github.com/leonidas/qa-dashboard.git/'


Fill error message in if needed for package specs

--- src/atom.coffee
+++ src/atom.coffee
@@ -204,6 +204,7 @@
       # TODO: These should be deprecated for 2.0 once we transition the
       # exception-reporting package to the new API.
       error ?= {}
+      error.message ?= message
       error.url = url
       error.line = line
       error.column = column


knife exec -E 'puts "all the things"'

knife exec -E 'puts "all the things"'

--- src/chef.coffee
+++ src/chef.coffee
@@ -17,6 +17,7 @@
 #   hubot knife status - chef: Display status for all nodes
 #   hubot knife search <query> - chef: run a knife search with given query
 #   hubot knife search long <query> - chef: run a knife search with given query and return ALL attributes
+#   hubot knife exec -E '<ruby command>' - chef: run a ruby command
 #   hubot node list - chef: Lists all nodes on chef server
 #   hubot node show <node> - chef: Get knife status of all nodes
 #   hubot uptime <server> - chef: Prints uptime per node
@@ -118,3 +119,12 @@

     msg.send "Configuring #{environment}....nope just kidding man, you have balls..."
     # execCommand msg, command
+
+  robot.respond /knife exec -E (.*)$/i, (msg) ->
+    ruby = msg.match[1]
+    command = "knife exec -E #{ruby}"
+
+    msg.send "Your knife is my command!"
+    execCommand msg, command
+
+


Adding hipchat api route

Adding hipchat api route

error: pathspec 'src/scripts/hipchat-api.coffee' did not match any file(s) known to git

--- src/scripts/hipchat-api.coffee
+++ src/scripts/hipchat-api.coffee
@@ -0,0 +1,54 @@
+# Description:
+#   Send messages using the Hipchat API (which allows you to choose colors
+#   and send html messages) instead of the plain old jabber interface
+#
+# Dependencies:
+#   "querystring": "0.1.0"
+#
+# Configuration:
+#   HUBOT_HIPCHAT_TOKEN - Hipchat API token
+#
+# Commands:
+#   None
+#
+# URLs:
+#   GET /hubot/hipchat?room_id=<room_id>&message=<message>&from=<from>[&color=<red/yellow/green/gray/purple/random>&notify=<true/false>&message_format=<html/text>]
+#
+# Author:
+#   mcdavis
+
+querystring = require('querystring')
+
+module.exports = (robot) ->
+  robot.router.get "/hubot/hipchat", (req, res) ->
+    https = require 'https'
+    query = querystring.parse(req._parsedUrl.query)
+
+    hipchat = {}
+    hipchat.format = 'json'
+    hipchat.auth_token = process.env.HUBOT_HIPCHAT_TOKEN
+
+    hipchat.room_id = query.room_id if query.room_id
+    hipchat.message = query.message if query.message
+    hipchat.from = query.from if query.from
+    hipchat.color = query.color if query.color
+    hipchat.notify = query.notify if query.notify
+    hipchat.message_format = query.message_format if query.message_format
+
+    params = querystring.stringify(hipchat)
+
+    path = "/v1/rooms/message/?#{params}"
+
+    data = ''
+
+    callback = ->
+        res.end data
+
+    https.get {host: 'api.hipchat.com', path: path}, (res) ->
+        res.on 'data', (chunk) ->
+            data += chunk.toString()
+        res.on 'end', () ->
+            json = JSON.parse(data)
+            console.log "Hipchat response ", data
+            callback()
+


notification close event handler: add debug print

remote: Support for password authentication was removed on August 13, 2021.
remote: Please see https://docs.github.com/en/get-started/getting-started-with-git/about-remote-repositories#cloning-with-https-urls for information on currently recommended modes of authentication.
fatal: Authentication failed for 'https://github.com/rremizov/github-notifier.git/'


Use fat allow function

Use fat allow function

remote: Support for password authentication was removed on August 13, 2021.
remote: Please see https://docs.github.com/en/get-started/getting-started-with-git/about-remote-repositories#cloning-with-https-urls for information on currently recommended modes of authentication.
fatal: Authentication failed for 'https://github.com/Hiroto-K/MP3-Downloader.git/'


TODO added

TODO added

remote: Support for password authentication was removed on August 13, 2021.
remote: Please see https://docs.github.com/en/get-started/getting-started-with-git/about-remote-repositories#cloning-with-https-urls for information on currently recommended modes of authentication.
fatal: Authentication failed for 'https://github.com/patleb/admineer.git/'


Fix #1067; Fix problem with paste text after file upload

--- client/views/app/room.coffee
+++ client/views/app/room.coffee
@@ -304,7 +304,8 @@
 					file: item.getAsFile()
 					name: 'Clipboard'

-		fileUpload files
+		if files.length > 0
+			fileUpload files

 	'keydown .input-message': (event) ->
 		Template.instance().chatMessages.keydown(@_id, event, Template.instance())


revert back the use of selected value a default


update mongo connections to use environment variables

--- src/jobs.coffee
+++ src/jobs.coffee
@@ -2,7 +2,10 @@
 path = require 'path'
 dbName = path.basename(process.cwd()).replace(/\./, "-")

-db = new mongo.Db "concrete_#{ dbName }", new mongo.Server('localhost', mongo.Connection.DEFAULT_PORT, {auto_reconnect: true}), {}
+dbHost = process.env.MONGODB_HOST || 'localhost'
+dbPort = process.env.MONGODB_PORT || mongo.Connection.DEFAULT_PORT
+
+db = new mongo.Db "concrete_#{ dbName }", new mongo.Server(dbHost, dbPort, {auto_reconnect: true}), {}
 db.open (error) ->
     if error
       console.log 'There was an error creating a connection with the Mongo database. Please check that MongoDB is properly installed and running.'.red


added KDInputViewWithPreview, added it to widget/content display edit forms. it extends KDInputView

error: pathspec 'components/inputs/KDInputViewWithPreview.coffee' did not match any file(s) known to git

--- components/inputs/KDInputViewWithPreview.coffee
+++ components/inputs/KDInputViewWithPreview.coffee
@@ -0,0 +1,66 @@
+class KDInputViewWithPreview extends KDInputView
+
+  constructor:(options,data)->
+
+    options.preview               or= {}
+    options.preview.autoUpdate    ?= yes
+    options.preview.language      or= "markdown"
+    options.preview.showInitially ?= yes
+
+    options.keyup ?= (event)=>
+      if @options.preview.autoUpdate and @showPreview then @generatePreview()
+      yes
+
+    options.focus ?= (event)=>
+      if @options.preview.autoUpdate and @showPreview then @generatePreview()
+      yes
+
+    super options,data
+
+    @setClass "kdinputwithpreview"
+
+    @showPreview = options.preview.showInitially or no
+
+    log @getId()
+
+  setDomElement:(CssClass="")->
+    super CssClass
+
+    # basically, here we can add aynthing like modals, overlays and the liek
+
+    @$().after """

+

+          Preview
+          <input name="previewCheckbox#{@getId()}" type="checkbox" class="preview_checkbox" />
+

+

+
"""
+
+  viewAppended:->
+    super
+
+    @$("input.preview_checkbox").on "click",(event)=>
+      checkState = @$("input.preview_checkbox").prop("checked") or no
+
+      if checkState
+        @generatePreview()
+        @$("div.preview_content").removeClass "hidden"
+      else
+        @$("div.preview_content").addClass "hidden"
+
+    unless @showPreview
+      @$("div.preview_content").addClass "hidden"
+      @$("input.preview_checkbox").prop("checked",no)
+    else
+      @generatePreview()
+      @$("input.preview_checkbox").prop("checked",yes)
+
+    @$("label").on "click",=>
+      @$("input.preview_checkbox").click()
+
+  generatePreview:=>
+    if @showPreview
+      if @options.preview.language is "markdown"
+        @$("div.preview_content").html @utils.applyMarkdown @getValue()
+        @$("div.preview_content pre").addClass("prettyprint").each (i,element)=>
+          hljs.highlightBlock element