| ;(function (root, factory, undef) { | 
|     if (typeof exports === "object") { | 
|         // CommonJS | 
|         module.exports = exports = factory(require("./core"), require("./cipher-core")); | 
|     } | 
|     else if (typeof define === "function" && define.amd) { | 
|         // AMD | 
|         define(["./core", "./cipher-core"], factory); | 
|     } | 
|     else { | 
|         // Global (browser) | 
|         factory(root.CryptoJS); | 
|     } | 
| }(this, function (CryptoJS) { | 
|   | 
|     /** | 
|      * Cipher Feedback block mode. | 
|      */ | 
|     CryptoJS.mode.CFB = (function () { | 
|         var CFB = CryptoJS.lib.BlockCipherMode.extend(); | 
|   | 
|         CFB.Encryptor = CFB.extend({ | 
|             processBlock: function (words, offset) { | 
|                 // Shortcuts | 
|                 var cipher = this._cipher; | 
|                 var blockSize = cipher.blockSize; | 
|   | 
|                 generateKeystreamAndEncrypt.call(this, words, offset, blockSize, cipher); | 
|   | 
|                 // Remember this block to use with next block | 
|                 this._prevBlock = words.slice(offset, offset + blockSize); | 
|             } | 
|         }); | 
|   | 
|         CFB.Decryptor = CFB.extend({ | 
|             processBlock: function (words, offset) { | 
|                 // Shortcuts | 
|                 var cipher = this._cipher; | 
|                 var blockSize = cipher.blockSize; | 
|   | 
|                 // Remember this block to use with next block | 
|                 var thisBlock = words.slice(offset, offset + blockSize); | 
|   | 
|                 generateKeystreamAndEncrypt.call(this, words, offset, blockSize, cipher); | 
|   | 
|                 // This block becomes the previous block | 
|                 this._prevBlock = thisBlock; | 
|             } | 
|         }); | 
|   | 
|         function generateKeystreamAndEncrypt(words, offset, blockSize, cipher) { | 
|             var keystream; | 
|   | 
|             // Shortcut | 
|             var iv = this._iv; | 
|   | 
|             // Generate keystream | 
|             if (iv) { | 
|                 keystream = iv.slice(0); | 
|   | 
|                 // Remove IV for subsequent blocks | 
|                 this._iv = undefined; | 
|             } else { | 
|                 keystream = this._prevBlock; | 
|             } | 
|             cipher.encryptBlock(keystream, 0); | 
|   | 
|             // Encrypt | 
|             for (var i = 0; i < blockSize; i++) { | 
|                 words[offset + i] ^= keystream[i]; | 
|             } | 
|         } | 
|   | 
|         return CFB; | 
|     }()); | 
|   | 
|   | 
|     return CryptoJS.mode.CFB; | 
|   | 
| })); |