foop
Version:
interfaces that describe their intentions.
247 lines (236 loc) • 29.1 kB
JavaScript
/*jshint browserify: true, es3: true */
var _defineProperty = (function() {
try {
Object.defineProperty({}, 'x', {})
return function(obj, name, value) {
Object.defineProperty(obj, name, {
configurable: false,
enumerable: false,
writable: false,
value: value,
})
}
}
catch (e) {
return function(obj, name, value) {
obj[name] = value
}
}
})()
module.exports = OrderedHashMap
function OrderedHashMap() {
this._values = {}
this._keys = {}
this._order = []
this._id = Date.now() + '$' + String(Math.random()).slice(2)
this._nextId = 0
}
OrderedHashMap.from = function(arr, keyProp) {
var Ctor = this
var m = new Ctor()
for (var i = 0; i < arr.length; i++) {
var value = arr[i]
var key = keyProp ? (
typeof keyProp === 'function' ? keyProp(value, i, arr) : value[keyProp]
) : i
var hash = m._hash(key)
m._order.push(hash)
m._keys[hash] = key
m._values[hash] = value
}
return m
}
OrderedHashMap.fromTuples = function(arr) {
var Ctor = this
var m = new Ctor()
for (var i = 0; i < arr.length; i++) {
var item = arr[i]
var key = item[0]
var hash = m._hash(key)
m._order.push(hash)
m._keys[hash] = item[0]
m._values[hash] = item[1]
}
return m
}
OrderedHashMap.prototype._hash = function(key) {
var t = typeof key
if (key === null || key === undefined || t === 'boolean' || t === 'number') { return '%' + key }
if (t === 'string') { return '"' + key }
if (t !== 'object' && t !== 'function') { return '?' + key }
if (key instanceof Date) { return '@' + Number(key) }
if (key instanceof RegExp) { return '!' + key }
var h = '__hash$' + this._id
if (key[h] === undefined) {
_defineProperty(key, h, this._nextId)
this._nextId += 1
}
return '#' + key[h]
}
OrderedHashMap.prototype.count = function() {
return this._order.length
}
OrderedHashMap.prototype.keyAt = function(i) {
if (i < 0 || i > this._order.length) { return undefined }
return this._keys[this._order[i]]
}
OrderedHashMap.prototype.valueAt = function(i) {
if (i < 0 || i > this._order.length) { return undefined }
return this._values[this._order[i]]
}
OrderedHashMap.prototype.indexOf = function(key) {
var hash = this._hash(key)
return this._order.indexOf(hash)
}
OrderedHashMap.prototype.insert = function(index, key, value) {
var hash = this._hash(key)
var i = this._order.indexOf(hash)
if (i !== -1) { this._order.splice(i, 1) }
if (index >= this._order.length) { this._order.push(hash) }
else if (index < 0) { this._order.unshift(hash) }
else { this._order.splice(index, 0, hash) }
this._keys[hash] = key
this._values[hash] = value
}
OrderedHashMap.prototype.set = function(key, value) {
var hash = this._hash(key)
var i = this._order.indexOf(hash)
if (i === -1) { this._order.push(hash) }
this._keys[hash] = key
this._values[hash] = value
}
OrderedHashMap.prototype.get = function(key) {
var hash = this._hash(key)
return this._values[hash]
}
OrderedHashMap.prototype.remove = function(key) {
var hash = this._hash(key)
var i = this._order.indexOf(hash)
if (i === -1) { return false }
this._order.splice(i, 1)
delete this._keys[hash]
delete this._values[hash]
return true
}
OrderedHashMap.prototype.unshift = function(key, value) {
var hash = this._hash(key)
var i = this._order.indexOf(hash)
if (i !== -1) { this._order.splice(i, 1) }
this._order.unshift(hash)
this._keys[hash] = key
this._values[hash] = value
}
OrderedHashMap.prototype.shift = function() {
if (!this._order.length) { return undefined }
var hash = this._order.shift()
var key = this._keys[hash]
var value = this._values[hash]
delete this._keys[hash]
delete this._values[hash]
return [key, value]
}
OrderedHashMap.prototype.push = function(key, value) {
var hash = this._hash(key)
var i = this._order.indexOf(hash)
if (i !== -1) { this._order.splice(i, 1) }
this._order.push(hash)
this._keys[hash] = key
this._values[hash] = value
}
OrderedHashMap.prototype.pop = function() {
if (!this._order.length) { return undefined }
var hash = this._order.pop()
var key = this._keys[hash]
var value = this._values[hash]
delete this._keys[hash]
delete this._values[hash]
return [key, value]
}
OrderedHashMap.prototype.items = function() {
var this$1 = this;
var arr = []
for (var i = 0; i < this._order.length; i++) {
var hash = this$1._order[i]
arr.push([this$1._keys[hash], this$1._values[hash]])
}
return arr
}
OrderedHashMap.prototype.values = function() {
var this$1 = this;
var arr = []
for (var i = 0; i < this._order.length; i++) {
var hash = this$1._order[i]
arr.push(this$1._values[hash])
}
return arr
}
OrderedHashMap.prototype.keys = function() {
var this$1 = this;
var arr = []
for (var i = 0; i < this._order.length; i++) {
var hash = this$1._order[i]
arr.push(this$1._keys[hash])
}
return arr
}
OrderedHashMap.prototype.forEach = function(fn) {
var this$1 = this;
for (var i = 0; i < this._order.length; i++) {
var hash = this$1._order[i]
fn(this$1._values[hash], this$1._keys[hash], i, this$1)
}
}
OrderedHashMap.prototype.map = function(fn) {
var this$1 = this;
var arr = []
for (var i = 0; i < this._order.length; i++) {
var hash = this$1._order[i]
arr.push(fn(this$1._values[hash], this$1._keys[hash], this$1))
}
return arr
}
OrderedHashMap.prototype.filter = function(fn) {
var this$1 = this;
var m = new OrderedHashMap()
for (var i = 0; i < this._order.length; i++) {
var hash = this$1._order[i]
var key = this$1._keys[hash]
var value = this$1._values[hash]
if (!fn(value, key, this$1)) { continue }
m._order.push(hash)
m._keys[hash] = key
m._values[hash] = value
}
return m
}
OrderedHashMap.prototype.reduce = function(fn, initial) {
var this$1 = this;
var i = 0
var accu = initial
if (accu === undefined) {
if (!this._order.length) { throw new TypeError('Must provide an initial value for empty maps') }
accu = this._values[this._order[0]]
i = 1
}
for (; i < this._order.length; i++) {
var hash = this$1._order[i]
accu = fn(accu, this$1._values[hash], this$1._keys[hash], this$1)
}
return accu
}
OrderedHashMap.prototype.reduceRight = function(fn, initial) {
var this$1 = this;
var i = this._order.length
var accu = initial
if (accu === undefined) {
if (!this._order.length) { throw new TypeError('Must provide an initial value for empty maps') }
accu = this._values[this._order[i - 1]]
i -= 1
}
for (var i = this._order.length; i > 0; i--) {
var hash = this$1._order[i - 1]
accu = fn(accu, this$1._values[hash], this$1._keys[hash], this$1)
}
return accu
}
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiT3JkZXJlZEhhc2hNYXAuanMiLCJzb3VyY2VzIjpbIk9yZGVyZWRIYXNoTWFwLmpzIl0sInNvdXJjZXNDb250ZW50IjpbIi8qanNoaW50IGJyb3dzZXJpZnk6IHRydWUsIGVzMzogdHJ1ZSAqL1xuXG52YXIgX2RlZmluZVByb3BlcnR5ID0gKGZ1bmN0aW9uKCkge1xuICB0cnkge1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh7fSwgJ3gnLCB7fSlcbiAgICByZXR1cm4gZnVuY3Rpb24ob2JqLCBuYW1lLCB2YWx1ZSkge1xuICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KG9iaiwgbmFtZSwge1xuICAgICAgICBjb25maWd1cmFibGU6IGZhbHNlLFxuICAgICAgICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgICAgICAgd3JpdGFibGU6IGZhbHNlLFxuICAgICAgICB2YWx1ZSxcbiAgICAgIH0pXG4gICAgfVxuICB9XG4gIGNhdGNoIChlKSB7XG4gICAgcmV0dXJuIGZ1bmN0aW9uKG9iaiwgbmFtZSwgdmFsdWUpIHtcbiAgICAgIG9ialtuYW1lXSA9IHZhbHVlXG4gICAgfVxuICB9XG59KSgpXG5cbm1vZHVsZS5leHBvcnRzID0gT3JkZXJlZEhhc2hNYXBcbmZ1bmN0aW9uIE9yZGVyZWRIYXNoTWFwKCkge1xuICB0aGlzLl92YWx1ZXMgPSB7fVxuICB0aGlzLl9rZXlzID0ge31cbiAgdGhpcy5fb3JkZXIgPSBbXVxuICB0aGlzLl9pZCA9IERhdGUubm93KCkgKyAnJCcgKyBTdHJpbmcoTWF0aC5yYW5kb20oKSkuc2xpY2UoMilcbiAgdGhpcy5fbmV4dElkID0gMFxufVxuT3JkZXJlZEhhc2hNYXAuZnJvbSA9IGZ1bmN0aW9uKGFyciwga2V5UHJvcCkge1xuICB2YXIgQ3RvciA9IHRoaXNcbiAgdmFyIG0gPSBuZXcgQ3RvcigpXG4gIGZvciAodmFyIGkgPSAwOyBpIDwgYXJyLmxlbmd0aDsgaSsrKSB7XG4gICAgdmFyIHZhbHVlID0gYXJyW2ldXG4gICAgdmFyIGtleSA9IGtleVByb3AgPyAoXG4gICAgICB0eXBlb2Yga2V5UHJvcCA9PT0gJ2Z1bmN0aW9uJyA/IGtleVByb3AodmFsdWUsIGksIGFycikgOiB2YWx1ZVtrZXlQcm9wXVxuICAgICkgOiBpXG4gICAgdmFyIGhhc2ggPSBtLl9oYXNoKGtleSlcbiAgICBtLl9vcmRlci5wdXNoKGhhc2gpXG4gICAgbS5fa2V5c1toYXNoXSA9IGtleVxuICAgIG0uX3ZhbHVlc1toYXNoXSA9IHZhbHVlXG4gIH1cbiAgcmV0dXJuIG1cbn1cbk9yZGVyZWRIYXNoTWFwLmZyb21UdXBsZXMgPSBmdW5jdGlvbihhcnIpIHtcbiAgdmFyIEN0b3IgPSB0aGlzXG4gIHZhciBtID0gbmV3IEN0b3IoKVxuICBmb3IgKHZhciBpID0gMDsgaSA8IGFyci5sZW5ndGg7IGkrKykge1xuICAgIHZhciBpdGVtID0gYXJyW2ldXG4gICAgdmFyIGtleSA9IGl0ZW1bMF1cbiAgICB2YXIgaGFzaCA9IG0uX2hhc2goa2V5KVxuICAgIG0uX29yZGVyLnB1c2goaGFzaClcbiAgICBtLl9rZXlzW2hhc2hdID0gaXRlbVswXVxuICAgIG0uX3ZhbHVlc1toYXNoXSA9IGl0ZW1bMV1cbiAgfVxuICByZXR1cm4gbVxufVxuT3JkZXJlZEhhc2hNYXAucHJvdG90eXBlLl9oYXNoID0gZnVuY3Rpb24oa2V5KSB7XG4gIHZhciB0ID0gdHlwZW9mIGtleVxuICBpZiAoa2V5ID09PSBudWxsIHx8IGtleSA9PT0gdW5kZWZpbmVkIHx8IHQgPT09ICdib29sZWFuJyB8fCB0ID09PSAnbnVtYmVyJykgcmV0dXJuICclJyArIGtleVxuICBpZiAodCA9PT0gJ3N0cmluZycpIHJldHVybiAnXCInICsga2V5XG4gIGlmICh0ICE9PSAnb2JqZWN0JyAmJiB0ICE9PSAnZnVuY3Rpb24nKSByZXR1cm4gJz8nICsga2V5XG4gIGlmIChrZXkgaW5zdGFuY2VvZiBEYXRlKSByZXR1cm4gJ0AnICsgTnVtYmVyKGtleSlcbiAgaWYgKGtleSBpbnN0YW5jZW9mIFJlZ0V4cCkgcmV0dXJuICchJyArIGtleVxuICB2YXIgaCA9ICdfX2hhc2gkJyArIHRoaXMuX2lkXG4gIGlmIChrZXlbaF0gPT09IHVuZGVmaW5lZCkge1xuICAgIF9kZWZpbmVQcm9wZXJ0eShrZXksIGgsIHRoaXMuX25leHRJZClcbiAgICB0aGlzLl9uZXh0SWQgKz0gMVxuICB9XG4gIHJldHVybiAnIycgKyBrZXlbaF1cbn1cbk9yZGVyZWRIYXNoTWFwLnByb3RvdHlwZS5jb3VudCA9IGZ1bmN0aW9uKCkge1xuICByZXR1cm4gdGhpcy5fb3JkZXIubGVuZ3RoXG59XG5PcmRlcmVkSGFzaE1hcC5wcm90b3R5cGUua2V5QXQgPSBmdW5jdGlvbihpKSB7XG4gIGlmIChpIDwgMCB8fCBpID4gdGhpcy5fb3JkZXIubGVuZ3RoKSByZXR1cm4gdW5kZWZpbmVkXG4gIHJldHVybiB0aGlzLl9rZXlzW3RoaXMuX29yZGVyW2ldXVxufVxuT3JkZXJlZEhhc2hNYXAucHJvdG90eXBlLnZhbHVlQXQgPSBmdW5jdGlvbihpKSB7XG4gIGlmIChpIDwgMCB8fCBpID4gdGhpcy5fb3JkZXIubGVuZ3RoKSByZXR1cm4gdW5kZWZpbmVkXG4gIHJldHVybiB0aGlzLl92YWx1ZXNbdGhpcy5fb3JkZXJbaV1dXG59XG5PcmRlcmVkSGFzaE1hcC5wcm90b3R5cGUuaW5kZXhPZiA9IGZ1bmN0aW9uKGtleSkge1xuICB2YXIgaGFzaCA9IHRoaXMuX2hhc2goa2V5KVxuICByZXR1cm4gdGhpcy5fb3JkZXIuaW5kZXhPZihoYXNoKVxufVxuT3JkZXJlZEhhc2hNYXAucHJvdG90eXBlLmluc2VydCA9IGZ1bmN0aW9uKGluZGV4LCBrZXksIHZhbHVlKSB7XG4gIHZhciBoYXNoID0gdGhpcy5faGFzaChrZXkpXG4gIHZhciBpID0gdGhpcy5fb3JkZXIuaW5kZXhPZihoYXNoKVxuICBpZiAoaSAhPT0gLTEpIHRoaXMuX29yZGVyLnNwbGljZShpLCAxKVxuICBpZiAoaW5kZXggPj0gdGhpcy5fb3JkZXIubGVuZ3RoKSB0aGlzLl9vcmRlci5wdXNoKGhhc2gpXG4gIGVsc2UgaWYgKGluZGV4IDwgMCkgdGhpcy5fb3JkZXIudW5zaGlmdChoYXNoKVxuICBlbHNlIHRoaXMuX29yZGVyLnNwbGljZShpbmRleCwgMCwgaGFzaClcbiAgdGhpcy5fa2V5c1toYXNoXSA9IGtleVxuICB0aGlzLl92YWx1ZXNbaGFzaF0gPSB2YWx1ZVxufVxuT3JkZXJlZEhhc2hNYXAucHJvdG90eXBlLnNldCA9IGZ1bmN0aW9uKGtleSwgdmFsdWUpIHtcbiAgdmFyIGhhc2ggPSB0aGlzLl9oYXNoKGtleSlcbiAgdmFyIGkgPSB0aGlzLl9vcmRlci5pbmRleE9mKGhhc2gpXG4gIGlmIChpID09PSAtMSkgdGhpcy5fb3JkZXIucHVzaChoYXNoKVxuICB0aGlzLl9rZXlzW2hhc2hdID0ga2V5XG4gIHRoaXMuX3ZhbHVlc1toYXNoXSA9IHZhbHVlXG59XG5PcmRlcmVkSGFzaE1hcC5wcm90b3R5cGUuZ2V0ID0gZnVuY3Rpb24oa2V5KSB7XG4gIHZhciBoYXNoID0gdGhpcy5faGFzaChrZXkpXG4gIHJldHVybiB0aGlzLl92YWx1ZXNbaGFzaF1cbn1cbk9yZGVyZWRIYXNoTWFwLnByb3RvdHlwZS5yZW1vdmUgPSBmdW5jdGlvbihrZXkpIHtcbiAgdmFyIGhhc2ggPSB0aGlzLl9oYXNoKGtleSlcbiAgdmFyIGkgPSB0aGlzLl9vcmRlci5pbmRleE9mKGhhc2gpXG4gIGlmIChpID09PSAtMSkgcmV0dXJuIGZhbHNlXG4gIHRoaXMuX29yZGVyLnNwbGljZShpLCAxKVxuICBkZWxldGUgdGhpcy5fa2V5c1toYXNoXVxuICBkZWxldGUgdGhpcy5fdmFsdWVzW2hhc2hdXG4gIHJldHVybiB0cnVlXG59XG5PcmRlcmVkSGFzaE1hcC5wcm90b3R5cGUudW5zaGlmdCA9IGZ1bmN0aW9uKGtleSwgdmFsdWUpIHtcbiAgdmFyIGhhc2ggPSB0aGlzLl9oYXNoKGtleSlcbiAgdmFyIGkgPSB0aGlzLl9vcmRlci5pbmRleE9mKGhhc2gpXG4gIGlmIChpICE9PSAtMSkgdGhpcy5fb3JkZXIuc3BsaWNlKGksIDEpXG4gIHRoaXMuX29yZGVyLnVuc2hpZnQoaGFzaClcbiAgdGhpcy5fa2V5c1toYXNoXSA9IGtleVxuICB0aGlzLl92YWx1ZXNbaGFzaF0gPSB2YWx1ZVxufVxuT3JkZXJlZEhhc2hNYXAucHJvdG90eXBlLnNoaWZ0ID0gZnVuY3Rpb24oKSB7XG4gIGlmICghdGhpcy5fb3JkZXIubGVuZ3RoKSByZXR1cm4gdW5kZWZpbmVkXG4gIHZhciBoYXNoID0gdGhpcy5fb3JkZXIuc2hpZnQoKVxuICB2YXIga2V5ID0gdGhpcy5fa2V5c1toYXNoXVxuICB2YXIgdmFsdWUgPSB0aGlzLl92YWx1ZXNbaGFzaF1cbiAgZGVsZXRlIHRoaXMuX2tleXNbaGFzaF1cbiAgZGVsZXRlIHRoaXMuX3ZhbHVlc1toYXNoXVxuICByZXR1cm4gW2tleSwgdmFsdWVdXG59XG5PcmRlcmVkSGFzaE1hcC5wcm90b3R5cGUucHVzaCA9IGZ1bmN0aW9uKGtleSwgdmFsdWUpIHtcbiAgdmFyIGhhc2ggPSB0aGlzLl9oYXNoKGtleSlcbiAgdmFyIGkgPSB0aGlzLl9vcmRlci5pbmRleE9mKGhhc2gpXG4gIGlmIChpICE9PSAtMSkgdGhpcy5fb3JkZXIuc3BsaWNlKGksIDEpXG4gIHRoaXMuX29yZGVyLnB1c2goaGFzaClcbiAgdGhpcy5fa2V5c1toYXNoXSA9IGtleVxuICB0aGlzLl92YWx1ZXNbaGFzaF0gPSB2YWx1ZVxufVxuT3JkZXJlZEhhc2hNYXAucHJvdG90eXBlLnBvcCA9IGZ1bmN0aW9uKCkge1xuICBpZiAoIXRoaXMuX29yZGVyLmxlbmd0aCkgcmV0dXJuIHVuZGVmaW5lZFxuICB2YXIgaGFzaCA9IHRoaXMuX29yZGVyLnBvcCgpXG4gIHZhciBrZXkgPSB0aGlzLl9rZXlzW2hhc2hdXG4gIHZhciB2YWx1ZSA9IHRoaXMuX3ZhbHVlc1toYXNoXVxuICBkZWxldGUgdGhpcy5fa2V5c1toYXNoXVxuICBkZWxldGUgdGhpcy5fdmFsdWVzW2hhc2hdXG4gIHJldHVybiBba2V5LCB2YWx1ZV1cbn1cbk9yZGVyZWRIYXNoTWFwLnByb3RvdHlwZS5pdGVtcyA9IGZ1bmN0aW9uKCkge1xuICB2YXIgYXJyID0gW11cbiAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLl9vcmRlci5sZW5ndGg7IGkrKykge1xuICAgIHZhciBoYXNoID0gdGhpcy5fb3JkZXJbaV1cbiAgICBhcnIucHVzaChbdGhpcy5fa2V5c1toYXNoXSwgdGhpcy5fdmFsdWVzW2hhc2hdXSlcbiAgfVxuICByZXR1cm4gYXJyXG59XG5PcmRlcmVkSGFzaE1hcC5wcm90b3R5cGUudmFsdWVzID0gZnVuY3Rpb24oKSB7XG4gIHZhciBhcnIgPSBbXVxuICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMuX29yZGVyLmxlbmd0aDsgaSsrKSB7XG4gICAgdmFyIGhhc2ggPSB0aGlzLl9vcmRlcltpXVxuICAgIGFyci5wdXNoKHRoaXMuX3ZhbHVlc1toYXNoXSlcbiAgfVxuICByZXR1cm4gYXJyXG59XG5PcmRlcmVkSGFzaE1hcC5wcm90b3R5cGUua2V5cyA9IGZ1bmN0aW9uKCkge1xuICB2YXIgYXJyID0gW11cbiAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLl9vcmRlci5sZW5ndGg7IGkrKykge1xuICAgIHZhciBoYXNoID0gdGhpcy5fb3JkZXJbaV1cbiAgICBhcnIucHVzaCh0aGlzLl9rZXlzW2hhc2hdKVxuICB9XG4gIHJldHVybiBhcnJcbn1cbk9yZGVyZWRIYXNoTWFwLnByb3RvdHlwZS5mb3JFYWNoID0gZnVuY3Rpb24oZm4pIHtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLl9vcmRlci5sZW5ndGg7IGkrKykge1xuICAgIHZhciBoYXNoID0gdGhpcy5fb3JkZXJbaV1cbiAgICBmbih0aGlzLl92YWx1ZXNbaGFzaF0sIHRoaXMuX2tleXNbaGFzaF0sIGksIHRoaXMpXG4gIH1cbn1cbk9yZGVyZWRIYXNoTWFwLnByb3RvdHlwZS5tYXAgPSBmdW5jdGlvbihmbikge1xuICB2YXIgYXJyID0gW11cbiAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLl9vcmRlci5sZW5ndGg7IGkrKykge1xuICAgIHZhciBoYXNoID0gdGhpcy5fb3JkZXJbaV1cbiAgICBhcnIucHVzaChmbih0aGlzLl92YWx1ZXNbaGFzaF0sIHRoaXMuX2tleXNbaGFzaF0sIHRoaXMpKVxuICB9XG4gIHJldHVybiBhcnJcbn1cbk9yZGVyZWRIYXNoTWFwLnByb3RvdHlwZS5maWx0ZXIgPSBmdW5jdGlvbihmbikge1xuICB2YXIgbSA9IG5ldyBPcmRlcmVkSGFzaE1hcCgpXG4gIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5fb3JkZXIubGVuZ3RoOyBpKyspIHtcbiAgICB2YXIgaGFzaCA9IHRoaXMuX29yZGVyW2ldXG4gICAgdmFyIGtleSA9IHRoaXMuX2tleXNbaGFzaF1cbiAgICB2YXIgdmFsdWUgPSB0aGlzLl92YWx1ZXNbaGFzaF1cbiAgICBpZiAoIWZuKHZhbHVlLCBrZXksIHRoaXMpKSBjb250aW51ZVxuICAgIG0uX29yZGVyLnB1c2goaGFzaClcbiAgICBtLl9rZXlzW2hhc2hdID0ga2V5XG4gICAgbS5fdmFsdWVzW2hhc2hdID0gdmFsdWVcbiAgfVxuICByZXR1cm4gbVxufVxuT3JkZXJlZEhhc2hNYXAucHJvdG90eXBlLnJlZHVjZSA9IGZ1bmN0aW9uKGZuLCBpbml0aWFsKSB7XG4gIHZhciBpID0gMFxuICB2YXIgYWNjdSA9IGluaXRpYWxcbiAgaWYgKGFjY3UgPT09IHVuZGVmaW5lZCkge1xuICAgIGlmICghdGhpcy5fb3JkZXIubGVuZ3RoKSB0aHJvdyBuZXcgVHlwZUVycm9yKCdNdXN0IHByb3ZpZGUgYW4gaW5pdGlhbCB2YWx1ZSBmb3IgZW1wdHkgbWFwcycpXG4gICAgYWNjdSA9IHRoaXMuX3ZhbHVlc1t0aGlzLl9vcmRlclswXV1cbiAgICBpID0gMVxuICB9XG4gIGZvciAoOyBpIDwgdGhpcy5fb3JkZXIubGVuZ3RoOyBpKyspIHtcbiAgICB2YXIgaGFzaCA9IHRoaXMuX29yZGVyW2ldXG4gICAgYWNjdSA9IGZuKGFjY3UsIHRoaXMuX3ZhbHVlc1toYXNoXSwgdGhpcy5fa2V5c1toYXNoXSwgdGhpcylcbiAgfVxuICByZXR1cm4gYWNjdVxufVxuT3JkZXJlZEhhc2hNYXAucHJvdG90eXBlLnJlZHVjZVJpZ2h0ID0gZnVuY3Rpb24oZm4sIGluaXRpYWwpIHtcbiAgdmFyIGkgPSB0aGlzLl9vcmRlci5sZW5ndGhcbiAgdmFyIGFjY3UgPSBpbml0aWFsXG4gIGlmIChhY2N1ID09PSB1bmRlZmluZWQpIHtcbiAgICBpZiAoIXRoaXMuX29yZGVyLmxlbmd0aCkgdGhyb3cgbmV3IFR5cGVFcnJvcignTXVzdCBwcm92aWRlIGFuIGluaXRpYWwgdmFsdWUgZm9yIGVtcHR5IG1hcHMnKVxuICAgIGFjY3UgPSB0aGlzLl92YWx1ZXNbdGhpcy5fb3JkZXJbaSAtIDFdXVxuICAgIGkgLT0gMVxuICB9XG4gIGZvciAodmFyIGkgPSB0aGlzLl9vcmRlci5sZW5ndGg7IGkgPiAwOyBpLS0pIHtcbiAgICB2YXIgaGFzaCA9IHRoaXMuX29yZGVyW2kgLSAxXVxuICAgIGFjY3UgPSBmbihhY2N1LCB0aGlzLl92YWx1ZXNbaGFzaF0sIHRoaXMuX2tleXNbaGFzaF0sIHRoaXMpXG4gIH1cbiAgcmV0dXJuIGFjY3Vcbn1cbiJdLCJuYW1lcyI6WyJ0aGlzIl0sIm1hcHBpbmdzIjoiQUFBQTs7QUFFQSxJQUFJLGVBQWUsR0FBRyxDQUFDLFdBQVc7RUFDaEMsSUFBSTtJQUNGLE1BQU0sQ0FBQyxjQUFjLENBQUMsRUFBRSxFQUFFLEdBQUcsRUFBRSxFQUFFLENBQUM7SUFDbEMsT0FBTyxTQUFTLEdBQUcsRUFBRSxJQUFJLEVBQUUsS0FBSyxFQUFFO01BQ2hDLE1BQU0sQ0FBQyxjQUFjLENBQUMsR0FBRyxFQUFFLElBQUksRUFBRTtRQUMvQixZQUFZLEVBQUUsS0FBSztRQUNuQixVQUFVLEVBQUUsS0FBSztRQUNqQixRQUFRLEVBQUUsS0FBSztRQUNmLE9BQUEsS0FBSztPQUNOLENBQUM7S0FDSDtHQUNGO0VBQ0QsT0FBTyxDQUFDLEVBQUU7SUFDUixPQUFPLFNBQVMsR0FBRyxFQUFFLElBQUksRUFBRSxLQUFLLEVBQUU7TUFDaEMs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Q0FBQyxNQUFNLEVBQUUsRUFBQSxNQUFNLElBQUksU0FBUyxDQUFDLDhDQUE4QyxDQUFDLEVBQUE7SUFDNUYsSUFBSSxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7SUFDdkMsQ0FBQyxJQUFJLENBQUM7R0FDUDtFQUNELEtBQUssSUFBSSxDQUFDLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxNQUFNLEVBQUUsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRTtJQUMzQyxJQUFJLElBQUksR0FBR0EsTUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQzdCLElBQUksR0FBRyxFQUFFLENBQUMsSUFBSSxFQUFFQSxNQUFJLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxFQUFFQSxNQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxFQUFFQSxNQUFJLENBQUM7R0FDNUQ7RUFDRCxPQUFPLElBQUk7Q0FDWjsifQ==