;(function (root, factory, undef) { 
 | 
    if (typeof exports === "object") { 
 | 
        // CommonJS 
 | 
        module.exports = exports = factory(require("./core"), require("./x64-core")); 
 | 
    } 
 | 
    else if (typeof define === "function" && define.amd) { 
 | 
        // AMD 
 | 
        define(["./core", "./x64-core"], factory); 
 | 
    } 
 | 
    else { 
 | 
        // Global (browser) 
 | 
        factory(root.CryptoJS); 
 | 
    } 
 | 
}(this, function (CryptoJS) { 
 | 
  
 | 
    (function (Math) { 
 | 
        // Shortcuts 
 | 
        var C = CryptoJS; 
 | 
        var C_lib = C.lib; 
 | 
        var WordArray = C_lib.WordArray; 
 | 
        var Hasher = C_lib.Hasher; 
 | 
        var C_x64 = C.x64; 
 | 
        var X64Word = C_x64.Word; 
 | 
        var C_algo = C.algo; 
 | 
  
 | 
        // Constants tables 
 | 
        var RHO_OFFSETS = []; 
 | 
        var PI_INDEXES  = []; 
 | 
        var ROUND_CONSTANTS = []; 
 | 
  
 | 
        // Compute Constants 
 | 
        (function () { 
 | 
            // Compute rho offset constants 
 | 
            var x = 1, y = 0; 
 | 
            for (var t = 0; t < 24; t++) { 
 | 
                RHO_OFFSETS[x + 5 * y] = ((t + 1) * (t + 2) / 2) % 64; 
 | 
  
 | 
                var newX = y % 5; 
 | 
                var newY = (2 * x + 3 * y) % 5; 
 | 
                x = newX; 
 | 
                y = newY; 
 | 
            } 
 | 
  
 | 
            // Compute pi index constants 
 | 
            for (var x = 0; x < 5; x++) { 
 | 
                for (var y = 0; y < 5; y++) { 
 | 
                    PI_INDEXES[x + 5 * y] = y + ((2 * x + 3 * y) % 5) * 5; 
 | 
                } 
 | 
            } 
 | 
  
 | 
            // Compute round constants 
 | 
            var LFSR = 0x01; 
 | 
            for (var i = 0; i < 24; i++) { 
 | 
                var roundConstantMsw = 0; 
 | 
                var roundConstantLsw = 0; 
 | 
  
 | 
                for (var j = 0; j < 7; j++) { 
 | 
                    if (LFSR & 0x01) { 
 | 
                        var bitPosition = (1 << j) - 1; 
 | 
                        if (bitPosition < 32) { 
 | 
                            roundConstantLsw ^= 1 << bitPosition; 
 | 
                        } else /* if (bitPosition >= 32) */ { 
 | 
                            roundConstantMsw ^= 1 << (bitPosition - 32); 
 | 
                        } 
 | 
                    } 
 | 
  
 | 
                    // Compute next LFSR 
 | 
                    if (LFSR & 0x80) { 
 | 
                        // Primitive polynomial over GF(2): x^8 + x^6 + x^5 + x^4 + 1 
 | 
                        LFSR = (LFSR << 1) ^ 0x71; 
 | 
                    } else { 
 | 
                        LFSR <<= 1; 
 | 
                    } 
 | 
                } 
 | 
  
 | 
                ROUND_CONSTANTS[i] = X64Word.create(roundConstantMsw, roundConstantLsw); 
 | 
            } 
 | 
        }()); 
 | 
  
 | 
        // Reusable objects for temporary values 
 | 
        var T = []; 
 | 
        (function () { 
 | 
            for (var i = 0; i < 25; i++) { 
 | 
                T[i] = X64Word.create(); 
 | 
            } 
 | 
        }()); 
 | 
  
 | 
        /** 
 | 
         * SHA-3 hash algorithm. 
 | 
         */ 
 | 
        var SHA3 = C_algo.SHA3 = Hasher.extend({ 
 | 
            /** 
 | 
             * Configuration options. 
 | 
             * 
 | 
             * @property {number} outputLength 
 | 
             *   The desired number of bits in the output hash. 
 | 
             *   Only values permitted are: 224, 256, 384, 512. 
 | 
             *   Default: 512 
 | 
             */ 
 | 
            cfg: Hasher.cfg.extend({ 
 | 
                outputLength: 512 
 | 
            }), 
 | 
  
 | 
            _doReset: function () { 
 | 
                var state = this._state = [] 
 | 
                for (var i = 0; i < 25; i++) { 
 | 
                    state[i] = new X64Word.init(); 
 | 
                } 
 | 
  
 | 
                this.blockSize = (1600 - 2 * this.cfg.outputLength) / 32; 
 | 
            }, 
 | 
  
 | 
            _doProcessBlock: function (M, offset) { 
 | 
                // Shortcuts 
 | 
                var state = this._state; 
 | 
                var nBlockSizeLanes = this.blockSize / 2; 
 | 
  
 | 
                // Absorb 
 | 
                for (var i = 0; i < nBlockSizeLanes; i++) { 
 | 
                    // Shortcuts 
 | 
                    var M2i  = M[offset + 2 * i]; 
 | 
                    var M2i1 = M[offset + 2 * i + 1]; 
 | 
  
 | 
                    // Swap endian 
 | 
                    M2i = ( 
 | 
                        (((M2i << 8)  | (M2i >>> 24)) & 0x00ff00ff) | 
 | 
                        (((M2i << 24) | (M2i >>> 8))  & 0xff00ff00) 
 | 
                    ); 
 | 
                    M2i1 = ( 
 | 
                        (((M2i1 << 8)  | (M2i1 >>> 24)) & 0x00ff00ff) | 
 | 
                        (((M2i1 << 24) | (M2i1 >>> 8))  & 0xff00ff00) 
 | 
                    ); 
 | 
  
 | 
                    // Absorb message into state 
 | 
                    var lane = state[i]; 
 | 
                    lane.high ^= M2i1; 
 | 
                    lane.low  ^= M2i; 
 | 
                } 
 | 
  
 | 
                // Rounds 
 | 
                for (var round = 0; round < 24; round++) { 
 | 
                    // Theta 
 | 
                    for (var x = 0; x < 5; x++) { 
 | 
                        // Mix column lanes 
 | 
                        var tMsw = 0, tLsw = 0; 
 | 
                        for (var y = 0; y < 5; y++) { 
 | 
                            var lane = state[x + 5 * y]; 
 | 
                            tMsw ^= lane.high; 
 | 
                            tLsw ^= lane.low; 
 | 
                        } 
 | 
  
 | 
                        // Temporary values 
 | 
                        var Tx = T[x]; 
 | 
                        Tx.high = tMsw; 
 | 
                        Tx.low  = tLsw; 
 | 
                    } 
 | 
                    for (var x = 0; x < 5; x++) { 
 | 
                        // Shortcuts 
 | 
                        var Tx4 = T[(x + 4) % 5]; 
 | 
                        var Tx1 = T[(x + 1) % 5]; 
 | 
                        var Tx1Msw = Tx1.high; 
 | 
                        var Tx1Lsw = Tx1.low; 
 | 
  
 | 
                        // Mix surrounding columns 
 | 
                        var tMsw = Tx4.high ^ ((Tx1Msw << 1) | (Tx1Lsw >>> 31)); 
 | 
                        var tLsw = Tx4.low  ^ ((Tx1Lsw << 1) | (Tx1Msw >>> 31)); 
 | 
                        for (var y = 0; y < 5; y++) { 
 | 
                            var lane = state[x + 5 * y]; 
 | 
                            lane.high ^= tMsw; 
 | 
                            lane.low  ^= tLsw; 
 | 
                        } 
 | 
                    } 
 | 
  
 | 
                    // Rho Pi 
 | 
                    for (var laneIndex = 1; laneIndex < 25; laneIndex++) { 
 | 
                        var tMsw; 
 | 
                        var tLsw; 
 | 
  
 | 
                        // Shortcuts 
 | 
                        var lane = state[laneIndex]; 
 | 
                        var laneMsw = lane.high; 
 | 
                        var laneLsw = lane.low; 
 | 
                        var rhoOffset = RHO_OFFSETS[laneIndex]; 
 | 
  
 | 
                        // Rotate lanes 
 | 
                        if (rhoOffset < 32) { 
 | 
                            tMsw = (laneMsw << rhoOffset) | (laneLsw >>> (32 - rhoOffset)); 
 | 
                            tLsw = (laneLsw << rhoOffset) | (laneMsw >>> (32 - rhoOffset)); 
 | 
                        } else /* if (rhoOffset >= 32) */ { 
 | 
                            tMsw = (laneLsw << (rhoOffset - 32)) | (laneMsw >>> (64 - rhoOffset)); 
 | 
                            tLsw = (laneMsw << (rhoOffset - 32)) | (laneLsw >>> (64 - rhoOffset)); 
 | 
                        } 
 | 
  
 | 
                        // Transpose lanes 
 | 
                        var TPiLane = T[PI_INDEXES[laneIndex]]; 
 | 
                        TPiLane.high = tMsw; 
 | 
                        TPiLane.low  = tLsw; 
 | 
                    } 
 | 
  
 | 
                    // Rho pi at x = y = 0 
 | 
                    var T0 = T[0]; 
 | 
                    var state0 = state[0]; 
 | 
                    T0.high = state0.high; 
 | 
                    T0.low  = state0.low; 
 | 
  
 | 
                    // Chi 
 | 
                    for (var x = 0; x < 5; x++) { 
 | 
                        for (var y = 0; y < 5; y++) { 
 | 
                            // Shortcuts 
 | 
                            var laneIndex = x + 5 * y; 
 | 
                            var lane = state[laneIndex]; 
 | 
                            var TLane = T[laneIndex]; 
 | 
                            var Tx1Lane = T[((x + 1) % 5) + 5 * y]; 
 | 
                            var Tx2Lane = T[((x + 2) % 5) + 5 * y]; 
 | 
  
 | 
                            // Mix rows 
 | 
                            lane.high = TLane.high ^ (~Tx1Lane.high & Tx2Lane.high); 
 | 
                            lane.low  = TLane.low  ^ (~Tx1Lane.low  & Tx2Lane.low); 
 | 
                        } 
 | 
                    } 
 | 
  
 | 
                    // Iota 
 | 
                    var lane = state[0]; 
 | 
                    var roundConstant = ROUND_CONSTANTS[round]; 
 | 
                    lane.high ^= roundConstant.high; 
 | 
                    lane.low  ^= roundConstant.low; 
 | 
                } 
 | 
            }, 
 | 
  
 | 
            _doFinalize: function () { 
 | 
                // Shortcuts 
 | 
                var data = this._data; 
 | 
                var dataWords = data.words; 
 | 
                var nBitsTotal = this._nDataBytes * 8; 
 | 
                var nBitsLeft = data.sigBytes * 8; 
 | 
                var blockSizeBits = this.blockSize * 32; 
 | 
  
 | 
                // Add padding 
 | 
                dataWords[nBitsLeft >>> 5] |= 0x1 << (24 - nBitsLeft % 32); 
 | 
                dataWords[((Math.ceil((nBitsLeft + 1) / blockSizeBits) * blockSizeBits) >>> 5) - 1] |= 0x80; 
 | 
                data.sigBytes = dataWords.length * 4; 
 | 
  
 | 
                // Hash final blocks 
 | 
                this._process(); 
 | 
  
 | 
                // Shortcuts 
 | 
                var state = this._state; 
 | 
                var outputLengthBytes = this.cfg.outputLength / 8; 
 | 
                var outputLengthLanes = outputLengthBytes / 8; 
 | 
  
 | 
                // Squeeze 
 | 
                var hashWords = []; 
 | 
                for (var i = 0; i < outputLengthLanes; i++) { 
 | 
                    // Shortcuts 
 | 
                    var lane = state[i]; 
 | 
                    var laneMsw = lane.high; 
 | 
                    var laneLsw = lane.low; 
 | 
  
 | 
                    // Swap endian 
 | 
                    laneMsw = ( 
 | 
                        (((laneMsw << 8)  | (laneMsw >>> 24)) & 0x00ff00ff) | 
 | 
                        (((laneMsw << 24) | (laneMsw >>> 8))  & 0xff00ff00) 
 | 
                    ); 
 | 
                    laneLsw = ( 
 | 
                        (((laneLsw << 8)  | (laneLsw >>> 24)) & 0x00ff00ff) | 
 | 
                        (((laneLsw << 24) | (laneLsw >>> 8))  & 0xff00ff00) 
 | 
                    ); 
 | 
  
 | 
                    // Squeeze state to retrieve hash 
 | 
                    hashWords.push(laneLsw); 
 | 
                    hashWords.push(laneMsw); 
 | 
                } 
 | 
  
 | 
                // Return final computed hash 
 | 
                return new WordArray.init(hashWords, outputLengthBytes); 
 | 
            }, 
 | 
  
 | 
            clone: function () { 
 | 
                var clone = Hasher.clone.call(this); 
 | 
  
 | 
                var state = clone._state = this._state.slice(0); 
 | 
                for (var i = 0; i < 25; i++) { 
 | 
                    state[i] = state[i].clone(); 
 | 
                } 
 | 
  
 | 
                return clone; 
 | 
            } 
 | 
        }); 
 | 
  
 | 
        /** 
 | 
         * Shortcut function to the hasher's object interface. 
 | 
         * 
 | 
         * @param {WordArray|string} message The message to hash. 
 | 
         * 
 | 
         * @return {WordArray} The hash. 
 | 
         * 
 | 
         * @static 
 | 
         * 
 | 
         * @example 
 | 
         * 
 | 
         *     var hash = CryptoJS.SHA3('message'); 
 | 
         *     var hash = CryptoJS.SHA3(wordArray); 
 | 
         */ 
 | 
        C.SHA3 = Hasher._createHelper(SHA3); 
 | 
  
 | 
        /** 
 | 
         * Shortcut function to the HMAC's object interface. 
 | 
         * 
 | 
         * @param {WordArray|string} message The message to hash. 
 | 
         * @param {WordArray|string} key The secret key. 
 | 
         * 
 | 
         * @return {WordArray} The HMAC. 
 | 
         * 
 | 
         * @static 
 | 
         * 
 | 
         * @example 
 | 
         * 
 | 
         *     var hmac = CryptoJS.HmacSHA3(message, key); 
 | 
         */ 
 | 
        C.HmacSHA3 = Hasher._createHmacHelper(SHA3); 
 | 
    }(Math)); 
 | 
  
 | 
  
 | 
    return CryptoJS.SHA3; 
 | 
  
 | 
})); 
 |