{"version":3,"sources":["webpack:///./node_modules/cos-js-sdk-v5/src/util.js","webpack:///./node_modules/cos-js-sdk-v5/src/event.js","webpack:///./node_modules/cos-js-sdk-v5/src/session.js","webpack:///./node_modules/cos-js-sdk-v5/lib/xml2json.js","webpack:///./node_modules/cos-js-sdk-v5/src/cos.js","webpack:///./node_modules/cos-js-sdk-v5/src/advance.js","webpack:///./node_modules/xmldom/dom-parser.js","webpack:///./node_modules/cos-js-sdk-v5/index.js","webpack:///./src/assets/js/upload.js","webpack:///./node_modules/xmldom/dom.js","webpack:///./node_modules/cos-js-sdk-v5/lib/md5.js","webpack:///./node_modules/cos-js-sdk-v5/src/base.js","webpack:///./node_modules/cos-js-sdk-v5/lib/json2xml.js","webpack:///./node_modules/cos-js-sdk-v5/src/async.js","webpack:///./node_modules/cos-js-sdk-v5/lib/request.js","webpack:///./node_modules/xmldom/sax.js","webpack:///./node_modules/cos-js-sdk-v5/lib/crypto.js","webpack:///./node_modules/cos-js-sdk-v5/src/task.js"],"names":["md5","CryptoJS","xml2json","json2xml","camSafeUrlEncode","str","encodeURIComponent","replace","getObjectKeys","obj","forKey","list","key","hasOwnProperty","push","toLowerCase","sort","a","b","obj2str","lowerCaseKey","i","val","keyList","length","undefined","join","signHeaders","getSignHeaderObj","headers","signHeaderObj","indexOf","getAuth","opt","pathname","SecretId","SecretKey","KeyTime","method","Method","queryParams","clone","Query","params","Headers","Key","UseRawKey","Pathname","Host","host","Bucket","Region","Error","now","Math","round","getSkewTime","SystemClockOffset","exp","Expires","expires","qSignAlgorithm","qAk","qSignTime","qKeyTime","qHeaderList","qUrlParamList","signKey","HmacSHA1","toString","formatString","util","stringToSign","SHA1","qSignature","authorization","readIntBE","chunk","size","offset","bytes","buf","slice","Uint8Array","reverse","8","16","Uint16Array","32","Uint32Array","buf2str","start","end","isUtf8","forEach","charCode","String","fromCharCode","decodeURIComponent","escape","parseSelectPayload","header","body","result","records","byteLength","content","totalLength","headerLength","payloadRestLength","headerNameLength","headerName","headerValueLength","headerValue","stats","Stats","errCode","errMessage","err","message","name","code","error","includes","payload","getSourceParams","source","parser","this","options","CopySourceParser","m","match","noop","clearKey","retObj","readAsBinaryString","blob","callback","readFun","fr","FileReader","prototype","onload","readAsArrayBuffer","fileData","binary","reader","e","console","call","fileSliceNeedCopy","compareVersion","split","parseInt","check","ua","ChromeVersion","QBCoreVersion","QQBrowserVersion","need","navigator","userAgent","fileSlice","file","isUseToUpload","mozSlice","webkitSlice","Blob","getBodyMd5","UploadCheckContentMd5","Body","onProgress","getFileMd5","md5ChunkSize","loaded","md5ctx","getCtx","next","hash","digest","min","update","total","percent","map","v","attr","defaultValue","extend","target","each","isArray","arr","Array","isInArray","item","flag","makeArray","fn","o","filter","iaArr","binaryBase64","len","char","res","btoa","uuid","S4","random","substring","hasMissingParams","apiName","Domain","checkBucket","checkRegion","formatParams","headerMap","paramKey","headerKey","apiWrapper","apiFn","self","formatResult","RequestId","VersionId","DeleteMarker","_callback","data","checkParams","missingResult","CompatibilityMode","test","warn","AppId","substr","errMsg","isSync","window","Promise","resolve","reject","throttleOnProgress","time1","timer","size0","size1","time0","Date","speed","max","floor","info","immediately","clearTimeout","setTimeout","ProgressInterval","getFileSize","api","type","ArrayBuffer","ContentLength","sourceErr","stack","Object","defineProperty","writable","enumerable","isNode","process","isCIHost","url","isBrowser","module","exports","initEvent","cos","listeners","getList","action","on","off","splice","emit","cb","EventProxy","init","cache","cacheKey","getCache","JSON","parse","localStorage","getItem","setCache","setItem","stringify","changed","mtime","save","mod","using","setUsing","removeUsing","getFileId","ChunkSize","lastModifiedDate","getUploadIdList","saveUploadId","UploadId","limit","unshift","removeUploadId","DOMParser","xmlToJSON","version","mergeCDATA","normalize","stripElemPrefix","prefixMatch","RegExp","grokType","sValue","isFinite","parseFloat","parseString","xmlString","xml","stringToXML","getElementsByTagName","parseXML","oXMLParent","vResult","nLength","sCollectedTxt","childNum","childNodes","oNode","sProp","vContent","nItem","nodeType","nodeValue","nodeName","constructor","keys","xmlToString","xmlDoc","XMLSerializer","serializeToString","parseFromString","ActiveXObject","async","loadXML","event","task","base","advance","defaultOptions","SecurityToken","ChunkRetryTimes","FileParallelLimit","ChunkParallelLimit","SliceSize","CopyChunkParallelLimit","CopyChunkSize","CopySliceSize","MaxPartNumber","ServiceDomain","Protocol","ForcePathStyle","Timeout","CorrectClockSkew","UploadQueueSize","UploadAddMetaMd5","UploadIdCacheLimit","UseAccelerate","COS","getAuthorization","session","Async","sliceUploadFile","FileSize","ep","TaskId","AsyncLimit","StorageClass","ServerSideEncryption","onHashProgress","_isRunningTask","UploadData","UploadCompleteData","_UploadCompleteData","metaHeaders","k","shortKey","uploadSliceComplete","SliceList","uploadSliceList","_params","getUploadIdAndPartList","PartList","SIZE","AutoChunkSize","SkipTask","putObject","ETagMap","SliceCount","ceil","FinishSize","getChunkETag","PartNumber","ETag","Size","chunkItem","isAvailableUploadList","PartCount","PartSliceSize","index","Part","errData","Uploaded","multipartInit","UploadIdList","eachLimit","asyncCallback","wholeMultipartListPart","PartListData","isAvailable","AvailableUploadData","RemoteUploadIdList","LocalUploadIdList","wholeMultipartList","UploadList","toUpperCase","UploadID","sendParams","Prefix","multipartList","apply","Upload","IsTruncated","KeyMarker","NextKeyMarker","UploadIdMarker","NextUploadIdMarker","multipartListPart","PartNumberMarker","NextPartNumberMarker","ChunkParallel","needUploadSlices","SliceItem","currentSize","preAddSize","uploadSliceItem","FileBody","headersWhiteList","PartItem","retry","tryCallback","multipartUpload","Parts","multipartComplete","abortUploadTask","Level","AbortArray","abortUploadTaskArray","resultList","AbortItem","nextItem","eachIndex","KeyNotMatch","multipartAbort","successList","errorList","uploadFile","taskList","fileInfo","_onTaskReady","onTaskReady","tid","_onFileFinish","onFileFinish","_addTasks","uploadFiles","TotalSize","TotalFinish","onTotalProgress","unFinishCount","files","_onTotalFileFinish","onTotalFileFinish","Index","fileParams","PreAddSize","_onProgress","sliceCopyFile","CopySource","SourceBucket","SourceRegion","SourceKey","CopySourceRange","copySliceItem","SourceHeaders","TargetHeader","ChunkCount","partNumber","restoreHeader","headObject","statusCode","ErrorStatus","putObjectCopy","resHeaders","metaPrefix","uploadPartCopy","API_MAP","transferToTaskMethod","locator","buildErrorHandler","errorImpl","domBuilder","DOMHandler","errorHandler","isCallback","Function","build","msg","_locator","cdata","position","node","lineNumber","columnNumber","l","systemId","_toString","chars","java","lang","appendElement","hander","currentElement","appendChild","doc","mimeType","sax","XMLReader","defaultNSMap","xmlns","entityMap","setDocumentLocator","nbsp","copy","startDocument","DOMImplementation","createDocument","documentURI","startElement","namespaceURI","localName","qName","attrs","el","createElementNS","getURI","value","getValue","getQName","createAttributeNS","getLocator","setAttributeNode","endElement","current","tagName","parentNode","startPrefixMapping","prefix","uri","endPrefixMapping","processingInstruction","ins","createProcessingInstruction","ignorableWhitespace","ch","characters","arguments","charNode","createCDATASection","createTextNode","skippedEntity","endDocument","comment","comm","createComment","startCDATA","endCDATA","startDTD","publicId","impl","implementation","createDocumentType","dt","warning","fatalError","require","config","upload","option","_data","_fileName","_key","taskKey","_file","taskId","Notification","title","fileName","progressData","getTaskList","onError","_url","getObjectUrl","onSuccess","getBucket","deleteObject","_allTaskList","_uploading","_taskList","state","store","dispatch","uploading","btnVisible","getBucketCors","log","putBucketCors","CORSRules","AllowedOrigin","AllowedMethod","AllowedHeader","ExposeHeader","pauseTask","id","restartTask","cancelTask","src","dest","p","_extends","Class","Super","pt","create","ppt","__proto__","t","htmlns","NodeType","ELEMENT_NODE","ATTRIBUTE_NODE","TEXT_NODE","CDATA_SECTION_NODE","ENTITY_REFERENCE_NODE","ENTITY_NODE","PROCESSING_INSTRUCTION_NODE","COMMENT_NODE","DOCUMENT_NODE","DOCUMENT_TYPE_NODE","DOCUMENT_FRAGMENT_NODE","NOTATION_NODE","ExceptionCode","ExceptionMessage","HIERARCHY_REQUEST_ERR","INDEX_SIZE_ERR","DOMSTRING_SIZE_ERR","NOT_FOUND_ERR","WRONG_DOCUMENT_ERR","INVALID_CHARACTER_ERR","NO_DATA_ALLOWED_ERR","NO_MODIFICATION_ALLOWED_ERR","INUSE_ATTRIBUTE_ERR","NOT_SUPPORTED_ERR","INVALID_STATE_ERR","SYNTAX_ERR","INVALID_MODIFICATION_ERR","NAMESPACE_ERR","INVALID_ACCESS_ERR","DOMException","captureStackTrace","NodeList","LiveNodeList","refresh","_node","_refresh","_updateLiveList","inc","_inc","ownerDocument","ls","__set__","NamedNodeMap","_findNodeIndex","_addNamedNode","newAttr","oldAttr","ownerElement","_onRemoveAttribute","_onAddAttribute","_removeNamedNode","lastIndex","features","_features","feature","Node","_xmlEncoder","c","charCodeAt","_visitNode","firstChild","nextSibling","Document","ns","_nsMap","remove","_onUpdateChild","newChild","cs","child","_removeChild","previous","previousSibling","lastChild","_insertBefore","nextChild","cp","removeChild","newFirst","newLast","pre","_appendSingleChild","Element","Attr","CharacterData","Text","Comment","CDATASection","DocumentType","Notation","Entity","EntityReference","DocumentFragment","ProcessingInstruction","nodeSerializeToString","isHtml","nodeFilter","refNode","documentElement","lookupPrefix","visibleNamespaces","namespace","needNamespaceDefine","isHTML","attributes","pubid","sysid","sub","internalSubset","importNode","deep","node2","cloneNode","n","attrs2","_ownerElement","object","getNamedItem","setNamedItem","setNamedItemNS","getNamedItemNS","removeNamedItem","removeNamedItemNS","hasFeature","versions","qualifiedName","doctype","root","insertBefore","refChild","replaceChild","oldChild","hasChildNodes","appendData","isSupported","hasAttributes","lookupNamespaceURI","isDefaultNamespace","importedNode","getElementById","rtv","getAttribute","createElement","createDocumentFragment","createAttribute","specified","createEntityReference","pl","hasAttribute","getAttributeNode","setAttribute","removeAttribute","removeAttributeNode","setAttributeNodeNS","removeAttributeNS","old","getAttributeNodeNS","hasAttributeNS","getAttributeNS","setAttributeNS","getElementsByTagNameNS","substringData","count","text","insertData","replaceData","deleteData","splitText","newText","newNode","getTextContent","get","$$length","set","ERROR","WINDOW","JS_MD5_NO_WINDOW","WEB_WORKER","NODE_JS","JS_MD5_NO_NODE_JS","global","COMMON_JS","JS_MD5_NO_COMMON_JS","AMD","ARRAY_BUFFER","JS_MD5_NO_ARRAY_BUFFER","HEX_CHARS","EXTRA","SHIFT","OUTPUT_TYPES","BASE64_ENCODE_CHAR","blocks","buffer8","buffer","JS_MD5_NO_ARRAY_BUFFER_IS_VIEW","isView","createOutputMethod","outputType","isBinStr","Md5","createMethod","nodeWrap","crypto","eval","Buffer","nodeMethod","createHash","sharedMemory","h0","h1","h2","h3","hBytes","finalized","hashed","first","lastByteIndex","finalize","d","bc","da","hex","format","array","arrayBuffer","base64","v1","v2","v3","base64Str","REQUEST","getService","protocol","location","domain","appId","region","SignHost","standardHost","urlHost","submitRequest","Action","buckets","ListAllMyBucketsResult","Buckets","owner","Owner","putBucket","CreateBucketConfiguration","BucketAZConfig","getUrl","bucket","isLocation","Location","headBucket","reqParams","ResourceKey","qs","ListBucketResult","Contents","CommonPrefixes","deleteBucket","putBucketAcl","AccessControlPolicy","Grants","Grant","AccessControlList","uniqGrant","getBucketAcl","decodeAcl","ACL","CORSConfiguration","rule","sKey","CORSRule","Code","deleteBucketCors","getBucketLocation","putBucketPolicy","Policy","PolicyStr","getBucketPolicy","rawBody","deleteBucketPolicy","putBucketTagging","Tagging","Tags","TagSet","Tag","getBucketTagging","deleteBucketTagging","putBucketLifecycle","LifecycleConfiguration","Rules","Rule","getBucketLifecycle","deleteBucketLifecycle","putBucketVersioning","VersioningConfiguration","getBucketVersioning","putBucketReplication","ReplicationConfiguration","getBucketReplication","deleteBucketReplication","putBucketWebsite","WebsiteConfiguration","RoutingRules","RoutingRule","getBucketWebsite","deleteBucketWebsite","putBucketReferer","RefererConfiguration","DomainList","Domains","getBucketReferer","putBucketDomain","DomainConfiguration","DomainRule","getBucketDomain","deleteBucketDomain","putBucketOrigin","OriginConfiguration","OriginRule","getBucketOrigin","deleteBucketOrigin","putBucketLogging","BucketLoggingStatus","getBucketLogging","putBucketInventory","InventoryConfiguration","OptionalFields","Field","Destination","COSBucketDestination","Encryption","getBucketInventory","listBucketInventory","ListInventoryConfigurationResult","InventoryConfigurations","deleteBucketInventory","putBucketAccelerate","configuration","AccelerateConfiguration","getBucketAccelerate","putBucketEncryption","conf","ServerSideEncryptionConfiguration","getBucketEncryption","EncryptionConfiguration","deleteBucketEncryption","NotModified","listObjectVersions","ListVersionsResult","DeleteMarkers","Versions","Version","getObject","reqParamsStr","QueryString","DataType","qsStr","onDownloadProgress","needCalcMd5","Recursive","BucketNotFound","getObjectAcl","GrantWrite","putObjectAcl","optionsObject","OptionsForbidden","AccessControlAllowOrigin","AccessControlAllowMethods","AccessControlAllowHeaders","AccessControlExposeHeaders","AccessControlMaxAge","Scope","CopyObjectResult","uploadId","CopyPartResult","deleteMultipleObject","Objects","Quiet","Delete","DeleteResult","Deleted","Errors","restoreObject","RestoreRequest","putObjectTagging","getObjectTagging","deleteObjectTagging","selectObjectContent","SelectType","SelectRequest","Payload","InitiateMultipartUploadResult","CompleteMultipartUpload","CompleteMultipartUploadResult","ProcessResults","UploadResult","OriginalInfo","ImageInfo","ListMultipartUploadsResult","ListPartsResult","request","Url","RawBody","appendObject","Position","queryParamsStr","syncUrl","Sign","getSignHost","AuthData","getAuthorizationAsync","replaceUrlParamList","urlParams","encodedParams","reg","replacedUrl","signUrl","Authorization","ClientIP","ClientUA","Token","GrantFullControl","GrantRead","GrantReadAcp","GrantWriteAcp","GrantMap","PublicAcl","READ","WRITE","FULL_CONTROL","Grantee","ID","URI","Permission","exist","trim","longBucket","shortBucket","lastIndexOf","standardHostReg","headerHost","cbDone","XCosSecurityToken","KeyName","StsData","ScopeKey","_StsCache","compareTime","StartTime","ExpiredTime","ScopeLimit","calcAuthByTmpKey","TmpSecretId","TmpSecretKey","checkAuthError","formatAllow","auth","atob","AuthError","getSTS","allowRetry","isTimeError","serverDate","date","ServerTime","errorCode","errorMessage","Message","serverTime","abs","versionId","paramsUrl","tryTimes","oldClockOffset","_submitRequest","token","contentLength","dataType","timeout","pathStyle","sender","Request","r","receive","response","hasReturned","statusMessage","killTask","json","statusSuccess","xmlError","abort","warnOldApi","proto","suffix","oldName","warned","element_start_char","element_non_start_char","element_replace","not_safe_in_xml","objKeys","process_to_xml","node_data","makeNode","level","hasSubNodes","indent_value","indent","prettyPrint","removeIllegalNameCharacters","node_descriptor","ret","toJSON","nodes","j","esc","xml_header","standalone","xmlHeader","xmlheader","docType","iterator","completed","started","running","replenish","times","stringifyPrimitive","queryStringify","sep","eq","ks","Boolean","xhrRes","xhr","getAllResponseHeaders","status","statusText","xhrBody","responseText","XMLHttpRequest","open","responseType","xhrFields","xhrField","setRequestHeader","onprogress","ontimeout","onerror","send","nameStartChar","nameChar","tagNamePattern","S_TAG","S_ATTR","S_ATTR_SPACE","S_EQ","S_ATTR_NOQUOT_VALUE","S_ATTR_END","S_TAG_SPACE","S_TAG_CLOSE","defaultNSMapCopy","fixedFromCharCode","surrogate1","surrogate2","entityReplacer","charAt","appendText","xt","lineEnd","linePattern","exec","lineStart","parseStack","currentNSMap","closeMap","tagStart","pop","localNSMap","endMatch","endIgnoreCaseMach","parseInstruction","parseDCC","ElementAttributes","parseElementStartPart","closed","fixSelfClosed","locator2","copyLocator","parseHtmlSpecialContent","f","attrName","s","add","setTagName","nsp","nsPrefix","_copy","elStartEnd","elEndStart","pos","matchs","lastMatch","endDTD","_set_proto_","thiz","parent","getLocalName","g","lib","Base","mixIn","$super","WordArray","words","sigBytes","concat","q","clamp","enc","Hex","Latin1","h","Utf8","unescape","BufferedBlockAlgorithm","reset","_nDataBytes","_append","_process","blockSize","_minBufferSize","_doProcessBlock","Hasher","cfg","_doReset","_doFinalize","_createHelper","_createHmacHelper","HMAC","algo","_hash","_hasher","_oKey","_iKey","C","C_lib","C_enc","Base64","wordArray","_map","base64Chars","byte1","byte2","byte3","triplet","paddingChar","base64StrLength","paddingIndex","nBytes","bits1","bits2","originApiMap","apiMap","_addTask","initTask","queue","tasks","uploadingFileCount","nextUploadIndex","formatTask","FilePath","hashPercent","_custom","emitListUpdate","clearQueue","isActive","startNextTask","onTaskStart","apiParams","switchToState","waiting","pipe","toState","isTaskReadyWarning","ignoreAddEvent","TaskReady","isUploadRunning"],"mappings":"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","file":"manageStatic/js/chunk-3920ae98.494516d9.js","sourcesContent":["'use strict';\n\nvar md5 = require('../lib/md5');\nvar CryptoJS = require('../lib/crypto');\nvar xml2json = require('../lib/xml2json');\nvar json2xml = require('../lib/json2xml');\n\nfunction camSafeUrlEncode(str) {\n return encodeURIComponent(str)\n .replace(/!/g, '%21')\n .replace(/'/g, '%27')\n .replace(/\\(/g, '%28')\n .replace(/\\)/g, '%29')\n .replace(/\\*/g, '%2A');\n}\n\nfunction getObjectKeys(obj, forKey) {\n var list = [];\n for (var key in obj) {\n if (obj.hasOwnProperty(key)) {\n list.push(forKey ? camSafeUrlEncode(key).toLowerCase() : key);\n }\n }\n return list.sort(function (a, b) {\n a = a.toLowerCase();\n b = b.toLowerCase();\n return a === b ? 0 : (a > b ? 1 : -1);\n });\n};\n\n/**\n * obj转为string\n * @param {Object} obj 需要转的对象,必须\n * @param {Boolean} lowerCaseKey key是否转为小写,默认false,非必须\n * @return {String} data 返回字符串\n */\nvar obj2str = function (obj, lowerCaseKey) {\n var i, key, val;\n var list = [];\n var keyList = getObjectKeys(obj);\n for (i = 0; i < keyList.length; i++) {\n key = keyList[i];\n val = (obj[key] === undefined || obj[key] === null) ? '' : ('' + obj[key]);\n key = lowerCaseKey? camSafeUrlEncode(key).toLowerCase() : camSafeUrlEncode(key);\n val = camSafeUrlEncode(val) || '';\n list.push(key + '=' + val)\n }\n return list.join('&');\n};\n\n\n// 可以签入签名的headers\nvar signHeaders = ['content-disposition', 'content-encoding', 'content-length', 'content-md5',\n 'expect', 'host', 'if-match', 'if-modified-since', 'if-none-match', 'if-unmodified-since',\n 'origin', 'range', 'response-cache-control', 'response-content-disposition', 'response-content-encoding',\n 'response-content-language', 'response-content-type', 'response-expires', 'transfer-encoding', 'versionid'];\n\nvar getSignHeaderObj = function (headers) {\n var signHeaderObj = {};\n for (var i in headers) {\n var key = i.toLowerCase();\n if (key.indexOf('x-cos-') > -1 || signHeaders.indexOf(key) > -1) {\n signHeaderObj[i] = headers[i];\n }\n }\n return signHeaderObj;\n}\n\n//测试用的key后面可以去掉\nvar getAuth = function (opt) {\n opt = opt || {};\n\n var SecretId = opt.SecretId;\n var SecretKey = opt.SecretKey;\n var KeyTime = opt.KeyTime;\n var method = (opt.method || opt.Method || 'get').toLowerCase();\n var queryParams = clone(opt.Query || opt.params || {});\n var headers = getSignHeaderObj(clone(opt.Headers || opt.headers || {}));\n\n var Key = opt.Key || '';\n var pathname;\n if (opt.UseRawKey) {\n pathname = opt.Pathname || opt.pathname || '/' + Key;\n } else {\n pathname = opt.Pathname || opt.pathname || Key;\n pathname.indexOf('/') !== 0 && (pathname = '/' + pathname);\n }\n\n // 如果有传入存储桶,那么签名默认加 Host 参与计算,避免跨桶访问\n if (!headers.Host && !headers.host && opt.Bucket && opt.Region) headers.Host = opt.Bucket + '.cos.' + opt.Region + '.myqcloud.com';\n\n if (!SecretId) throw new Error('missing param SecretId');\n if (!SecretKey) throw new Error('missing param SecretKey');\n\n // 签名有效起止时间\n var now = Math.round(getSkewTime(opt.SystemClockOffset) / 1000) - 1;\n var exp = now;\n\n var Expires = opt.Expires || opt.expires;\n if (Expires === undefined) {\n exp += 900; // 签名过期时间为当前 + 900s\n } else {\n exp += (Expires * 1) || 0;\n }\n\n // 要用到的 Authorization 参数列表\n var qSignAlgorithm = 'sha1';\n var qAk = SecretId;\n var qSignTime = KeyTime || now + ';' + exp;\n var qKeyTime = KeyTime || now + ';' + exp;\n var qHeaderList = getObjectKeys(headers, true).join(';').toLowerCase();\n var qUrlParamList = getObjectKeys(queryParams, true).join(';').toLowerCase();\n\n // 签名算法说明文档:https://www.qcloud.com/document/product/436/7778\n // 步骤一:计算 SignKey\n var signKey = CryptoJS.HmacSHA1(qKeyTime, SecretKey).toString();\n\n // 步骤二:构成 FormatString\n var formatString = [method, pathname, util.obj2str(queryParams, true), util.obj2str(headers, true), ''].join('\\n');\n\n // 步骤三:计算 StringToSign\n var stringToSign = ['sha1', qSignTime, CryptoJS.SHA1(formatString).toString(), ''].join('\\n');\n\n // 步骤四:计算 Signature\n var qSignature = CryptoJS.HmacSHA1(stringToSign, signKey).toString();\n\n // 步骤五:构造 Authorization\n var authorization = [\n 'q-sign-algorithm=' + qSignAlgorithm,\n 'q-ak=' + qAk,\n 'q-sign-time=' + qSignTime,\n 'q-key-time=' + qKeyTime,\n 'q-header-list=' + qHeaderList,\n 'q-url-param-list=' + qUrlParamList,\n 'q-signature=' + qSignature\n ].join('&');\n\n return authorization;\n\n};\n\nvar readIntBE = function (chunk, size, offset) {\n var bytes = size / 8;\n var buf = chunk.slice(offset, offset + bytes);\n new Uint8Array(buf).reverse();\n return new ({8: Uint8Array, 16: Uint16Array, 32: Uint32Array})[size](buf)[0];\n};\nvar buf2str = function (chunk, start, end, isUtf8) {\n var buf = chunk.slice(start, end);\n var str = '';\n new Uint8Array(buf).forEach(function (charCode) {\n str += String.fromCharCode(charCode)\n });\n if (isUtf8) str = decodeURIComponent(escape(str));\n return str;\n};\nvar parseSelectPayload = function (chunk) {\n var header = {};\n var body = buf2str(chunk);\n var result = {records:[]};\n while (chunk.byteLength) {\n var totalLength = readIntBE(chunk, 32, 0);\n var headerLength = readIntBE(chunk, 32, 4);\n var payloadRestLength = totalLength - headerLength - 16;\n var offset = 0;\n var content;\n chunk = chunk.slice(12);\n // 获取 Message 的 header 信息\n while (offset < headerLength) {\n var headerNameLength = readIntBE(chunk, 8, offset);\n var headerName = buf2str(chunk, offset + 1, offset + 1 + headerNameLength);\n var headerValueLength = readIntBE(chunk, 16, offset + headerNameLength + 2);\n var headerValue = buf2str(chunk, offset + headerNameLength + 4, offset + headerNameLength + 4 + headerValueLength);\n header[headerName] = headerValue;\n offset += headerNameLength + 4 + headerValueLength;\n }\n if (header[':event-type'] === 'Records') {\n content = buf2str(chunk, offset, offset + payloadRestLength, true);\n result.records.push(content);\n } else if (header[':event-type'] === 'Stats') {\n content = buf2str(chunk, offset, offset + payloadRestLength, true);\n result.stats = util.xml2json(content).Stats;\n } else if (header[':event-type'] === 'error') {\n var errCode = header[':error-code'];\n var errMessage = header[':error-message'];\n var err = new Error(errMessage);\n err.message = errMessage;\n err.name = err.code = errCode;\n result.error = err;\n } else if (['Progress', 'Continuation', 'End'].includes(header[':event-type'])) {\n // do nothing\n }\n chunk = chunk.slice(offset + payloadRestLength + 4);\n }\n return {\n payload: result.records.join(''),\n body: body,\n };\n};\n\nvar getSourceParams = function (source) {\n var parser = this.options.CopySourceParser;\n if (parser) return parser(source);\n var m = source.match(/^([^.]+-\\d+)\\.cos(v6|-cdc)?\\.([^.]+)\\.myqcloud\\.com\\/(.+)$/);\n if (!m) return null;\n return { Bucket: m[1], Region: m[3], Key: m[4] };\n};\n\nvar noop = function () {\n\n};\n\n// 清除对象里值为的 undefined 或 null 的属性\nvar clearKey = function (obj) {\n var retObj = {};\n for (var key in obj) {\n if (obj.hasOwnProperty(key) && obj[key] !== undefined && obj[key] !== null) {\n retObj[key] = obj[key];\n }\n }\n return retObj;\n};\n\nvar readAsBinaryString = function (blob, callback) {\n var readFun;\n var fr = new FileReader();\n if (FileReader.prototype.readAsBinaryString) {\n readFun = FileReader.prototype.readAsBinaryString;\n fr.onload = function () {\n callback(this.result);\n };\n } else if (FileReader.prototype.readAsArrayBuffer) { // 在 ie11 添加 readAsBinaryString 兼容\n readFun = function (fileData) {\n var binary = \"\";\n var pt = this;\n var reader = new FileReader();\n reader.onload = function (e) {\n var bytes = new Uint8Array(reader.result);\n var length = bytes.byteLength;\n for (var i = 0; i < length; i++) {\n binary += String.fromCharCode(bytes[i]);\n }\n callback(binary);\n };\n reader.readAsArrayBuffer(fileData);\n };\n } else {\n console.error('FileReader not support readAsBinaryString');\n }\n readFun.call(fr, blob);\n};\n\nvar fileSliceNeedCopy = (function () {\n var compareVersion = function(a, b) {\n a = a.split('.');\n b = b.split('.');\n for (var i = 0; i < b.length; i++) {\n if (a[i] !== b[i]) {\n return parseInt(a[i]) > parseInt(b[i]) ? 1 : -1;\n }\n }\n return 0;\n };\n var check = function (ua) {\n if (!ua) return false;\n var ChromeVersion = (ua.match(/Chrome\\/([.\\d]+)/) || [])[1];\n var QBCoreVersion = (ua.match(/QBCore\\/([.\\d]+)/) || [])[1];\n var QQBrowserVersion = (ua.match(/QQBrowser\\/([.\\d]+)/) || [])[1];\n var need = ChromeVersion && compareVersion(ChromeVersion, '53.0.2785.116') < 0\n && QBCoreVersion && compareVersion(QBCoreVersion, '3.53.991.400') < 0\n && QQBrowserVersion && compareVersion(QQBrowserVersion, '9.0.2524.400') <= 0 || false;\n return need;\n };\n return check(typeof navigator !== 'undefined' && navigator.userAgent);\n})();\n\n// 获取文件分片\nvar fileSlice = function (file, start, end, isUseToUpload, callback) {\n var blob;\n if (file.slice) {\n blob = file.slice(start, end);\n } else if (file.mozSlice) {\n blob = file.mozSlice(start, end);\n } else if (file.webkitSlice) {\n blob = file.webkitSlice(start, end);\n }\n if (isUseToUpload && fileSliceNeedCopy) {\n var reader = new FileReader();\n reader.onload = function (e) {\n blob = null;\n callback(new Blob([reader.result]));\n };\n reader.readAsArrayBuffer(blob);\n } else {\n callback(blob);\n }\n};\n\n// 获取文件内容的 MD5\nvar getBodyMd5 = function (UploadCheckContentMd5, Body, callback, onProgress) {\n callback = callback || noop;\n if (UploadCheckContentMd5) {\n if (typeof Body === 'string') {\n callback(util.md5(Body, true));\n } else if (Blob && Body instanceof Blob) {\n util.getFileMd5(Body, function (err, md5) {\n callback(md5);\n }, onProgress);\n } else {\n callback();\n }\n } else {\n callback();\n }\n};\n\n// 获取文件 md5 值\nvar md5ChunkSize = 1024 * 1024;\nvar getFileMd5 = function (blob, callback, onProgress) {\n var size = blob.size;\n var loaded = 0;\n var md5ctx = md5.getCtx();\n var next = function (start) {\n if (start >= size) {\n var hash = md5ctx.digest('hex');\n callback(null, hash);\n return;\n }\n var end = Math.min(size, start + md5ChunkSize);\n util.fileSlice(blob, start, end, false, function (chunk) {\n readAsBinaryString(chunk, function (content) {\n chunk = null;\n md5ctx = md5ctx.update(content, true);\n loaded += content.length;\n content = null;\n if (onProgress) onProgress({loaded: loaded, total: size, percent: Math.round(loaded / size * 10000) / 10000});\n next(start + md5ChunkSize);\n });\n });\n };\n next(0);\n};\n\nfunction clone(obj) {\n return map(obj, function (v) {\n return typeof v === 'object' && v !== null ? clone(v) : v;\n });\n}\n\nfunction attr(obj, name, defaultValue) {\n return obj && name in obj ? obj[name] : defaultValue;\n}\n\nfunction extend(target, source) {\n each(source, function (val, key) {\n target[key] = source[key];\n });\n return target;\n}\n\nfunction isArray(arr) {\n return arr instanceof Array;\n}\n\nfunction isInArray(arr, item) {\n var flag = false;\n for (var i = 0; i < arr.length; i++) {\n if (item === arr[i]) {\n flag = true;\n break;\n }\n }\n return flag;\n}\n\nfunction makeArray(arr) {\n return isArray(arr) ? arr : [arr];\n}\n\nfunction each(obj, fn) {\n for (var i in obj) {\n if (obj.hasOwnProperty(i)) {\n fn(obj[i], i);\n }\n }\n}\n\nfunction map(obj, fn) {\n var o = isArray(obj) ? [] : {};\n for (var i in obj) {\n if (obj.hasOwnProperty(i)) {\n o[i] = fn(obj[i], i);\n }\n }\n return o;\n}\n\nfunction filter(obj, fn) {\n var iaArr = isArray(obj);\n var o = iaArr ? [] : {};\n for (var i in obj) {\n if (obj.hasOwnProperty(i)) {\n if (fn(obj[i], i)) {\n if (iaArr) {\n o.push(obj[i]);\n } else {\n o[i] = obj[i];\n }\n }\n }\n }\n return o;\n}\n\nvar binaryBase64 = function (str) {\n var i, len, char, res = '';\n for (i = 0, len = str.length / 2; i < len; i++) {\n char = parseInt(str[i * 2] + str[i * 2 + 1], 16);\n res += String.fromCharCode(char);\n }\n return btoa(res);\n};\nvar uuid = function () {\n var S4 = function () {\n return (((1 + Math.random()) * 0x10000) | 0).toString(16).substring(1);\n };\n return (S4() + S4() + \"-\" + S4() + \"-\" + S4() + \"-\" + S4() + \"-\" + S4() + S4() + S4());\n};\n\nvar hasMissingParams = function (apiName, params) {\n var Bucket = params.Bucket;\n var Region = params.Region;\n var Key = params.Key;\n var Domain = this.options.Domain;\n var checkBucket = !Domain || Domain.indexOf('{Bucket}') > -1;\n var checkRegion = !Domain || Domain.indexOf('{Region}') > -1;\n if (apiName.indexOf('Bucket') > -1 || apiName === 'deleteMultipleObject' || apiName === 'multipartList' || apiName === 'listObjectVersions') {\n if (checkBucket && !Bucket) return 'Bucket';\n if (checkRegion && !Region) return 'Region';\n } else if (apiName.indexOf('Object') > -1 || apiName.indexOf('multipart') > -1 || apiName === 'sliceUploadFile' || apiName === 'abortUploadTask') {\n if (checkBucket && !Bucket) return 'Bucket';\n if (checkRegion && !Region) return 'Region';\n if (!Key) return 'Key';\n }\n return false;\n};\n\nvar formatParams = function (apiName, params) {\n\n // 复制参数对象\n params = extend({}, params);\n\n // 统一处理 Headers\n if (apiName !== 'getAuth' && apiName !== 'getV4Auth' && apiName !== 'getObjectUrl') {\n var Headers = params.Headers || {};\n if (params && typeof params === 'object') {\n (function () {\n for (var key in params) {\n if (params.hasOwnProperty(key) && key.indexOf('x-cos-') > -1) {\n Headers[key] = params[key];\n }\n }\n })();\n\n var headerMap = {\n // params headers\n 'x-cos-mfa': 'MFA',\n 'Content-MD5': 'ContentMD5',\n 'Content-Length': 'ContentLength',\n 'Content-Type': 'ContentType',\n 'Expect': 'Expect',\n 'Expires': 'Expires',\n 'Cache-Control': 'CacheControl',\n 'Content-Disposition': 'ContentDisposition',\n 'Content-Encoding': 'ContentEncoding',\n 'Range': 'Range',\n 'If-Modified-Since': 'IfModifiedSince',\n 'If-Unmodified-Since': 'IfUnmodifiedSince',\n 'If-Match': 'IfMatch',\n 'If-None-Match': 'IfNoneMatch',\n 'x-cos-copy-source': 'CopySource',\n 'x-cos-copy-source-Range': 'CopySourceRange',\n 'x-cos-metadata-directive': 'MetadataDirective',\n 'x-cos-copy-source-If-Modified-Since': 'CopySourceIfModifiedSince',\n 'x-cos-copy-source-If-Unmodified-Since': 'CopySourceIfUnmodifiedSince',\n 'x-cos-copy-source-If-Match': 'CopySourceIfMatch',\n 'x-cos-copy-source-If-None-Match': 'CopySourceIfNoneMatch',\n 'x-cos-acl': 'ACL',\n 'x-cos-grant-read': 'GrantRead',\n 'x-cos-grant-write': 'GrantWrite',\n 'x-cos-grant-full-control': 'GrantFullControl',\n 'x-cos-grant-read-acp': 'GrantReadAcp',\n 'x-cos-grant-write-acp': 'GrantWriteAcp',\n 'x-cos-storage-class': 'StorageClass',\n 'x-cos-traffic-limit': 'TrafficLimit',\n 'x-cos-mime-limit': 'MimeLimit',\n // SSE-C\n 'x-cos-server-side-encryption-customer-algorithm': 'SSECustomerAlgorithm',\n 'x-cos-server-side-encryption-customer-key': 'SSECustomerKey',\n 'x-cos-server-side-encryption-customer-key-MD5': 'SSECustomerKeyMD5',\n // SSE-COS、SSE-KMS\n 'x-cos-server-side-encryption': 'ServerSideEncryption',\n 'x-cos-server-side-encryption-cos-kms-key-id': 'SSEKMSKeyId',\n 'x-cos-server-side-encryption-context': 'SSEContext',\n };\n util.each(headerMap, function (paramKey, headerKey) {\n if (params[paramKey] !== undefined) {\n Headers[headerKey] = params[paramKey];\n }\n });\n\n params.Headers = clearKey(Headers);\n }\n }\n\n return params;\n};\n\nvar apiWrapper = function (apiName, apiFn) {\n return function (params, callback) {\n\n var self = this;\n\n // 处理参数\n if (typeof params === 'function') {\n callback = params;\n params = {};\n }\n\n // 整理参数格式\n params = formatParams(apiName, params);\n\n // 代理回调函数\n var formatResult = function (result) {\n if (result && result.headers) {\n result.headers['x-cos-request-id'] && (result.RequestId = result.headers['x-cos-request-id']);\n result.headers['x-cos-version-id'] && (result.VersionId = result.headers['x-cos-version-id']);\n result.headers['x-cos-delete-marker'] && (result.DeleteMarker = result.headers['x-cos-delete-marker']);\n }\n return result;\n };\n var _callback = function (err, data) {\n callback && callback(formatResult(err), formatResult(data));\n };\n\n var checkParams = function () {\n if (apiName !== 'getService' && apiName !== 'abortUploadTask') {\n // 判断参数是否完整\n var missingResult = hasMissingParams.call(self, apiName, params)\n if (missingResult) {\n return 'missing param ' + missingResult;\n }\n // 判断 region 格式\n if (params.Region) {\n if (self.options.CompatibilityMode) {\n if (!/^([a-z\\d-.]+)$/.test(params.Region)) {\n return 'Region format error.';\n }\n } else {\n if (params.Region.indexOf('cos.') > -1) {\n return 'param Region should not be start with \"cos.\"';\n } else if (!/^([a-z\\d-]+)$/.test(params.Region)) {\n return 'Region format error.';\n }\n }\n // 判断 region 格式\n if (!self.options.CompatibilityMode\n && params.Region.indexOf('-') === -1\n && params.Region !== 'yfb'\n && params.Region !== 'default'\n && params.Region !== 'accelerate' ) {\n console.warn('warning: param Region format error, find help here: https://cloud.tencent.com/document/product/436/6224');\n }\n }\n // 兼容不带 AppId 的 Bucket\n if (params.Bucket) {\n if (!/^([a-z\\d-]+)-(\\d+)$/.test(params.Bucket)) {\n if (params.AppId) {\n params.Bucket = params.Bucket + '-' + params.AppId;\n } else if (self.options.AppId) {\n params.Bucket = params.Bucket + '-' + self.options.AppId;\n } else {\n return 'Bucket should format as \"test-1250000000\".';\n }\n }\n if (params.AppId) {\n console.warn('warning: AppId has been deprecated, Please put it at the end of parameter Bucket(E.g Bucket:\"test-1250000000\" ).');\n delete params.AppId;\n }\n }\n // 如果 Key 是 / 开头,强制去掉第一个 /\n if (!self.options.UseRawKey && params.Key && params.Key.substr(0, 1) === '/') {\n params.Key = params.Key.substr(1);\n }\n }\n };\n\n var errMsg = checkParams();\n var isSync = apiName === 'getAuth' || apiName === 'getObjectUrl';\n if (window.Promise && !isSync && !callback) {\n return new Promise(function (resolve, reject) {\n callback = function (err, data) {\n err ? reject(err) : resolve(data);\n };\n if (errMsg) return _callback(util.error(new Error(errMsg)));\n apiFn.call(self, params, _callback);\n });\n } else {\n if (errMsg) return _callback(util.error(new Error(errMsg)));\n var res = apiFn.call(self, params, _callback);\n if (isSync) return res;\n }\n }\n};\n\nvar throttleOnProgress = function (total, onProgress) {\n var self = this;\n var size0 = 0;\n var size1 = 0;\n var time0 = Date.now();\n var time1;\n var timer;\n\n function update() {\n timer = 0;\n if (onProgress && (typeof onProgress === 'function')) {\n time1 = Date.now();\n var speed = Math.max(0, Math.round((size1 - size0) / ((time1 - time0) / 1000) * 100) / 100) || 0;\n var percent;\n if (size1 === 0 && total === 0) {\n percent = 1;\n } else {\n percent = Math.floor(size1 / total * 100) / 100 || 0;\n }\n time0 = time1;\n size0 = size1;\n try {\n onProgress({loaded: size1, total: total, speed: speed, percent: percent});\n } catch (e) {\n }\n }\n }\n\n return function (info, immediately) {\n if (info) {\n size1 = info.loaded;\n total = info.total;\n }\n if (immediately) {\n clearTimeout(timer);\n update();\n } else {\n if (timer) return;\n timer = setTimeout(update, self.options.ProgressInterval);\n }\n };\n};\n\nvar getFileSize = function (api, params, callback) {\n var size;\n if (typeof params.Body === 'string') {\n params.Body = new Blob([params.Body], {type: 'text/plain'});\n } else if (params.Body instanceof ArrayBuffer) {\n params.Body = new Blob([params.Body]);\n }\n if ((params.Body && (params.Body instanceof Blob || params.Body.toString() === '[object File]' || params.Body.toString() === '[object Blob]'))) {\n size = params.Body.size;\n } else {\n callback(util.error(new Error('params body format error, Only allow File|Blob|String.')));\n return;\n }\n params.ContentLength = size;\n callback(null, size);\n};\n\n// 获取调正的时间戳\nvar getSkewTime = function (offset) {\n return Date.now() + (offset || 0);\n};\n\n\nvar error = function (err, opt) {\n var sourceErr = err;\n err.message = err.message || null;\n\n if (typeof opt === 'string') {\n err.error = opt;\n err.message = opt;\n } else if (typeof opt === 'object' && opt !== null) {\n extend(err, opt);\n if (opt.code || opt.name) err.code = opt.code || opt.name;\n if (opt.message) err.message = opt.message;\n if (opt.stack) err.stack = opt.stack;\n }\n\n if (typeof Object.defineProperty === 'function') {\n Object.defineProperty(err, 'name', {writable: true, enumerable: false});\n Object.defineProperty(err, 'message', {enumerable: true});\n }\n\n err.name = opt && opt.name || err.name || err.code || 'Error';\n if (!err.code) err.code = err.name;\n if (!err.error) err.error = clone(sourceErr); // 兼容老的错误格式\n\n return err;\n}\n\nvar isNode = function () {\n return typeof window !== 'object' && typeof process === 'object' && typeof require === 'function';\n}\n\nvar isCIHost = function(url) {\n return /^https?:\\/\\/([^/]+\\.)?ci\\.[^/]+/.test(url);\n}\n\nvar util = {\n noop: noop,\n formatParams: formatParams,\n apiWrapper: apiWrapper,\n xml2json: xml2json,\n json2xml: json2xml,\n md5: md5,\n clearKey: clearKey,\n fileSlice: fileSlice,\n getBodyMd5: getBodyMd5,\n getFileMd5: getFileMd5,\n binaryBase64: binaryBase64,\n extend: extend,\n isArray: isArray,\n isInArray: isInArray,\n makeArray: makeArray,\n each: each,\n map: map,\n filter: filter,\n clone: clone,\n attr: attr,\n uuid: uuid,\n camSafeUrlEncode: camSafeUrlEncode,\n throttleOnProgress: throttleOnProgress,\n getFileSize: getFileSize,\n getSkewTime: getSkewTime,\n error: error,\n obj2str: obj2str,\n getAuth: getAuth,\n parseSelectPayload: parseSelectPayload,\n getSourceParams: getSourceParams,\n isBrowser: true,\n isNode: isNode,\n isCIHost: isCIHost,\n};\n\nmodule.exports = util;\n","var initEvent = function (cos) {\n var listeners = {};\n var getList = function (action) {\n !listeners[action] && (listeners[action] = []);\n return listeners[action];\n };\n cos.on = function (action, callback) {\n if (action === 'task-list-update') {\n console.warn('warning: Event \"' + action + '\" has been deprecated. Please use \"list-update\" instead.');\n }\n getList(action).push(callback);\n };\n cos.off = function (action, callback) {\n var list = getList(action);\n for (var i = list.length - 1; i >= 0; i--) {\n callback === list[i] && list.splice(i, 1);\n }\n };\n cos.emit = function (action, data) {\n var list = getList(action).map(function (cb) {\n return cb;\n });\n for (var i = 0; i < list.length; i++) {\n list[i](data);\n }\n };\n};\n\nvar EventProxy = function () {\n initEvent(this);\n};\n\nmodule.exports.init = initEvent;\nmodule.exports.EventProxy = EventProxy;","var util = require('./util');\n\n// 按照文件特征值,缓存 UploadId\nvar cacheKey = 'cos_sdk_upload_cache';\nvar expires = 30 * 24 * 3600;\nvar cache;\nvar timer;\n\nvar getCache = function () {\n try {\n var val = JSON.parse(localStorage.getItem(cacheKey));\n } catch (e) {\n }\n if (!val) val = [];\n cache = val;\n};\nvar setCache = function () {\n try {\n localStorage.setItem(cacheKey, JSON.stringify(cache))\n } catch (e) {\n }\n};\n\nvar init = function () {\n if (cache) return;\n getCache.call(this);\n // 清理太老旧的数据\n var changed = false;\n var now = Math.round(Date.now() / 1000);\n for (var i = cache.length - 1; i >= 0; i--) {\n var mtime = cache[i][2];\n if (!mtime || mtime + expires < now) {\n cache.splice(i, 1);\n changed = true;\n }\n }\n changed && setCache();\n};\n\n// 把缓存存到本地\nvar save = function () {\n if (timer) return;\n timer = setTimeout(function () {\n setCache();\n timer = null;\n }, 400);\n};\n\nvar mod = {\n using: {},\n // 标记 UploadId 正在使用\n setUsing: function (uuid) {\n mod.using[uuid] = true;\n },\n // 标记 UploadId 已经没在使用\n removeUsing: function (uuid) {\n delete mod.using[uuid];\n },\n // 用上传参数生成哈希值\n getFileId: function (file, ChunkSize, Bucket, Key) {\n if (file.name && file.size && file.lastModifiedDate && ChunkSize) {\n return util.md5([file.name, file.size, file.lastModifiedDate, ChunkSize, Bucket, Key].join('::'));\n } else {\n return null;\n }\n },\n // 获取文件对应的 UploadId 列表\n getUploadIdList: function (uuid) {\n if (!uuid) return null;\n init.call(this);\n var list = [];\n for (var i = 0; i < cache.length; i++) {\n if (cache[i][0] === uuid)\n list.push(cache[i][1]);\n }\n return list.length ? list : null;\n },\n // 缓存 UploadId\n saveUploadId: function (uuid, UploadId, limit) {\n init.call(this);\n if (!uuid) return;\n // 清理没用的 UploadId,js 文件没有 FilePath ,只清理相同记录\n for (var i = cache.length - 1; i >= 0; i--) {\n var item = cache[i];\n if (item[0] === uuid && item[1] === UploadId) {\n cache.splice(i, 1);\n }\n }\n cache.unshift([uuid, UploadId, Math.round(Date.now() / 1000)]);\n if (cache.length > limit) cache.splice(limit);\n save();\n },\n // UploadId 已用完,移除掉\n removeUploadId: function (UploadId) {\n init.call(this);\n delete mod.using[UploadId];\n for (var i = cache.length - 1; i >= 0; i--) {\n if (cache[i][1] === UploadId) cache.splice(i, 1)\n }\n save();\n },\n};\n\nmodule.exports = mod;\n","/* Copyright 2015 William Summers, MetaTribal LLC\n * adapted from https://developer.mozilla.org/en-US/docs/JXON\n *\n * Licensed under the MIT License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * https://opensource.org/licenses/MIT\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n/**\n * @author William Summers\n * https://github.com/metatribal/xmlToJSON\n */\nvar DOMParser = require('xmldom').DOMParser;\n\nvar xmlToJSON = (function () {\n\n this.version = \"1.3.5\";\n\n var options = { // set up the default options\n mergeCDATA: true, // extract cdata and merge with text\n normalize: true, // collapse multiple spaces to single space\n stripElemPrefix: true, // for elements of same name in diff namespaces, you can enable namespaces and access the nskey property\n };\n\n var prefixMatch = new RegExp(/(?!xmlns)^.*:/);\n var trimMatch = new RegExp(/^\\s+|\\s+$/g);\n\n this.grokType = function (sValue) {\n if (/^\\s*$/.test(sValue)) {\n return null;\n }\n if (/^(?:true|false)$/i.test(sValue)) {\n return sValue.toLowerCase() === \"true\";\n }\n if (isFinite(sValue)) {\n return parseFloat(sValue);\n }\n return sValue;\n };\n\n this.parseString = function (xmlString, opt) {\n if (xmlString) {\n var xml = this.stringToXML(xmlString);\n if (xml.getElementsByTagName('parsererror').length) {\n return null;\n } else {\n return this.parseXML(xml, opt);\n }\n } else {\n return null;\n }\n };\n\n this.parseXML = function (oXMLParent, opt) {\n\n // initialize options\n for (var key in opt) {\n options[key] = opt[key];\n }\n\n var vResult = {},\n nLength = 0,\n sCollectedTxt = \"\";\n\n // iterate over the children\n var childNum = oXMLParent.childNodes.length;\n if (childNum) {\n for (var oNode, sProp, vContent, nItem = 0; nItem < oXMLParent.childNodes.length; nItem++) {\n oNode = oXMLParent.childNodes.item(nItem);\n\n if (oNode.nodeType === 4) {\n if (options.mergeCDATA) {\n sCollectedTxt += oNode.nodeValue;\n }\n } /* nodeType is \"CDATASection\" (4) */\n else if (oNode.nodeType === 3) {\n sCollectedTxt += oNode.nodeValue;\n } /* nodeType is \"Text\" (3) */\n else if (oNode.nodeType === 1) { /* nodeType is \"Element\" (1) */\n\n if (nLength === 0) {\n vResult = {};\n }\n\n // using nodeName to support browser (IE) implementation with no 'localName' property\n if (options.stripElemPrefix) {\n sProp = oNode.nodeName.replace(prefixMatch, '');\n } else {\n sProp = oNode.nodeName;\n }\n\n vContent = xmlToJSON.parseXML(oNode);\n\n if (vResult.hasOwnProperty(sProp)) {\n if (vResult[sProp].constructor !== Array) {\n vResult[sProp] = [vResult[sProp]];\n }\n vResult[sProp].push(vContent);\n\n } else {\n vResult[sProp] = vContent;\n nLength++;\n }\n }\n }\n }\n\n if (!Object.keys(vResult).length) {\n // vResult = sCollectedTxt.replace(trimMatch, '') || ''; // by carsonxu 修复 getBucket返回的 Key 是 \" /\" 这种场景\n vResult = sCollectedTxt || '';\n }\n\n return vResult;\n };\n\n // Convert xmlDocument to a string\n // Returns null on failure\n this.xmlToString = function (xmlDoc) {\n try {\n var xmlString = xmlDoc.xml ? xmlDoc.xml : (new XMLSerializer()).serializeToString(xmlDoc);\n return xmlString;\n } catch (err) {\n return null;\n }\n };\n\n // Convert a string to XML Node Structure\n // Returns null on failure\n this.stringToXML = function (xmlString) {\n try {\n var xmlDoc = null;\n\n if (window.DOMParser) {\n\n var parser = new DOMParser();\n xmlDoc = parser.parseFromString(xmlString, \"text/xml\");\n\n return xmlDoc;\n } else {\n xmlDoc = new ActiveXObject(\"Microsoft.XMLDOM\");\n xmlDoc.async = false;\n xmlDoc.loadXML(xmlString);\n\n return xmlDoc;\n }\n } catch (e) {\n return null;\n }\n };\n\n return this;\n\n}).call({});\n\nvar xml2json = function (xmlString) {\n return xmlToJSON.parseString(xmlString);\n};\n\nmodule.exports = xml2json;\n","'use strict';\n\nvar util = require('./util');\nvar event = require('./event');\nvar task = require('./task');\nvar base = require('./base');\nvar advance = require('./advance');\n\nvar defaultOptions = {\n AppId: '', // AppId 已废弃,请拼接到 Bucket 后传入,例如:test-1250000000\n SecretId: '',\n SecretKey: '',\n SecurityToken: '', // 使用临时密钥需要注意自行刷新 Token\n ChunkRetryTimes: 2,\n FileParallelLimit: 3,\n ChunkParallelLimit: 3,\n ChunkSize: 1024 * 1024,\n SliceSize: 1024 * 1024,\n CopyChunkParallelLimit: 20,\n CopyChunkSize: 1024 * 1024 * 10,\n CopySliceSize: 1024 * 1024 * 10,\n MaxPartNumber: 10000,\n ProgressInterval: 1000,\n Domain: '',\n ServiceDomain: '',\n Protocol: '',\n CompatibilityMode: false,\n ForcePathStyle: false,\n UseRawKey: false,\n Timeout: 0, // 单位毫秒,0 代表不设置超时时间\n CorrectClockSkew: true,\n SystemClockOffset: 0, // 单位毫秒,ms\n UploadCheckContentMd5: false,\n UploadQueueSize: 10000,\n UploadAddMetaMd5: false,\n UploadIdCacheLimit: 50,\n UseAccelerate: false,\n};\n\n// 对外暴露的类\nvar COS = function (options) {\n this.options = util.extend(util.clone(defaultOptions), options || {});\n this.options.FileParallelLimit = Math.max(1, this.options.FileParallelLimit);\n this.options.ChunkParallelLimit = Math.max(1, this.options.ChunkParallelLimit);\n this.options.ChunkRetryTimes = Math.max(0, this.options.ChunkRetryTimes);\n this.options.ChunkSize = Math.max(1024 * 1024, this.options.ChunkSize);\n this.options.CopyChunkParallelLimit = Math.max(1, this.options.CopyChunkParallelLimit);\n this.options.CopyChunkSize = Math.max(1024 * 1024, this.options.CopyChunkSize);\n this.options.CopySliceSize = Math.max(0, this.options.CopySliceSize);\n this.options.MaxPartNumber = Math.max(1024, Math.min(10000, this.options.MaxPartNumber));\n this.options.Timeout = Math.max(0, this.options.Timeout);\n if (this.options.AppId) {\n console.warn('warning: AppId has been deprecated, Please put it at the end of parameter Bucket(E.g: \"test-1250000000\").');\n }\n if (this.options.SecretId && this.options.SecretId.indexOf(' ') > -1) {\n console.error('error: SecretId格式错误,请检查');\n console.error('error: SecretId format is incorrect. Please check');\n }\n if (this.options.SecretKey && this.options.SecretKey.indexOf(' ') > -1) {\n console.error('error: SecretKey格式错误,请检查');\n console.error('error: SecretKey format is incorrect. Please check');\n }\n if (util.isNode()) {\n console.warn('warning: cos-js-sdk-v5 不支持 nodejs 环境使用,请改用 cos-nodejs-sdk-v5,参考文档: https://cloud.tencent.com/document/product/436/8629');\n console.warn('warning: cos-js-sdk-v5 does not support nodejs environment. Please use cos-nodejs-sdk-v5 instead. See: https://cloud.tencent.com/document/product/436/8629');\n }\n event.init(this);\n task.init(this);\n};\n\nbase.init(COS, task);\nadvance.init(COS, task);\n\nCOS.util = {\n md5: util.md5,\n xml2json: util.xml2json,\n json2xml: util.json2xml,\n};\nCOS.getAuthorization = util.getAuth;\nCOS.version = '1.3.5';\n\nmodule.exports = COS;\n","var session = require('./session');\nvar Async = require('./async');\nvar EventProxy = require('./event').EventProxy;\nvar util = require('./util');\n\n// 文件分块上传全过程,暴露的分块上传接口\nfunction sliceUploadFile(params, callback) {\n var self = this;\n var ep = new EventProxy();\n var TaskId = params.TaskId;\n var Bucket = params.Bucket;\n var Region = params.Region;\n var Key = params.Key;\n var Body = params.Body;\n var ChunkSize = params.ChunkSize || params.SliceSize || self.options.ChunkSize;\n var AsyncLimit = params.AsyncLimit;\n var StorageClass = params.StorageClass;\n var ServerSideEncryption = params.ServerSideEncryption;\n var FileSize;\n\n var onProgress;\n var onHashProgress = params.onHashProgress;\n\n // 上传过程中出现错误,返回错误\n ep.on('error', function (err) {\n if (!self._isRunningTask(TaskId)) return;\n err.UploadId = params.UploadData.UploadId || '';\n return callback(err);\n });\n\n // 上传分块完成,开始 uploadSliceComplete 操作\n ep.on('upload_complete', function (UploadCompleteData) {\n var _UploadCompleteData = util.extend({\n UploadId: params.UploadData.UploadId || ''\n }, UploadCompleteData);\n callback(null, _UploadCompleteData);\n });\n\n // 上传分块完成,开始 uploadSliceComplete 操作\n ep.on('upload_slice_complete', function (UploadData) {\n var metaHeaders = {};\n util.each(params.Headers, function (val, k) {\n var shortKey = k.toLowerCase();\n if (shortKey.indexOf('x-cos-meta-') === 0 || shortKey === 'pic-operations') metaHeaders[k] = val;\n });\n uploadSliceComplete.call(self, {\n Bucket: Bucket,\n Region: Region,\n Key: Key,\n UploadId: UploadData.UploadId,\n SliceList: UploadData.SliceList,\n Headers: metaHeaders,\n }, function (err, data) {\n if (!self._isRunningTask(TaskId)) return;\n session.removeUsing(UploadData.UploadId);\n if (err) {\n onProgress(null, true);\n return ep.emit('error', err);\n }\n session.removeUploadId.call(self, UploadData.UploadId);\n onProgress({loaded: FileSize, total: FileSize}, true);\n ep.emit('upload_complete', data);\n });\n });\n\n // 获取 UploadId 完成,开始上传每个分片\n ep.on('get_upload_data_finish', function (UploadData) {\n\n // 处理 UploadId 缓存\n var uuid = session.getFileId(Body, params.ChunkSize, Bucket, Key);\n uuid && session.saveUploadId.call(self, uuid, UploadData.UploadId, self.options.UploadIdCacheLimit); // 缓存 UploadId\n session.setUsing(UploadData.UploadId); // 标记 UploadId 为正在使用\n\n // 获取 UploadId\n onProgress(null, true); // 任务状态开始 uploading\n uploadSliceList.call(self, {\n TaskId: TaskId,\n Bucket: Bucket,\n Region: Region,\n Key: Key,\n Body: Body,\n FileSize: FileSize,\n SliceSize: ChunkSize,\n AsyncLimit: AsyncLimit,\n ServerSideEncryption: ServerSideEncryption,\n UploadData: UploadData,\n Headers: params.Headers,\n onProgress: onProgress\n }, function (err, data) {\n if (!self._isRunningTask(TaskId)) return;\n if (err) {\n onProgress(null, true);\n return ep.emit('error', err);\n }\n ep.emit('upload_slice_complete', data);\n });\n });\n\n // 开始获取文件 UploadId,里面会视情况计算 ETag,并比对,保证文件一致性,也优化上传\n ep.on('get_file_size_finish', function () {\n\n onProgress = util.throttleOnProgress.call(self, FileSize, params.onProgress);\n\n if (params.UploadData.UploadId) {\n ep.emit('get_upload_data_finish', params.UploadData);\n } else {\n var _params = util.extend({\n TaskId: TaskId,\n Bucket: Bucket,\n Region: Region,\n Key: Key,\n Headers: params.Headers,\n StorageClass: StorageClass,\n Body: Body,\n FileSize: FileSize,\n SliceSize: ChunkSize,\n onHashProgress: onHashProgress,\n }, params);\n getUploadIdAndPartList.call(self, _params, function (err, UploadData) {\n if (!self._isRunningTask(TaskId)) return;\n if (err) return ep.emit('error', err);\n params.UploadData.UploadId = UploadData.UploadId;\n params.UploadData.PartList = UploadData.PartList;\n ep.emit('get_upload_data_finish', params.UploadData);\n });\n }\n });\n\n // 获取上传文件大小\n FileSize = params.ContentLength;\n delete params.ContentLength;\n !params.Headers && (params.Headers = {});\n util.each(params.Headers, function (item, key) {\n if (key.toLowerCase() === 'content-length') {\n delete params.Headers[key];\n }\n });\n\n // 控制分片大小\n (function () {\n var SIZE = [1, 2, 4, 8, 16, 32, 64, 128, 256, 512, 1024, 1024 * 2, 1024 * 4, 1024 * 5];\n var AutoChunkSize = 1024 * 1024;\n for (var i = 0; i < SIZE.length; i++) {\n AutoChunkSize = SIZE[i] * 1024 * 1024;\n if (FileSize / AutoChunkSize <= self.options.MaxPartNumber) break;\n }\n params.ChunkSize = params.SliceSize = ChunkSize = Math.max(ChunkSize, AutoChunkSize);\n })();\n\n // 开始上传\n if (FileSize === 0) {\n params.Body = '';\n params.ContentLength = 0;\n params.SkipTask = true;\n self.putObject(params, callback);\n } else {\n ep.emit('get_file_size_finish');\n }\n\n}\n\n// 获取上传任务的 UploadId\nfunction getUploadIdAndPartList(params, callback) {\n var TaskId = params.TaskId;\n var Bucket = params.Bucket;\n var Region = params.Region;\n var Key = params.Key;\n var StorageClass = params.StorageClass;\n var self = this;\n\n // 计算 ETag\n var ETagMap = {};\n var FileSize = params.FileSize;\n var SliceSize = params.SliceSize;\n var SliceCount = Math.ceil(FileSize / SliceSize);\n var FinishSliceCount = 0;\n var FinishSize = 0;\n var onHashProgress = util.throttleOnProgress.call(self, FileSize, params.onHashProgress);\n var getChunkETag = function (PartNumber, callback) {\n var start = SliceSize * (PartNumber - 1);\n var end = Math.min(start + SliceSize, FileSize);\n var ChunkSize = end - start;\n\n if (ETagMap[PartNumber]) {\n callback(null, {\n PartNumber: PartNumber,\n ETag: ETagMap[PartNumber],\n Size: ChunkSize\n });\n } else {\n util.fileSlice(params.Body, start, end, false, function (chunkItem) {\n util.getFileMd5(chunkItem, function (err, md5) {\n if (err) return callback(util.error(err));\n var ETag = '\"' + md5 + '\"';\n ETagMap[PartNumber] = ETag;\n FinishSliceCount += 1;\n FinishSize += ChunkSize;\n onHashProgress({loaded: FinishSize, total: FileSize});\n callback(null, {\n PartNumber: PartNumber,\n ETag: ETag,\n Size: ChunkSize\n });\n });\n });\n }\n };\n\n // 通过和文件的 md5 对比,判断 UploadId 是否可用\n var isAvailableUploadList = function (PartList, callback) {\n var PartCount = PartList.length;\n // 如果没有分片,通过\n if (PartCount === 0) {\n return callback(null, true);\n }\n // 检查分片数量\n if (PartCount > SliceCount) {\n return callback(null, false);\n }\n // 检查分片大小\n if (PartCount > 1) {\n var PartSliceSize = Math.max(PartList[0].Size, PartList[1].Size);\n if (PartSliceSize !== SliceSize) {\n return callback(null, false);\n }\n }\n // 逐个分片计算并检查 ETag 是否一致\n var next = function (index) {\n if (index < PartCount) {\n var Part = PartList[index];\n getChunkETag(Part.PartNumber, function (err, chunk) {\n if (chunk && chunk.ETag === Part.ETag && chunk.Size === Part.Size) {\n next(index + 1);\n } else {\n callback(null, false);\n }\n });\n } else {\n callback(null, true);\n }\n };\n next(0);\n };\n\n var ep = new EventProxy();\n ep.on('error', function (errData) {\n if (!self._isRunningTask(TaskId)) return;\n return callback(errData);\n });\n\n // 存在 UploadId\n ep.on('upload_id_available', function (UploadData) {\n // 转换成 map\n var map = {};\n var list = [];\n util.each(UploadData.PartList, function (item) {\n map[item.PartNumber] = item;\n });\n for (var PartNumber = 1; PartNumber <= SliceCount; PartNumber++) {\n var item = map[PartNumber];\n if (item) {\n item.PartNumber = PartNumber;\n item.Uploaded = true;\n } else {\n item = {\n PartNumber: PartNumber,\n ETag: null,\n Uploaded: false\n };\n }\n list.push(item);\n }\n UploadData.PartList = list;\n callback(null, UploadData);\n });\n\n // 不存在 UploadId, 初始化生成 UploadId\n ep.on('no_available_upload_id', function () {\n if (!self._isRunningTask(TaskId)) return;\n var _params = util.extend({\n Bucket: Bucket,\n Region: Region,\n Key: Key,\n Query: util.clone(params.Query),\n StorageClass: StorageClass,\n Body: params.Body,\n }, params);\n var headers = util.clone(params.Headers)\n delete headers['x-cos-mime-limit'];\n _params.Headers = headers;\n self.multipartInit(_params, function (err, data) {\n if (!self._isRunningTask(TaskId)) return;\n if (err) return ep.emit('error', err);\n var UploadId = data.UploadId;\n if (!UploadId) {\n return callback(util.error(new Error('no such upload id')));\n }\n ep.emit('upload_id_available', {UploadId: UploadId, PartList: []});\n });\n });\n\n // 如果已存在 UploadId,找一个可以用的 UploadId\n ep.on('has_and_check_upload_id', function (UploadIdList) {\n // 串行地,找一个内容一致的 UploadId\n UploadIdList = UploadIdList.reverse();\n Async.eachLimit(UploadIdList, 1, function (UploadId, asyncCallback) {\n if (!self._isRunningTask(TaskId)) return;\n // 如果正在上传,跳过\n if (session.using[UploadId]) {\n asyncCallback(); // 检查下一个 UploadId\n return;\n }\n // 判断 UploadId 是否可用\n wholeMultipartListPart.call(self, {\n Bucket: Bucket,\n Region: Region,\n Key: Key,\n UploadId: UploadId,\n }, function (err, PartListData) {\n if (!self._isRunningTask(TaskId)) return;\n if (err) {\n session.removeUsing(UploadId);\n return ep.emit('error', err);\n }\n var PartList = PartListData.PartList;\n PartList.forEach(function (item) {\n item.PartNumber *= 1;\n item.Size *= 1;\n item.ETag = item.ETag || '';\n });\n isAvailableUploadList(PartList, function (err, isAvailable) {\n if (!self._isRunningTask(TaskId)) return;\n if (err) return ep.emit('error', err);\n if (isAvailable) {\n asyncCallback({\n UploadId: UploadId,\n PartList: PartList\n }); // 马上结束\n } else {\n asyncCallback(); // 检查下一个 UploadId\n }\n });\n });\n }, function (AvailableUploadData) {\n if (!self._isRunningTask(TaskId)) return;\n onHashProgress(null, true);\n if (AvailableUploadData && AvailableUploadData.UploadId) {\n ep.emit('upload_id_available', AvailableUploadData);\n } else {\n ep.emit('no_available_upload_id');\n }\n });\n });\n\n // 在本地缓存找可用的 UploadId\n ep.on('seek_local_avail_upload_id', function (RemoteUploadIdList) {\n // 在本地找可用的 UploadId\n var uuid = session.getFileId(params.Body, params.ChunkSize, Bucket, Key);\n var LocalUploadIdList = session.getUploadIdList.call(self, uuid);\n if (!uuid || !LocalUploadIdList) {\n ep.emit('has_and_check_upload_id', RemoteUploadIdList);\n return;\n }\n var next = function (index) {\n // 如果本地找不到可用 UploadId,再一个个遍历校验远端\n if (index >= LocalUploadIdList.length) {\n ep.emit('has_and_check_upload_id', RemoteUploadIdList);\n return;\n }\n var UploadId = LocalUploadIdList[index];\n // 如果不在远端 UploadId 列表里,跳过并删除\n if (!util.isInArray(RemoteUploadIdList, UploadId)) {\n session.removeUploadId.call(self, UploadId);\n next(index + 1);\n return;\n }\n // 如果正在上传,跳过\n if (session.using[UploadId]) {\n next(index + 1);\n return;\n }\n // 判断 UploadId 是否存在线上\n wholeMultipartListPart.call(self, {\n Bucket: Bucket,\n Region: Region,\n Key: Key,\n UploadId: UploadId,\n }, function (err, PartListData) {\n if (!self._isRunningTask(TaskId)) return;\n if (err) {\n // 如果 UploadId 获取会出错,跳过并删除\n session.removeUploadId.call(self, UploadId);\n next(index + 1);\n } else {\n // 找到可用 UploadId\n ep.emit('upload_id_available', {\n UploadId: UploadId,\n PartList: PartListData.PartList,\n });\n }\n });\n };\n next(0);\n });\n\n // 获取线上 UploadId 列表\n ep.on('get_remote_upload_id_list', function () {\n // 获取符合条件的 UploadId 列表,因为同一个文件可以有多个上传任务。\n wholeMultipartList.call(self, {\n Bucket: Bucket,\n Region: Region,\n Key: Key,\n }, function (err, data) {\n if (!self._isRunningTask(TaskId)) return;\n if (err) return ep.emit('error', err);\n // 整理远端 UploadId 列表\n var RemoteUploadIdList = util.filter(data.UploadList, function (item) {\n return item.Key === Key && (!StorageClass || item.StorageClass.toUpperCase() === StorageClass.toUpperCase());\n }).reverse().map(function (item) {\n return item.UploadId || item.UploadID;\n });\n if (RemoteUploadIdList.length) {\n ep.emit('seek_local_avail_upload_id', RemoteUploadIdList);\n } else {\n // 远端没有 UploadId,清理缓存的 UploadId\n var uuid = session.getFileId(params.Body, params.ChunkSize, Bucket, Key), LocalUploadIdList;\n if (uuid && (LocalUploadIdList = session.getUploadIdList.call(self, uuid))) {\n util.each(LocalUploadIdList, function (UploadId) {\n session.removeUploadId.call(self, UploadId);\n });\n }\n ep.emit('no_available_upload_id');\n }\n });\n });\n\n // 开始找可用 UploadId\n ep.emit('get_remote_upload_id_list');\n\n}\n\n// 获取符合条件的全部上传任务 (条件包括 Bucket, Region, Prefix)\nfunction wholeMultipartList(params, callback) {\n var self = this;\n var UploadList = [];\n var sendParams = {\n Bucket: params.Bucket,\n Region: params.Region,\n Prefix: params.Key\n };\n var next = function () {\n self.multipartList(sendParams, function (err, data) {\n if (err) return callback(err);\n UploadList.push.apply(UploadList, data.Upload || []);\n if (data.IsTruncated === 'true') { // 列表不完整\n sendParams.KeyMarker = data.NextKeyMarker;\n sendParams.UploadIdMarker = data.NextUploadIdMarker;\n next();\n } else {\n callback(null, {UploadList: UploadList});\n }\n });\n };\n next();\n}\n\n// 获取指定上传任务的分块列表\nfunction wholeMultipartListPart(params, callback) {\n var self = this;\n var PartList = [];\n var sendParams = {\n Bucket: params.Bucket,\n Region: params.Region,\n Key: params.Key,\n UploadId: params.UploadId\n };\n var next = function () {\n self.multipartListPart(sendParams, function (err, data) {\n if (err) return callback(err);\n PartList.push.apply(PartList, data.Part || []);\n if (data.IsTruncated === 'true') { // 列表不完整\n sendParams.PartNumberMarker = data.NextPartNumberMarker;\n next();\n } else {\n callback(null, {PartList: PartList});\n }\n });\n };\n next();\n}\n\n// 上传文件分块,包括\n/*\n UploadId (上传任务编号)\n AsyncLimit (并发量),\n SliceList (上传的分块数组),\n FilePath (本地文件的位置),\n SliceSize (文件分块大小)\n FileSize (文件大小)\n onProgress (上传成功之后的回调函数)\n */\nfunction uploadSliceList(params, cb) {\n var self = this;\n var TaskId = params.TaskId;\n var Bucket = params.Bucket;\n var Region = params.Region;\n var Key = params.Key;\n var UploadData = params.UploadData;\n var FileSize = params.FileSize;\n var SliceSize = params.SliceSize;\n var ChunkParallel = Math.min(params.AsyncLimit || self.options.ChunkParallelLimit || 1, 256);\n var Body = params.Body;\n var SliceCount = Math.ceil(FileSize / SliceSize);\n var FinishSize = 0;\n var ServerSideEncryption = params.ServerSideEncryption;\n var Headers = params.Headers;\n var needUploadSlices = util.filter(UploadData.PartList, function (SliceItem) {\n if (SliceItem['Uploaded']) {\n FinishSize += SliceItem['PartNumber'] >= SliceCount ? (FileSize % SliceSize || SliceSize) : SliceSize;\n }\n return !SliceItem['Uploaded'];\n });\n var onProgress = params.onProgress;\n\n Async.eachLimit(needUploadSlices, ChunkParallel, function (SliceItem, asyncCallback) {\n if (!self._isRunningTask(TaskId)) return;\n var PartNumber = SliceItem['PartNumber'];\n var currentSize = Math.min(FileSize, SliceItem['PartNumber'] * SliceSize) - (SliceItem['PartNumber'] - 1) * SliceSize;\n var preAddSize = 0;\n uploadSliceItem.call(self, {\n TaskId: TaskId,\n Bucket: Bucket,\n Region: Region,\n Key: Key,\n SliceSize: SliceSize,\n FileSize: FileSize,\n PartNumber: PartNumber,\n ServerSideEncryption: ServerSideEncryption,\n Body: Body,\n UploadData: UploadData,\n Headers: Headers,\n onProgress: function (data) {\n FinishSize += data.loaded - preAddSize;\n preAddSize = data.loaded;\n onProgress({loaded: FinishSize, total: FileSize});\n },\n }, function (err, data) {\n if (!self._isRunningTask(TaskId)) return;\n if (!err && !data.ETag) err = 'get ETag error, please add \"ETag\" to CORS ExposeHeader setting.( 获取ETag失败,请在CORS ExposeHeader设置中添加ETag,请参考文档:https://cloud.tencent.com/document/product/436/13318 )';\n if (err) {\n FinishSize -= preAddSize;\n } else {\n FinishSize += currentSize - preAddSize;\n SliceItem.ETag = data.ETag;\n }\n onProgress({loaded: FinishSize, total: FileSize});\n asyncCallback(err || null, data);\n });\n }, function (err) {\n if (!self._isRunningTask(TaskId)) return;\n if (err) return cb(err);\n cb(null, {\n UploadId: UploadData.UploadId,\n SliceList: UploadData.PartList\n });\n });\n}\n\n// 上传指定分片\nfunction uploadSliceItem(params, callback) {\n var self = this;\n var TaskId = params.TaskId;\n var Bucket = params.Bucket;\n var Region = params.Region;\n var Key = params.Key;\n var FileSize = params.FileSize;\n var FileBody = params.Body;\n var PartNumber = params.PartNumber * 1;\n var SliceSize = params.SliceSize;\n var ServerSideEncryption = params.ServerSideEncryption;\n var UploadData = params.UploadData;\n var Headers = params.Headers || {};\n var ChunkRetryTimes = self.options.ChunkRetryTimes + 1;\n\n var start = SliceSize * (PartNumber - 1);\n\n var ContentLength = SliceSize;\n\n var end = start + SliceSize;\n\n if (end > FileSize) {\n end = FileSize;\n ContentLength = end - start;\n }\n\n var headersWhiteList = ['x-cos-traffic-limit', 'x-cos-mime-limit'];\n var headers = {};\n util.each(Headers, function(v, k) {\n if (headersWhiteList.indexOf(k) > -1) {\n headers[k] = v;\n }\n });\n\n var PartItem = UploadData.PartList[PartNumber - 1];\n Async.retry(ChunkRetryTimes, function (tryCallback) {\n if (!self._isRunningTask(TaskId)) return;\n util.fileSlice(FileBody, start, end, true, function (Body) {\n self.multipartUpload({\n TaskId: TaskId,\n Bucket: Bucket,\n Region: Region,\n Key: Key,\n ContentLength: ContentLength,\n PartNumber: PartNumber,\n UploadId: UploadData.UploadId,\n ServerSideEncryption: ServerSideEncryption,\n Body: Body,\n Headers: headers,\n onProgress: params.onProgress,\n }, function (err, data) {\n if (!self._isRunningTask(TaskId)) return;\n if (err) return tryCallback(err);\n PartItem.Uploaded = true;\n return tryCallback(null, data);\n });\n });\n }, function (err, data) {\n if (!self._isRunningTask(TaskId)) return;\n return callback(err, data);\n });\n}\n\n\n// 完成分块上传\nfunction uploadSliceComplete(params, callback) {\n var Bucket = params.Bucket;\n var Region = params.Region;\n var Key = params.Key;\n var UploadId = params.UploadId;\n var SliceList = params.SliceList;\n var self = this;\n var ChunkRetryTimes = this.options.ChunkRetryTimes + 1;\n var Headers = params.Headers;\n var Parts = SliceList.map(function (item) {\n return {\n PartNumber: item.PartNumber,\n ETag: item.ETag\n };\n });\n // 完成上传的请求也做重试\n Async.retry(ChunkRetryTimes, function (tryCallback) {\n self.multipartComplete({\n Bucket: Bucket,\n Region: Region,\n Key: Key,\n UploadId: UploadId,\n Parts: Parts,\n Headers: Headers,\n }, tryCallback);\n }, function (err, data) {\n callback(err, data);\n });\n}\n\n// 抛弃分块上传任务\n/*\n AsyncLimit (抛弃上传任务的并发量),\n UploadId (上传任务的编号,当 Level 为 task 时候需要)\n Level (抛弃分块上传任务的级别,task : 抛弃指定的上传任务,file : 抛弃指定的文件对应的上传任务,其他值 :抛弃指定Bucket 的全部上传任务)\n */\nfunction abortUploadTask(params, callback) {\n var Bucket = params.Bucket;\n var Region = params.Region;\n var Key = params.Key;\n var UploadId = params.UploadId;\n var Level = params.Level || 'task';\n var AsyncLimit = params.AsyncLimit;\n var self = this;\n\n var ep = new EventProxy();\n\n ep.on('error', function (errData) {\n return callback(errData);\n });\n\n // 已经获取到需要抛弃的任务列表\n ep.on('get_abort_array', function (AbortArray) {\n abortUploadTaskArray.call(self, {\n Bucket: Bucket,\n Region: Region,\n Key: Key,\n Headers: params.Headers,\n AsyncLimit: AsyncLimit,\n AbortArray: AbortArray\n }, callback);\n });\n\n if (Level === 'bucket') {\n // Bucket 级别的任务抛弃,抛弃该 Bucket 下的全部上传任务\n wholeMultipartList.call(self, {\n Bucket: Bucket,\n Region: Region\n }, function (err, data) {\n if (err) return callback(err);\n ep.emit('get_abort_array', data.UploadList || []);\n });\n } else if (Level === 'file') {\n // 文件级别的任务抛弃,抛弃该文件的全部上传任务\n if (!Key) return callback(util.error(new Error('abort_upload_task_no_key')));\n wholeMultipartList.call(self, {\n Bucket: Bucket,\n Region: Region,\n Key: Key\n }, function (err, data) {\n if (err) return callback(err);\n ep.emit('get_abort_array', data.UploadList || []);\n });\n } else if (Level === 'task') {\n // 单个任务级别的任务抛弃,抛弃指定 UploadId 的上传任务\n if (!UploadId) return callback(util.error(new Error('abort_upload_task_no_id')));\n if (!Key) return callback(util.error(new Error('abort_upload_task_no_key')));\n ep.emit('get_abort_array', [{\n Key: Key,\n UploadId: UploadId\n }]);\n } else {\n return callback(util.error(new Error('abort_unknown_level')));\n }\n}\n\n// 批量抛弃分块上传任务\nfunction abortUploadTaskArray(params, callback) {\n\n var Bucket = params.Bucket;\n var Region = params.Region;\n var Key = params.Key;\n var AbortArray = params.AbortArray;\n var AsyncLimit = params.AsyncLimit || 1;\n var self = this;\n\n var index = 0;\n var resultList = new Array(AbortArray.length);\n Async.eachLimit(AbortArray, AsyncLimit, function (AbortItem, nextItem) {\n var eachIndex = index;\n if (Key && Key !== AbortItem.Key) {\n resultList[eachIndex] = {error: {KeyNotMatch: true}};\n nextItem(null);\n return;\n }\n var UploadId = AbortItem.UploadId || AbortItem.UploadID;\n\n self.multipartAbort({\n Bucket: Bucket,\n Region: Region,\n Key: AbortItem.Key,\n Headers: params.Headers,\n UploadId: UploadId\n }, function (err) {\n var task = {\n Bucket: Bucket,\n Region: Region,\n Key: AbortItem.Key,\n UploadId: UploadId\n };\n resultList[eachIndex] = {error: err, task: task};\n nextItem(null);\n });\n index++;\n\n }, function (err) {\n if (err) return callback(err);\n\n var successList = [];\n var errorList = [];\n\n for (var i = 0, len = resultList.length; i < len; i++) {\n var item = resultList[i];\n if (item['task']) {\n if (item['error']) {\n errorList.push(item['task']);\n } else {\n successList.push(item['task']);\n }\n }\n }\n\n return callback(null, {\n successList: successList,\n errorList: errorList\n });\n });\n}\n\n// 高级上传\nfunction uploadFile(params, callback) {\n var self = this;\n\n // 判断多大的文件使用分片上传\n var SliceSize = params.SliceSize === undefined ? self.options.SliceSize : params.SliceSize;\n\n var taskList = [];\n\n var Body = params.Body;\n var FileSize = Body.size || Body.length || 0;\n var fileInfo = {TaskId: ''};\n\n // 整理 option,用于返回给回调\n util.each(params, function (v, k) {\n if (typeof v !== 'object' && typeof v !== 'function') {\n fileInfo[k] = v;\n }\n });\n\n // 处理文件 TaskReady\n var _onTaskReady = params.onTaskReady;\n var onTaskReady = function (tid) {\n fileInfo.TaskId = tid;\n _onTaskReady && _onTaskReady(tid);\n };\n params.onTaskReady = onTaskReady;\n\n // 处理文件完成\n var _onFileFinish = params.onFileFinish;\n var onFileFinish = function (err, data) {\n _onFileFinish && _onFileFinish(err, data, fileInfo);\n callback && callback(err, data);\n };\n\n // 添加上传任务,超过阈值使用分块上传,小于等于则简单上传\n var api = FileSize > SliceSize ? 'sliceUploadFile' : 'putObject';\n taskList.push({\n api: api,\n params: params,\n callback: onFileFinish,\n });\n\n self._addTasks(taskList);\n}\n\n// 批量上传文件\nfunction uploadFiles(params, callback) {\n var self = this;\n\n // 判断多大的文件使用分片上传\n var SliceSize = params.SliceSize === undefined ? self.options.SliceSize : params.SliceSize;\n\n // 汇总返回进度\n var TotalSize = 0;\n var TotalFinish = 0;\n var onTotalProgress = util.throttleOnProgress.call(self, TotalFinish, params.onProgress);\n\n // 汇总返回回调\n var unFinishCount = params.files.length;\n var _onTotalFileFinish = params.onFileFinish;\n var resultList = Array(unFinishCount);\n var onTotalFileFinish = function (err, data, options) {\n onTotalProgress(null, true);\n _onTotalFileFinish && _onTotalFileFinish(err, data, options);\n resultList[options.Index] = {\n options: options,\n error: err,\n data: data\n };\n if (--unFinishCount <= 0 && callback) {\n callback(null, {files: resultList});\n }\n };\n\n // 开始处理每个文件\n var taskList = [];\n util.each(params.files, function (fileParams, index) {\n (function () { // 对齐 nodejs 缩进\n\n var Body = fileParams.Body;\n var FileSize = Body.size || Body.length || 0;\n var fileInfo = {Index: index, TaskId: ''};\n\n // 更新文件总大小\n TotalSize += FileSize;\n\n // 整理 option,用于返回给回调\n util.each(fileParams, function (v, k) {\n if (typeof v !== 'object' && typeof v !== 'function') {\n fileInfo[k] = v;\n }\n });\n\n // 处理单个文件 TaskReady\n var _onTaskReady = fileParams.onTaskReady;\n var onTaskReady = function (tid) {\n fileInfo.TaskId = tid;\n _onTaskReady && _onTaskReady(tid);\n };\n fileParams.onTaskReady = onTaskReady;\n\n // 处理单个文件进度\n var PreAddSize = 0;\n var _onProgress = fileParams.onProgress;\n var onProgress = function (info) {\n TotalFinish = TotalFinish - PreAddSize + info.loaded;\n PreAddSize = info.loaded;\n _onProgress && _onProgress(info);\n onTotalProgress({loaded: TotalFinish, total: TotalSize});\n };\n fileParams.onProgress = onProgress;\n\n // 处理单个文件完成\n var _onFileFinish = fileParams.onFileFinish;\n var onFileFinish = function (err, data) {\n _onFileFinish && _onFileFinish(err, data);\n onTotalFileFinish && onTotalFileFinish(err, data, fileInfo);\n };\n\n // 添加上传任务\n var api = FileSize > SliceSize ? 'sliceUploadFile' : 'putObject';\n taskList.push({\n api: api,\n params: fileParams,\n callback: onFileFinish,\n });\n })();\n });\n self._addTasks(taskList);\n}\n\n// 分片复制文件\nfunction sliceCopyFile(params, callback) {\n var ep = new EventProxy();\n\n var self = this;\n var Bucket = params.Bucket;\n var Region = params.Region;\n var Key = params.Key;\n var CopySource = params.CopySource;\n var m = util.getSourceParams.call(this, CopySource);\n if (!m) {\n callback(util.error(new Error('CopySource format error')));\n return;\n }\n\n var SourceBucket = m.Bucket;\n var SourceRegion = m.Region;\n var SourceKey = decodeURIComponent(m.Key);\n var CopySliceSize = params.CopySliceSize === undefined ? self.options.CopySliceSize : params.CopySliceSize;\n CopySliceSize = Math.max(0, CopySliceSize);\n\n var ChunkSize = params.CopyChunkSize || this.options.CopyChunkSize;\n var ChunkParallel = this.options.CopyChunkParallelLimit;\n\n var FinishSize = 0;\n var FileSize;\n var onProgress;\n\n // 分片复制完成,开始 multipartComplete 操作\n ep.on('copy_slice_complete', function (UploadData) {\n var metaHeaders = {};\n util.each(params.Headers, function (val, k) {\n if (k.toLowerCase().indexOf('x-cos-meta-') === 0) metaHeaders[k] = val;\n });\n var Parts = util.map(UploadData.PartList, function (item) {\n return {\n PartNumber: item.PartNumber,\n ETag: item.ETag,\n };\n });\n self.multipartComplete({\n Bucket: Bucket,\n Region: Region,\n Key: Key,\n UploadId: UploadData.UploadId,\n Parts: Parts,\n },function (err, data) {\n if (err) {\n onProgress(null, true);\n return callback(err);\n }\n onProgress({loaded: FileSize, total: FileSize}, true);\n callback(null, data);\n });\n });\n\n ep.on('get_copy_data_finish',function (UploadData) {\n Async.eachLimit(UploadData.PartList, ChunkParallel, function (SliceItem, asyncCallback) {\n var PartNumber = SliceItem.PartNumber;\n var CopySourceRange = SliceItem.CopySourceRange;\n var currentSize = SliceItem.end - SliceItem.start;\n\n copySliceItem.call(self, {\n Bucket: Bucket,\n Region: Region,\n Key: Key,\n CopySource: CopySource,\n UploadId: UploadData.UploadId,\n PartNumber: PartNumber,\n CopySourceRange: CopySourceRange,\n },function (err,data) {\n if (err) return asyncCallback(err);\n FinishSize += currentSize;\n onProgress({loaded: FinishSize, total: FileSize});\n SliceItem.ETag = data.ETag;\n asyncCallback(err || null, data);\n });\n }, function (err) {\n if (err) {\n onProgress(null, true);\n return callback(err);\n }\n\n ep.emit('copy_slice_complete', UploadData);\n });\n });\n\n ep.on('get_file_size_finish', function (SourceHeaders) {\n // 控制分片大小\n (function () {\n var SIZE = [1, 2, 4, 8, 16, 32, 64, 128, 256, 512, 1024, 1024 * 2, 1024 * 4, 1024 * 5];\n var AutoChunkSize = 1024 * 1024;\n for (var i = 0; i < SIZE.length; i++) {\n AutoChunkSize = SIZE[i] * 1024 * 1024;\n if (FileSize / AutoChunkSize <= self.options.MaxPartNumber) break;\n }\n params.ChunkSize = ChunkSize = Math.max(ChunkSize, AutoChunkSize);\n\n var ChunkCount = Math.ceil(FileSize / ChunkSize);\n\n var list = [];\n for (var partNumber = 1; partNumber <= ChunkCount; partNumber++) {\n var start = (partNumber - 1) * ChunkSize;\n var end = partNumber * ChunkSize < FileSize ? (partNumber * ChunkSize - 1) : FileSize - 1;\n var item = {\n PartNumber: partNumber,\n start: start,\n end: end,\n CopySourceRange: \"bytes=\" + start + \"-\" + end,\n };\n list.push(item);\n }\n params.PartList = list;\n })();\n\n var TargetHeader;\n if (params.Headers['x-cos-metadata-directive'] === 'Replaced') {\n TargetHeader = params.Headers;\n } else {\n TargetHeader = SourceHeaders;\n }\n TargetHeader['x-cos-storage-class'] = params.Headers['x-cos-storage-class'] || SourceHeaders['x-cos-storage-class'];\n TargetHeader = util.clearKey(TargetHeader);\n /**\n * 对于归档存储的对象,如果未恢复副本,则不允许 Copy\n */\n if (SourceHeaders['x-cos-storage-class'] === 'ARCHIVE' || SourceHeaders['x-cos-storage-class'] === 'DEEP_ARCHIVE') {\n var restoreHeader = SourceHeaders['x-cos-restore'];\n if (!restoreHeader || restoreHeader === 'ongoing-request=\"true\"') {\n callback(util.error(new Error('Unrestored archive object is not allowed to be copied')));\n return;\n }\n }\n /**\n * 去除一些无用的头部,规避 multipartInit 出错\n * 这些头部通常是在 putObjectCopy 时才使用\n */\n delete TargetHeader['x-cos-copy-source'];\n delete TargetHeader['x-cos-metadata-directive'];\n delete TargetHeader['x-cos-copy-source-If-Modified-Since'];\n delete TargetHeader['x-cos-copy-source-If-Unmodified-Since'];\n delete TargetHeader['x-cos-copy-source-If-Match'];\n delete TargetHeader['x-cos-copy-source-If-None-Match'];\n self.multipartInit({\n Bucket: Bucket,\n Region: Region,\n Key: Key,\n Headers: TargetHeader,\n },function (err,data) {\n if (err) return callback(err);\n params.UploadId = data.UploadId;\n ep.emit('get_copy_data_finish', params);\n });\n });\n\n // 获取远端复制源文件的大小\n self.headObject({\n Bucket: SourceBucket,\n Region: SourceRegion,\n Key: SourceKey,\n },function(err, data) {\n if (err) {\n if (err.statusCode && err.statusCode === 404) {\n callback(util.error(err, {ErrorStatus: SourceKey + ' Not Exist'}));\n } else {\n callback(err);\n }\n return;\n }\n\n FileSize = params.FileSize = data.headers['content-length'];\n if (FileSize === undefined || !FileSize) {\n callback(util.error(new Error('get Content-Length error, please add \"Content-Length\" to CORS ExposeHeader setting.( 获取Content-Length失败,请在CORS ExposeHeader设置中添加Content-Length,请参考文档:https://cloud.tencent.com/document/product/436/13318 )')));\n return;\n }\n\n onProgress = util.throttleOnProgress.call(self, FileSize, params.onProgress);\n\n // 开始上传\n if (FileSize <= CopySliceSize) {\n if (!params.Headers['x-cos-metadata-directive']) {\n params.Headers['x-cos-metadata-directive'] = 'Copy';\n }\n self.putObjectCopy(params, function (err, data) {\n if (err) {\n onProgress(null, true);\n return callback(err);\n }\n onProgress({loaded: FileSize, total: FileSize}, true);\n callback(err, data);\n });\n } else {\n var resHeaders = data.headers;\n var SourceHeaders = {\n 'Cache-Control': resHeaders['cache-control'],\n 'Content-Disposition': resHeaders['content-disposition'],\n 'Content-Encoding': resHeaders['content-encoding'],\n 'Content-Type': resHeaders['content-type'],\n 'Expires': resHeaders['expires'],\n 'x-cos-storage-class': resHeaders['x-cos-storage-class'],\n };\n util.each(resHeaders, function (v, k) {\n var metaPrefix = 'x-cos-meta-';\n if (k.indexOf(metaPrefix) === 0 && k.length > metaPrefix.length) {\n SourceHeaders[k] = v;\n }\n });\n ep.emit('get_file_size_finish', SourceHeaders);\n }\n });\n}\n\n// 复制指定分片\nfunction copySliceItem(params, callback) {\n var TaskId = params.TaskId;\n var Bucket = params.Bucket;\n var Region = params.Region;\n var Key = params.Key;\n var CopySource = params.CopySource;\n var UploadId = params.UploadId;\n var PartNumber = params.PartNumber * 1;\n var CopySourceRange = params.CopySourceRange;\n\n var ChunkRetryTimes = this.options.ChunkRetryTimes + 1;\n var self = this;\n\n Async.retry(ChunkRetryTimes, function (tryCallback) {\n self.uploadPartCopy({\n TaskId: TaskId,\n Bucket: Bucket,\n Region: Region,\n Key: Key,\n CopySource: CopySource,\n UploadId: UploadId,\n PartNumber:PartNumber,\n CopySourceRange:CopySourceRange,\n },function (err,data) {\n tryCallback(err || null, data);\n })\n }, function (err, data) {\n return callback(err, data);\n });\n}\n\n\nvar API_MAP = {\n sliceUploadFile: sliceUploadFile,\n abortUploadTask: abortUploadTask,\n uploadFile: uploadFile,\n uploadFiles: uploadFiles,\n sliceCopyFile: sliceCopyFile,\n};\n\nmodule.exports.init = function (COS, task) {\n task.transferToTaskMethod(API_MAP, 'sliceUploadFile');\n util.each(API_MAP, function (fn, apiName) {\n COS.prototype[apiName] = util.apiWrapper(apiName, fn);\n });\n};\n","function DOMParser(options){\r\n\tthis.options = options ||{locator:{}};\r\n\t\r\n}\r\nDOMParser.prototype.parseFromString = function(source,mimeType){\r\n\tvar options = this.options;\r\n\tvar sax = new XMLReader();\r\n\tvar domBuilder = options.domBuilder || new DOMHandler();//contentHandler and LexicalHandler\r\n\tvar errorHandler = options.errorHandler;\r\n\tvar locator = options.locator;\r\n\tvar defaultNSMap = options.xmlns||{};\r\n\tvar entityMap = {'lt':'<','gt':'>','amp':'&','quot':'\"','apos':\"'\"}\r\n\tif(locator){\r\n\t\tdomBuilder.setDocumentLocator(locator)\r\n\t}\r\n\t\r\n\tsax.errorHandler = buildErrorHandler(errorHandler,domBuilder,locator);\r\n\tsax.domBuilder = options.domBuilder || domBuilder;\r\n\tif(/\\/x?html?$/.test(mimeType)){\r\n\t\tentityMap.nbsp = '\\xa0';\r\n\t\tentityMap.copy = '\\xa9';\r\n\t\tdefaultNSMap['']= 'http://www.w3.org/1999/xhtml';\r\n\t}\r\n\tdefaultNSMap.xml = defaultNSMap.xml || 'http://www.w3.org/XML/1998/namespace';\r\n\tif(source){\r\n\t\tsax.parse(source,defaultNSMap,entityMap);\r\n\t}else{\r\n\t\tsax.errorHandler.error(\"invalid doc source\");\r\n\t}\r\n\treturn domBuilder.doc;\r\n}\r\nfunction buildErrorHandler(errorImpl,domBuilder,locator){\r\n\tif(!errorImpl){\r\n\t\tif(domBuilder instanceof DOMHandler){\r\n\t\t\treturn domBuilder;\r\n\t\t}\r\n\t\terrorImpl = domBuilder ;\r\n\t}\r\n\tvar errorHandler = {}\r\n\tvar isCallback = errorImpl instanceof Function;\r\n\tlocator = locator||{}\r\n\tfunction build(key){\r\n\t\tvar fn = errorImpl[key];\r\n\t\tif(!fn && isCallback){\r\n\t\t\tfn = errorImpl.length == 2?function(msg){errorImpl(key,msg)}:errorImpl;\r\n\t\t}\r\n\t\terrorHandler[key] = fn && function(msg){\r\n\t\t\tfn('[xmldom '+key+']\\t'+msg+_locator(locator));\r\n\t\t}||function(){};\r\n\t}\r\n\tbuild('warning');\r\n\tbuild('error');\r\n\tbuild('fatalError');\r\n\treturn errorHandler;\r\n}\r\n\r\n//console.log('#\\n\\n\\n\\n\\n\\n\\n####')\r\n/**\r\n * +ContentHandler+ErrorHandler\r\n * +LexicalHandler+EntityResolver2\r\n * -DeclHandler-DTDHandler \r\n * \r\n * DefaultHandler:EntityResolver, DTDHandler, ContentHandler, ErrorHandler\r\n * DefaultHandler2:DefaultHandler,LexicalHandler, DeclHandler, EntityResolver2\r\n * @link http://www.saxproject.org/apidoc/org/xml/sax/helpers/DefaultHandler.html\r\n */\r\nfunction DOMHandler() {\r\n this.cdata = false;\r\n}\r\nfunction position(locator,node){\r\n\tnode.lineNumber = locator.lineNumber;\r\n\tnode.columnNumber = locator.columnNumber;\r\n}\r\n/**\r\n * @see org.xml.sax.ContentHandler#startDocument\r\n * @link http://www.saxproject.org/apidoc/org/xml/sax/ContentHandler.html\r\n */ \r\nDOMHandler.prototype = {\r\n\tstartDocument : function() {\r\n \tthis.doc = new DOMImplementation().createDocument(null, null, null);\r\n \tif (this.locator) {\r\n \tthis.doc.documentURI = this.locator.systemId;\r\n \t}\r\n\t},\r\n\tstartElement:function(namespaceURI, localName, qName, attrs) {\r\n\t\tvar doc = this.doc;\r\n\t var el = doc.createElementNS(namespaceURI, qName||localName);\r\n\t var len = attrs.length;\r\n\t appendElement(this, el);\r\n\t this.currentElement = el;\r\n\t \r\n\t\tthis.locator && position(this.locator,el)\r\n\t for (var i = 0 ; i < len; i++) {\r\n\t var namespaceURI = attrs.getURI(i);\r\n\t var value = attrs.getValue(i);\r\n\t var qName = attrs.getQName(i);\r\n\t\t\tvar attr = doc.createAttributeNS(namespaceURI, qName);\r\n\t\t\tthis.locator &&position(attrs.getLocator(i),attr);\r\n\t\t\tattr.value = attr.nodeValue = value;\r\n\t\t\tel.setAttributeNode(attr)\r\n\t }\r\n\t},\r\n\tendElement:function(namespaceURI, localName, qName) {\r\n\t\tvar current = this.currentElement\r\n\t\tvar tagName = current.tagName;\r\n\t\tthis.currentElement = current.parentNode;\r\n\t},\r\n\tstartPrefixMapping:function(prefix, uri) {\r\n\t},\r\n\tendPrefixMapping:function(prefix) {\r\n\t},\r\n\tprocessingInstruction:function(target, data) {\r\n\t var ins = this.doc.createProcessingInstruction(target, data);\r\n\t this.locator && position(this.locator,ins)\r\n\t appendElement(this, ins);\r\n\t},\r\n\tignorableWhitespace:function(ch, start, length) {\r\n\t},\r\n\tcharacters:function(chars, start, length) {\r\n\t\tchars = _toString.apply(this,arguments)\r\n\t\t//console.log(chars)\r\n\t\tif(chars){\r\n\t\t\tif (this.cdata) {\r\n\t\t\t\tvar charNode = this.doc.createCDATASection(chars);\r\n\t\t\t} else {\r\n\t\t\t\tvar charNode = this.doc.createTextNode(chars);\r\n\t\t\t}\r\n\t\t\tif(this.currentElement){\r\n\t\t\t\tthis.currentElement.appendChild(charNode);\r\n\t\t\t}else if(/^\\s*$/.test(chars)){\r\n\t\t\t\tthis.doc.appendChild(charNode);\r\n\t\t\t\t//process xml\r\n\t\t\t}\r\n\t\t\tthis.locator && position(this.locator,charNode)\r\n\t\t}\r\n\t},\r\n\tskippedEntity:function(name) {\r\n\t},\r\n\tendDocument:function() {\r\n\t\tthis.doc.normalize();\r\n\t},\r\n\tsetDocumentLocator:function (locator) {\r\n\t if(this.locator = locator){// && !('lineNumber' in locator)){\r\n\t \tlocator.lineNumber = 0;\r\n\t }\r\n\t},\r\n\t//LexicalHandler\r\n\tcomment:function(chars, start, length) {\r\n\t\tchars = _toString.apply(this,arguments)\r\n\t var comm = this.doc.createComment(chars);\r\n\t this.locator && position(this.locator,comm)\r\n\t appendElement(this, comm);\r\n\t},\r\n\t\r\n\tstartCDATA:function() {\r\n\t //used in characters() methods\r\n\t this.cdata = true;\r\n\t},\r\n\tendCDATA:function() {\r\n\t this.cdata = false;\r\n\t},\r\n\t\r\n\tstartDTD:function(name, publicId, systemId) {\r\n\t\tvar impl = this.doc.implementation;\r\n\t if (impl && impl.createDocumentType) {\r\n\t var dt = impl.createDocumentType(name, publicId, systemId);\r\n\t this.locator && position(this.locator,dt)\r\n\t appendElement(this, dt);\r\n\t }\r\n\t},\r\n\t/**\r\n\t * @see org.xml.sax.ErrorHandler\r\n\t * @link http://www.saxproject.org/apidoc/org/xml/sax/ErrorHandler.html\r\n\t */\r\n\twarning:function(error) {\r\n\t\tconsole.warn('[xmldom warning]\\t'+error,_locator(this.locator));\r\n\t},\r\n\terror:function(error) {\r\n\t\tconsole.error('[xmldom error]\\t'+error,_locator(this.locator));\r\n\t},\r\n\tfatalError:function(error) {\r\n\t\tconsole.error('[xmldom fatalError]\\t'+error,_locator(this.locator));\r\n\t throw error;\r\n\t}\r\n}\r\nfunction _locator(l){\r\n\tif(l){\r\n\t\treturn '\\n@'+(l.systemId ||'')+'#[line:'+l.lineNumber+',col:'+l.columnNumber+']'\r\n\t}\r\n}\r\nfunction _toString(chars,start,length){\r\n\tif(typeof chars == 'string'){\r\n\t\treturn chars.substr(start,length)\r\n\t}else{//java sax connect width xmldom on rhino(what about: \"? && !(chars instanceof String)\")\r\n\t\tif(chars.length >= start+length || start){\r\n\t\t\treturn new java.lang.String(chars,start,length)+'';\r\n\t\t}\r\n\t\treturn chars;\r\n\t}\r\n}\r\n\r\n/*\r\n * @link http://www.saxproject.org/apidoc/org/xml/sax/ext/LexicalHandler.html\r\n * used method of org.xml.sax.ext.LexicalHandler:\r\n * #comment(chars, start, length)\r\n * #startCDATA()\r\n * #endCDATA()\r\n * #startDTD(name, publicId, systemId)\r\n *\r\n *\r\n * IGNORED method of org.xml.sax.ext.LexicalHandler:\r\n * #endDTD()\r\n * #startEntity(name)\r\n * #endEntity(name)\r\n *\r\n *\r\n * @link http://www.saxproject.org/apidoc/org/xml/sax/ext/DeclHandler.html\r\n * IGNORED method of org.xml.sax.ext.DeclHandler\r\n * \t#attributeDecl(eName, aName, type, mode, value)\r\n * #elementDecl(name, model)\r\n * #externalEntityDecl(name, publicId, systemId)\r\n * #internalEntityDecl(name, value)\r\n * @link http://www.saxproject.org/apidoc/org/xml/sax/ext/EntityResolver2.html\r\n * IGNORED method of org.xml.sax.EntityResolver2\r\n * #resolveEntity(String name,String publicId,String baseURI,String systemId)\r\n * #resolveEntity(publicId, systemId)\r\n * #getExternalSubset(name, baseURI)\r\n * @link http://www.saxproject.org/apidoc/org/xml/sax/DTDHandler.html\r\n * IGNORED method of org.xml.sax.DTDHandler\r\n * #notationDecl(name, publicId, systemId) {};\r\n * #unparsedEntityDecl(name, publicId, systemId, notationName) {};\r\n */\r\n\"endDTD,startEntity,endEntity,attributeDecl,elementDecl,externalEntityDecl,internalEntityDecl,resolveEntity,getExternalSubset,notationDecl,unparsedEntityDecl\".replace(/\\w+/g,function(key){\r\n\tDOMHandler.prototype[key] = function(){return null}\r\n})\r\n\r\n/* Private static helpers treated below as private instance methods, so don't need to add these to the public API; we might use a Relator to also get rid of non-standard public properties */\r\nfunction appendElement (hander,node) {\r\n if (!hander.currentElement) {\r\n hander.doc.appendChild(node);\r\n } else {\r\n hander.currentElement.appendChild(node);\r\n }\r\n}//appendChild and setAttributeNS are preformance key\r\n\r\n//if(typeof require == 'function'){\r\n\tvar XMLReader = require('./sax').XMLReader;\r\n\tvar DOMImplementation = exports.DOMImplementation = require('./dom').DOMImplementation;\r\n\texports.XMLSerializer = require('./dom').XMLSerializer ;\r\n\texports.DOMParser = DOMParser;\r\n//}\r\n","var COS = require('./src/cos');\nmodule.exports = COS;","import store from '@/store';\nimport {Notification} from 'element-ui';\n\nvar COS = require('cos-js-sdk-v5');\nvar cos = new COS({\n SecretId: 'AKIDw56vXyyH8mHdsv6W7ViZBQWNzObhItkT',\n SecretKey: 'mJTTFnU0H7nFUUI0Uv5rTsLF3e5UlrCC'\n});\n\nconst config = {\n Bucket: 'copyright-pro-temp-1259800220',\n Region: 'ap-beijing'\n};\n\nconst upload = {\n // 分片上传\n /*option:{\n data:event,\n onProgress:function(),\n onError:function(),\n onSuccess:function()\n }*/\n sliceUploadFile: function(option) {\n const _data = option.data;\n // this.getBucketCors();\n if (_data) {\n const _fileName = _data.name;\n const _key = option.taskKey + '-' + _fileName;\n const _file = _data;\n cos.sliceUploadFile(\n {\n Bucket: config.Bucket,\n Region: config.Region,\n Key: _key,\n Body: _file,\n onTaskReady: taskId => {\n Notification({\n title: '提示',\n message: '文件上传过程中不影响其他操作'\n });\n const _data = {\n taskId: taskId,\n fileName: _fileName,\n key: _key\n };\n option.onTaskReady ? option.onTaskReady(_data) : '';\n },\n onProgress: progressData => {\n this.getTaskList();\n option.onProgress ? option.onProgress(progressData) : '';\n }\n },\n (err, data) => {\n if (err) {\n Notification({\n title: '提示',\n message: _fileName + '上传失败',\n type: 'error'\n });\n option.onError ? option.onError(err) : '';\n }\n if (data) {\n Notification({\n title: '提示',\n message: _fileName + '上传成功',\n type: 'success'\n });\n const _url = this.getObjectUrl(_key);\n option.onSuccess ? option.onSuccess({...data, url: _url, fileName: _fileName}) : '';\n }\n this.getTaskList();\n }\n );\n }\n },\n //获取带签名的对象的 Url\n getObjectUrl: function(key) {\n return cos.getObjectUrl({\n Bucket: config.Bucket,\n Region: config.Region,\n Key: key\n });\n },\n //列出目录x的所有文件\n getBucket: function() {\n cos.getBucket(\n {\n Bucket: config.Bucket,\n Region: config.Region\n // Prefix: 'a/', /* 非必须 */\n }\n // function(err, data) {\n // }\n );\n },\n //删除文件\n deleteObject: function(key) {\n cos.deleteObject(\n {\n Bucket: config.Bucket,\n Region: config.Region,\n Key: key\n }\n // function(err, data) {\n // }\n );\n },\n //查看上传队列\n getTaskList: function() {\n const _allTaskList = cos.getTaskList();\n const _uploading = [];\n const _taskList = [];\n _allTaskList.map(item => {\n if (item.state == 'uploading') {\n _uploading.push(item);\n }\n if (item.state != 'canceled') {\n _taskList.push(item);\n }\n });\n store.dispatch('setTaskList', {\n taskList: _taskList,\n uploading: _uploading,\n btnVisible: true\n });\n },\n //查询跨域配置\n getBucketCors: function() {\n cos.getBucketCors(\n {\n Bucket: config.Bucket,\n Region: config.Region\n },\n function(err, data) {\n console.log(data);\n }\n );\n },\n //设置跨域配置\n putBucketCors: function() {\n cos.putBucketCors(\n {\n Bucket: config.Bucket,\n Region: config.Region,\n CORSRules: [\n {\n AllowedOrigin: [\n 'http://localhost:8881',\n 'http://localhost:8882',\n 'http://localhost:8883',\n 'http://localhost:8282',\n 'http://localhost:8383',\n '*.dmhmusic.com',\n '*.th-music.com',\n '*.indieworks.cn',\n '*.submusic.cn',\n '*.showstart.com',\n ],\n AllowedMethod: ['GET', 'POST', 'PUT', 'DELETE', 'HEAD'],\n AllowedHeader: ['*'],\n ExposeHeader: ['ETag', 'x-cos-acl', 'x-cos-version-id', 'x-cos-delete-marker', 'x-cos-server-side-encryption']\n // MaxAgeSeconds: '5'\n }\n ]\n }\n // function(err, data) {\n // }\n );\n },\n //查询对象元数据\n headObject: function(key) {\n cos.headObject(\n {\n Bucket: config.Bucket,\n Region: config.Region,\n Key: key /* 必须 */\n }\n // function(err, data) {\n // }\n );\n },\n //暂停上传任务\n pauseTask: function(id) {\n cos.pauseTask(id);\n this.getTaskList();\n },\n //重启上传任务\n restartTask: function(id) {\n cos.restartTask(id);\n this.getTaskList();\n },\n //取消上传任务\n cancelTask: function(id) {\n cos.cancelTask(id);\n this.getTaskList();\n }\n};\n\nexport default upload;\n","/*\n * DOM Level 2\n * Object DOMException\n * @see http://www.w3.org/TR/REC-DOM-Level-1/ecma-script-language-binding.html\n * @see http://www.w3.org/TR/2000/REC-DOM-Level-2-Core-20001113/ecma-script-binding.html\n */\n\nfunction copy(src,dest){\n\tfor(var p in src){\n\t\tdest[p] = src[p];\n\t}\n}\n/**\n^\\w+\\.prototype\\.([_\\w]+)\\s*=\\s*((?:.*\\{\\s*?[\\r\\n][\\s\\S]*?^})|\\S.*?(?=[;\\r\\n]));?\n^\\w+\\.prototype\\.([_\\w]+)\\s*=\\s*(\\S.*?(?=[;\\r\\n]));?\n */\nfunction _extends(Class,Super){\n\tvar pt = Class.prototype;\n\tif(Object.create){\n\t\tvar ppt = Object.create(Super.prototype)\n\t\tpt.__proto__ = ppt;\n\t}\n\tif(!(pt instanceof Super)){\n\t\tfunction t(){};\n\t\tt.prototype = Super.prototype;\n\t\tt = new t();\n\t\tcopy(pt,t);\n\t\tClass.prototype = pt = t;\n\t}\n\tif(pt.constructor != Class){\n\t\tif(typeof Class != 'function'){\n\t\t\tconsole.error(\"unknow Class:\"+Class)\n\t\t}\n\t\tpt.constructor = Class\n\t}\n}\nvar htmlns = 'http://www.w3.org/1999/xhtml' ;\n// Node Types\nvar NodeType = {}\nvar ELEMENT_NODE = NodeType.ELEMENT_NODE = 1;\nvar ATTRIBUTE_NODE = NodeType.ATTRIBUTE_NODE = 2;\nvar TEXT_NODE = NodeType.TEXT_NODE = 3;\nvar CDATA_SECTION_NODE = NodeType.CDATA_SECTION_NODE = 4;\nvar ENTITY_REFERENCE_NODE = NodeType.ENTITY_REFERENCE_NODE = 5;\nvar ENTITY_NODE = NodeType.ENTITY_NODE = 6;\nvar PROCESSING_INSTRUCTION_NODE = NodeType.PROCESSING_INSTRUCTION_NODE = 7;\nvar COMMENT_NODE = NodeType.COMMENT_NODE = 8;\nvar DOCUMENT_NODE = NodeType.DOCUMENT_NODE = 9;\nvar DOCUMENT_TYPE_NODE = NodeType.DOCUMENT_TYPE_NODE = 10;\nvar DOCUMENT_FRAGMENT_NODE = NodeType.DOCUMENT_FRAGMENT_NODE = 11;\nvar NOTATION_NODE = NodeType.NOTATION_NODE = 12;\n\n// ExceptionCode\nvar ExceptionCode = {}\nvar ExceptionMessage = {};\nvar INDEX_SIZE_ERR = ExceptionCode.INDEX_SIZE_ERR = ((ExceptionMessage[1]=\"Index size error\"),1);\nvar DOMSTRING_SIZE_ERR = ExceptionCode.DOMSTRING_SIZE_ERR = ((ExceptionMessage[2]=\"DOMString size error\"),2);\nvar HIERARCHY_REQUEST_ERR = ExceptionCode.HIERARCHY_REQUEST_ERR = ((ExceptionMessage[3]=\"Hierarchy request error\"),3);\nvar WRONG_DOCUMENT_ERR = ExceptionCode.WRONG_DOCUMENT_ERR = ((ExceptionMessage[4]=\"Wrong document\"),4);\nvar INVALID_CHARACTER_ERR = ExceptionCode.INVALID_CHARACTER_ERR = ((ExceptionMessage[5]=\"Invalid character\"),5);\nvar NO_DATA_ALLOWED_ERR = ExceptionCode.NO_DATA_ALLOWED_ERR = ((ExceptionMessage[6]=\"No data allowed\"),6);\nvar NO_MODIFICATION_ALLOWED_ERR = ExceptionCode.NO_MODIFICATION_ALLOWED_ERR = ((ExceptionMessage[7]=\"No modification allowed\"),7);\nvar NOT_FOUND_ERR = ExceptionCode.NOT_FOUND_ERR = ((ExceptionMessage[8]=\"Not found\"),8);\nvar NOT_SUPPORTED_ERR = ExceptionCode.NOT_SUPPORTED_ERR = ((ExceptionMessage[9]=\"Not supported\"),9);\nvar INUSE_ATTRIBUTE_ERR = ExceptionCode.INUSE_ATTRIBUTE_ERR = ((ExceptionMessage[10]=\"Attribute in use\"),10);\n//level2\nvar INVALID_STATE_ERR \t= ExceptionCode.INVALID_STATE_ERR \t= ((ExceptionMessage[11]=\"Invalid state\"),11);\nvar SYNTAX_ERR \t= ExceptionCode.SYNTAX_ERR \t= ((ExceptionMessage[12]=\"Syntax error\"),12);\nvar INVALID_MODIFICATION_ERR \t= ExceptionCode.INVALID_MODIFICATION_ERR \t= ((ExceptionMessage[13]=\"Invalid modification\"),13);\nvar NAMESPACE_ERR \t= ExceptionCode.NAMESPACE_ERR \t= ((ExceptionMessage[14]=\"Invalid namespace\"),14);\nvar INVALID_ACCESS_ERR \t= ExceptionCode.INVALID_ACCESS_ERR \t= ((ExceptionMessage[15]=\"Invalid access\"),15);\n\n\nfunction DOMException(code, message) {\n\tif(message instanceof Error){\n\t\tvar error = message;\n\t}else{\n\t\terror = this;\n\t\tError.call(this, ExceptionMessage[code]);\n\t\tthis.message = ExceptionMessage[code];\n\t\tif(Error.captureStackTrace) Error.captureStackTrace(this, DOMException);\n\t}\n\terror.code = code;\n\tif(message) this.message = this.message + \": \" + message;\n\treturn error;\n};\nDOMException.prototype = Error.prototype;\ncopy(ExceptionCode,DOMException)\n/**\n * @see http://www.w3.org/TR/2000/REC-DOM-Level-2-Core-20001113/core.html#ID-536297177\n * The NodeList interface provides the abstraction of an ordered collection of nodes, without defining or constraining how this collection is implemented. NodeList objects in the DOM are live.\n * The items in the NodeList are accessible via an integral index, starting from 0.\n */\nfunction NodeList() {\n};\nNodeList.prototype = {\n\t/**\n\t * The number of nodes in the list. The range of valid child node indices is 0 to length-1 inclusive.\n\t * @standard level1\n\t */\n\tlength:0, \n\t/**\n\t * Returns the indexth item in the collection. If index is greater than or equal to the number of nodes in the list, this returns null.\n\t * @standard level1\n\t * @param index unsigned long \n\t * Index into the collection.\n\t * @return Node\n\t * \tThe node at the indexth position in the NodeList, or null if that is not a valid index. \n\t */\n\titem: function(index) {\n\t\treturn this[index] || null;\n\t},\n\ttoString:function(isHTML,nodeFilter){\n\t\tfor(var buf = [], i = 0;i=0){\n\t\tvar lastIndex = list.length-1\n\t\twhile(i0 || key == 'xmlns'){\n//\t\t\treturn null;\n//\t\t}\n\t\t//console.log()\n\t\tvar i = this.length;\n\t\twhile(i--){\n\t\t\tvar attr = this[i];\n\t\t\t//console.log(attr.nodeName,key)\n\t\t\tif(attr.nodeName == key){\n\t\t\t\treturn attr;\n\t\t\t}\n\t\t}\n\t},\n\tsetNamedItem: function(attr) {\n\t\tvar el = attr.ownerElement;\n\t\tif(el && el!=this._ownerElement){\n\t\t\tthrow new DOMException(INUSE_ATTRIBUTE_ERR);\n\t\t}\n\t\tvar oldAttr = this.getNamedItem(attr.nodeName);\n\t\t_addNamedNode(this._ownerElement,this,attr,oldAttr);\n\t\treturn oldAttr;\n\t},\n\t/* returns Node */\n\tsetNamedItemNS: function(attr) {// raises: WRONG_DOCUMENT_ERR,NO_MODIFICATION_ALLOWED_ERR,INUSE_ATTRIBUTE_ERR\n\t\tvar el = attr.ownerElement, oldAttr;\n\t\tif(el && el!=this._ownerElement){\n\t\t\tthrow new DOMException(INUSE_ATTRIBUTE_ERR);\n\t\t}\n\t\toldAttr = this.getNamedItemNS(attr.namespaceURI,attr.localName);\n\t\t_addNamedNode(this._ownerElement,this,attr,oldAttr);\n\t\treturn oldAttr;\n\t},\n\n\t/* returns Node */\n\tremoveNamedItem: function(key) {\n\t\tvar attr = this.getNamedItem(key);\n\t\t_removeNamedNode(this._ownerElement,this,attr);\n\t\treturn attr;\n\t\t\n\t\t\n\t},// raises: NOT_FOUND_ERR,NO_MODIFICATION_ALLOWED_ERR\n\t\n\t//for level2\n\tremoveNamedItemNS:function(namespaceURI,localName){\n\t\tvar attr = this.getNamedItemNS(namespaceURI,localName);\n\t\t_removeNamedNode(this._ownerElement,this,attr);\n\t\treturn attr;\n\t},\n\tgetNamedItemNS: function(namespaceURI, localName) {\n\t\tvar i = this.length;\n\t\twhile(i--){\n\t\t\tvar node = this[i];\n\t\t\tif(node.localName == localName && node.namespaceURI == namespaceURI){\n\t\t\t\treturn node;\n\t\t\t}\n\t\t}\n\t\treturn null;\n\t}\n};\n/**\n * @see http://www.w3.org/TR/REC-DOM-Level-1/level-one-core.html#ID-102161490\n */\nfunction DOMImplementation(/* Object */ features) {\n\tthis._features = {};\n\tif (features) {\n\t\tfor (var feature in features) {\n\t\t\t this._features = features[feature];\n\t\t}\n\t}\n};\n\nDOMImplementation.prototype = {\n\thasFeature: function(/* string */ feature, /* string */ version) {\n\t\tvar versions = this._features[feature.toLowerCase()];\n\t\tif (versions && (!version || version in versions)) {\n\t\t\treturn true;\n\t\t} else {\n\t\t\treturn false;\n\t\t}\n\t},\n\t// Introduced in DOM Level 2:\n\tcreateDocument:function(namespaceURI, qualifiedName, doctype){// raises:INVALID_CHARACTER_ERR,NAMESPACE_ERR,WRONG_DOCUMENT_ERR\n\t\tvar doc = new Document();\n\t\tdoc.implementation = this;\n\t\tdoc.childNodes = new NodeList();\n\t\tdoc.doctype = doctype;\n\t\tif(doctype){\n\t\t\tdoc.appendChild(doctype);\n\t\t}\n\t\tif(qualifiedName){\n\t\t\tvar root = doc.createElementNS(namespaceURI,qualifiedName);\n\t\t\tdoc.appendChild(root);\n\t\t}\n\t\treturn doc;\n\t},\n\t// Introduced in DOM Level 2:\n\tcreateDocumentType:function(qualifiedName, publicId, systemId){// raises:INVALID_CHARACTER_ERR,NAMESPACE_ERR\n\t\tvar node = new DocumentType();\n\t\tnode.name = qualifiedName;\n\t\tnode.nodeName = qualifiedName;\n\t\tnode.publicId = publicId;\n\t\tnode.systemId = systemId;\n\t\t// Introduced in DOM Level 2:\n\t\t//readonly attribute DOMString internalSubset;\n\t\t\n\t\t//TODO:..\n\t\t// readonly attribute NamedNodeMap entities;\n\t\t// readonly attribute NamedNodeMap notations;\n\t\treturn node;\n\t}\n};\n\n\n/**\n * @see http://www.w3.org/TR/2000/REC-DOM-Level-2-Core-20001113/core.html#ID-1950641247\n */\n\nfunction Node() {\n};\n\nNode.prototype = {\n\tfirstChild : null,\n\tlastChild : null,\n\tpreviousSibling : null,\n\tnextSibling : null,\n\tattributes : null,\n\tparentNode : null,\n\tchildNodes : null,\n\townerDocument : null,\n\tnodeValue : null,\n\tnamespaceURI : null,\n\tprefix : null,\n\tlocalName : null,\n\t// Modified in DOM Level 2:\n\tinsertBefore:function(newChild, refChild){//raises \n\t\treturn _insertBefore(this,newChild,refChild);\n\t},\n\treplaceChild:function(newChild, oldChild){//raises \n\t\tthis.insertBefore(newChild,oldChild);\n\t\tif(oldChild){\n\t\t\tthis.removeChild(oldChild);\n\t\t}\n\t},\n\tremoveChild:function(oldChild){\n\t\treturn _removeChild(this,oldChild);\n\t},\n\tappendChild:function(newChild){\n\t\treturn this.insertBefore(newChild,null);\n\t},\n\thasChildNodes:function(){\n\t\treturn this.firstChild != null;\n\t},\n\tcloneNode:function(deep){\n\t\treturn cloneNode(this.ownerDocument||this,this,deep);\n\t},\n\t// Modified in DOM Level 2:\n\tnormalize:function(){\n\t\tvar child = this.firstChild;\n\t\twhile(child){\n\t\t\tvar next = child.nextSibling;\n\t\t\tif(next && next.nodeType == TEXT_NODE && child.nodeType == TEXT_NODE){\n\t\t\t\tthis.removeChild(next);\n\t\t\t\tchild.appendData(next.data);\n\t\t\t}else{\n\t\t\t\tchild.normalize();\n\t\t\t\tchild = next;\n\t\t\t}\n\t\t}\n\t},\n \t// Introduced in DOM Level 2:\n\tisSupported:function(feature, version){\n\t\treturn this.ownerDocument.implementation.hasFeature(feature,version);\n\t},\n // Introduced in DOM Level 2:\n hasAttributes:function(){\n \treturn this.attributes.length>0;\n },\n lookupPrefix:function(namespaceURI){\n \tvar el = this;\n \twhile(el){\n \t\tvar map = el._nsMap;\n \t\t//console.dir(map)\n \t\tif(map){\n \t\t\tfor(var n in map){\n \t\t\t\tif(map[n] == namespaceURI){\n \t\t\t\t\treturn n;\n \t\t\t\t}\n \t\t\t}\n \t\t}\n \t\tel = el.nodeType == ATTRIBUTE_NODE?el.ownerDocument : el.parentNode;\n \t}\n \treturn null;\n },\n // Introduced in DOM Level 3:\n lookupNamespaceURI:function(prefix){\n \tvar el = this;\n \twhile(el){\n \t\tvar map = el._nsMap;\n \t\t//console.dir(map)\n \t\tif(map){\n \t\t\tif(prefix in map){\n \t\t\t\treturn map[prefix] ;\n \t\t\t}\n \t\t}\n \t\tel = el.nodeType == ATTRIBUTE_NODE?el.ownerDocument : el.parentNode;\n \t}\n \treturn null;\n },\n // Introduced in DOM Level 3:\n isDefaultNamespace:function(namespaceURI){\n \tvar prefix = this.lookupPrefix(namespaceURI);\n \treturn prefix == null;\n }\n};\n\n\nfunction _xmlEncoder(c){\n\treturn c == '<' && '<' ||\n c == '>' && '>' ||\n c == '&' && '&' ||\n c == '\"' && '"' ||\n '&#'+c.charCodeAt()+';'\n}\n\n\ncopy(NodeType,Node);\ncopy(NodeType,Node.prototype);\n\n/**\n * @param callback return true for continue,false for break\n * @return boolean true: break visit;\n */\nfunction _visitNode(node,callback){\n\tif(callback(node)){\n\t\treturn true;\n\t}\n\tif(node = node.firstChild){\n\t\tdo{\n\t\t\tif(_visitNode(node,callback)){return true}\n }while(node=node.nextSibling)\n }\n}\n\n\n\nfunction Document(){\n}\nfunction _onAddAttribute(doc,el,newAttr){\n\tdoc && doc._inc++;\n\tvar ns = newAttr.namespaceURI ;\n\tif(ns == 'http://www.w3.org/2000/xmlns/'){\n\t\t//update namespace\n\t\tel._nsMap[newAttr.prefix?newAttr.localName:''] = newAttr.value\n\t}\n}\nfunction _onRemoveAttribute(doc,el,newAttr,remove){\n\tdoc && doc._inc++;\n\tvar ns = newAttr.namespaceURI ;\n\tif(ns == 'http://www.w3.org/2000/xmlns/'){\n\t\t//update namespace\n\t\tdelete el._nsMap[newAttr.prefix?newAttr.localName:'']\n\t}\n}\nfunction _onUpdateChild(doc,el,newChild){\n\tif(doc && doc._inc){\n\t\tdoc._inc++;\n\t\t//update childNodes\n\t\tvar cs = el.childNodes;\n\t\tif(newChild){\n\t\t\tcs[cs.length++] = newChild;\n\t\t}else{\n\t\t\t//console.log(1)\n\t\t\tvar child = el.firstChild;\n\t\t\tvar i = 0;\n\t\t\twhile(child){\n\t\t\t\tcs[i++] = child;\n\t\t\t\tchild =child.nextSibling;\n\t\t\t}\n\t\t\tcs.length = i;\n\t\t}\n\t}\n}\n\n/**\n * attributes;\n * children;\n * \n * writeable properties:\n * nodeValue,Attr:value,CharacterData:data\n * prefix\n */\nfunction _removeChild(parentNode,child){\n\tvar previous = child.previousSibling;\n\tvar next = child.nextSibling;\n\tif(previous){\n\t\tprevious.nextSibling = next;\n\t}else{\n\t\tparentNode.firstChild = next\n\t}\n\tif(next){\n\t\tnext.previousSibling = previous;\n\t}else{\n\t\tparentNode.lastChild = previous;\n\t}\n\t_onUpdateChild(parentNode.ownerDocument,parentNode);\n\treturn child;\n}\n/**\n * preformance key(refChild == null)\n */\nfunction _insertBefore(parentNode,newChild,nextChild){\n\tvar cp = newChild.parentNode;\n\tif(cp){\n\t\tcp.removeChild(newChild);//remove and update\n\t}\n\tif(newChild.nodeType === DOCUMENT_FRAGMENT_NODE){\n\t\tvar newFirst = newChild.firstChild;\n\t\tif (newFirst == null) {\n\t\t\treturn newChild;\n\t\t}\n\t\tvar newLast = newChild.lastChild;\n\t}else{\n\t\tnewFirst = newLast = newChild;\n\t}\n\tvar pre = nextChild ? nextChild.previousSibling : parentNode.lastChild;\n\n\tnewFirst.previousSibling = pre;\n\tnewLast.nextSibling = nextChild;\n\t\n\t\n\tif(pre){\n\t\tpre.nextSibling = newFirst;\n\t}else{\n\t\tparentNode.firstChild = newFirst;\n\t}\n\tif(nextChild == null){\n\t\tparentNode.lastChild = newLast;\n\t}else{\n\t\tnextChild.previousSibling = newLast;\n\t}\n\tdo{\n\t\tnewFirst.parentNode = parentNode;\n\t}while(newFirst !== newLast && (newFirst= newFirst.nextSibling))\n\t_onUpdateChild(parentNode.ownerDocument||parentNode,parentNode);\n\t//console.log(parentNode.lastChild.nextSibling == null)\n\tif (newChild.nodeType == DOCUMENT_FRAGMENT_NODE) {\n\t\tnewChild.firstChild = newChild.lastChild = null;\n\t}\n\treturn newChild;\n}\nfunction _appendSingleChild(parentNode,newChild){\n\tvar cp = newChild.parentNode;\n\tif(cp){\n\t\tvar pre = parentNode.lastChild;\n\t\tcp.removeChild(newChild);//remove and update\n\t\tvar pre = parentNode.lastChild;\n\t}\n\tvar pre = parentNode.lastChild;\n\tnewChild.parentNode = parentNode;\n\tnewChild.previousSibling = pre;\n\tnewChild.nextSibling = null;\n\tif(pre){\n\t\tpre.nextSibling = newChild;\n\t}else{\n\t\tparentNode.firstChild = newChild;\n\t}\n\tparentNode.lastChild = newChild;\n\t_onUpdateChild(parentNode.ownerDocument,parentNode,newChild);\n\treturn newChild;\n\t//console.log(\"__aa\",parentNode.lastChild.nextSibling == null)\n}\nDocument.prototype = {\n\t//implementation : null,\n\tnodeName : '#document',\n\tnodeType : DOCUMENT_NODE,\n\tdoctype : null,\n\tdocumentElement : null,\n\t_inc : 1,\n\t\n\tinsertBefore : function(newChild, refChild){//raises \n\t\tif(newChild.nodeType == DOCUMENT_FRAGMENT_NODE){\n\t\t\tvar child = newChild.firstChild;\n\t\t\twhile(child){\n\t\t\t\tvar next = child.nextSibling;\n\t\t\t\tthis.insertBefore(child,refChild);\n\t\t\t\tchild = next;\n\t\t\t}\n\t\t\treturn newChild;\n\t\t}\n\t\tif(this.documentElement == null && newChild.nodeType == ELEMENT_NODE){\n\t\t\tthis.documentElement = newChild;\n\t\t}\n\t\t\n\t\treturn _insertBefore(this,newChild,refChild),(newChild.ownerDocument = this),newChild;\n\t},\n\tremoveChild : function(oldChild){\n\t\tif(this.documentElement == oldChild){\n\t\t\tthis.documentElement = null;\n\t\t}\n\t\treturn _removeChild(this,oldChild);\n\t},\n\t// Introduced in DOM Level 2:\n\timportNode : function(importedNode,deep){\n\t\treturn importNode(this,importedNode,deep);\n\t},\n\t// Introduced in DOM Level 2:\n\tgetElementById :\tfunction(id){\n\t\tvar rtv = null;\n\t\t_visitNode(this.documentElement,function(node){\n\t\t\tif(node.nodeType == ELEMENT_NODE){\n\t\t\t\tif(node.getAttribute('id') == id){\n\t\t\t\t\trtv = node;\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\t\t\t}\n\t\t})\n\t\treturn rtv;\n\t},\n\t\n\t//document factory method:\n\tcreateElement :\tfunction(tagName){\n\t\tvar node = new Element();\n\t\tnode.ownerDocument = this;\n\t\tnode.nodeName = tagName;\n\t\tnode.tagName = tagName;\n\t\tnode.childNodes = new NodeList();\n\t\tvar attrs\t= node.attributes = new NamedNodeMap();\n\t\tattrs._ownerElement = node;\n\t\treturn node;\n\t},\n\tcreateDocumentFragment :\tfunction(){\n\t\tvar node = new DocumentFragment();\n\t\tnode.ownerDocument = this;\n\t\tnode.childNodes = new NodeList();\n\t\treturn node;\n\t},\n\tcreateTextNode :\tfunction(data){\n\t\tvar node = new Text();\n\t\tnode.ownerDocument = this;\n\t\tnode.appendData(data)\n\t\treturn node;\n\t},\n\tcreateComment :\tfunction(data){\n\t\tvar node = new Comment();\n\t\tnode.ownerDocument = this;\n\t\tnode.appendData(data)\n\t\treturn node;\n\t},\n\tcreateCDATASection :\tfunction(data){\n\t\tvar node = new CDATASection();\n\t\tnode.ownerDocument = this;\n\t\tnode.appendData(data)\n\t\treturn node;\n\t},\n\tcreateProcessingInstruction :\tfunction(target,data){\n\t\tvar node = new ProcessingInstruction();\n\t\tnode.ownerDocument = this;\n\t\tnode.tagName = node.target = target;\n\t\tnode.nodeValue= node.data = data;\n\t\treturn node;\n\t},\n\tcreateAttribute :\tfunction(name){\n\t\tvar node = new Attr();\n\t\tnode.ownerDocument\t= this;\n\t\tnode.name = name;\n\t\tnode.nodeName\t= name;\n\t\tnode.localName = name;\n\t\tnode.specified = true;\n\t\treturn node;\n\t},\n\tcreateEntityReference :\tfunction(name){\n\t\tvar node = new EntityReference();\n\t\tnode.ownerDocument\t= this;\n\t\tnode.nodeName\t= name;\n\t\treturn node;\n\t},\n\t// Introduced in DOM Level 2:\n\tcreateElementNS :\tfunction(namespaceURI,qualifiedName){\n\t\tvar node = new Element();\n\t\tvar pl = qualifiedName.split(':');\n\t\tvar attrs\t= node.attributes = new NamedNodeMap();\n\t\tnode.childNodes = new NodeList();\n\t\tnode.ownerDocument = this;\n\t\tnode.nodeName = qualifiedName;\n\t\tnode.tagName = qualifiedName;\n\t\tnode.namespaceURI = namespaceURI;\n\t\tif(pl.length == 2){\n\t\t\tnode.prefix = pl[0];\n\t\t\tnode.localName = pl[1];\n\t\t}else{\n\t\t\t//el.prefix = null;\n\t\t\tnode.localName = qualifiedName;\n\t\t}\n\t\tattrs._ownerElement = node;\n\t\treturn node;\n\t},\n\t// Introduced in DOM Level 2:\n\tcreateAttributeNS :\tfunction(namespaceURI,qualifiedName){\n\t\tvar node = new Attr();\n\t\tvar pl = qualifiedName.split(':');\n\t\tnode.ownerDocument = this;\n\t\tnode.nodeName = qualifiedName;\n\t\tnode.name = qualifiedName;\n\t\tnode.namespaceURI = namespaceURI;\n\t\tnode.specified = true;\n\t\tif(pl.length == 2){\n\t\t\tnode.prefix = pl[0];\n\t\t\tnode.localName = pl[1];\n\t\t}else{\n\t\t\t//el.prefix = null;\n\t\t\tnode.localName = qualifiedName;\n\t\t}\n\t\treturn node;\n\t}\n};\n_extends(Document,Node);\n\n\nfunction Element() {\n\tthis._nsMap = {};\n};\nElement.prototype = {\n\tnodeType : ELEMENT_NODE,\n\thasAttribute : function(name){\n\t\treturn this.getAttributeNode(name)!=null;\n\t},\n\tgetAttribute : function(name){\n\t\tvar attr = this.getAttributeNode(name);\n\t\treturn attr && attr.value || '';\n\t},\n\tgetAttributeNode : function(name){\n\t\treturn this.attributes.getNamedItem(name);\n\t},\n\tsetAttribute : function(name, value){\n\t\tvar attr = this.ownerDocument.createAttribute(name);\n\t\tattr.value = attr.nodeValue = \"\" + value;\n\t\tthis.setAttributeNode(attr)\n\t},\n\tremoveAttribute : function(name){\n\t\tvar attr = this.getAttributeNode(name)\n\t\tattr && this.removeAttributeNode(attr);\n\t},\n\t\n\t//four real opeartion method\n\tappendChild:function(newChild){\n\t\tif(newChild.nodeType === DOCUMENT_FRAGMENT_NODE){\n\t\t\treturn this.insertBefore(newChild,null);\n\t\t}else{\n\t\t\treturn _appendSingleChild(this,newChild);\n\t\t}\n\t},\n\tsetAttributeNode : function(newAttr){\n\t\treturn this.attributes.setNamedItem(newAttr);\n\t},\n\tsetAttributeNodeNS : function(newAttr){\n\t\treturn this.attributes.setNamedItemNS(newAttr);\n\t},\n\tremoveAttributeNode : function(oldAttr){\n\t\t//console.log(this == oldAttr.ownerElement)\n\t\treturn this.attributes.removeNamedItem(oldAttr.nodeName);\n\t},\n\t//get real attribute name,and remove it by removeAttributeNode\n\tremoveAttributeNS : function(namespaceURI, localName){\n\t\tvar old = this.getAttributeNodeNS(namespaceURI, localName);\n\t\told && this.removeAttributeNode(old);\n\t},\n\t\n\thasAttributeNS : function(namespaceURI, localName){\n\t\treturn this.getAttributeNodeNS(namespaceURI, localName)!=null;\n\t},\n\tgetAttributeNS : function(namespaceURI, localName){\n\t\tvar attr = this.getAttributeNodeNS(namespaceURI, localName);\n\t\treturn attr && attr.value || '';\n\t},\n\tsetAttributeNS : function(namespaceURI, qualifiedName, value){\n\t\tvar attr = this.ownerDocument.createAttributeNS(namespaceURI, qualifiedName);\n\t\tattr.value = attr.nodeValue = \"\" + value;\n\t\tthis.setAttributeNode(attr)\n\t},\n\tgetAttributeNodeNS : function(namespaceURI, localName){\n\t\treturn this.attributes.getNamedItemNS(namespaceURI, localName);\n\t},\n\t\n\tgetElementsByTagName : function(tagName){\n\t\treturn new LiveNodeList(this,function(base){\n\t\t\tvar ls = [];\n\t\t\t_visitNode(base,function(node){\n\t\t\t\tif(node !== base && node.nodeType == ELEMENT_NODE && (tagName === '*' || node.tagName == tagName)){\n\t\t\t\t\tls.push(node);\n\t\t\t\t}\n\t\t\t});\n\t\t\treturn ls;\n\t\t});\n\t},\n\tgetElementsByTagNameNS : function(namespaceURI, localName){\n\t\treturn new LiveNodeList(this,function(base){\n\t\t\tvar ls = [];\n\t\t\t_visitNode(base,function(node){\n\t\t\t\tif(node !== base && node.nodeType === ELEMENT_NODE && (namespaceURI === '*' || node.namespaceURI === namespaceURI) && (localName === '*' || node.localName == localName)){\n\t\t\t\t\tls.push(node);\n\t\t\t\t}\n\t\t\t});\n\t\t\treturn ls;\n\t\t\t\n\t\t});\n\t}\n};\nDocument.prototype.getElementsByTagName = Element.prototype.getElementsByTagName;\nDocument.prototype.getElementsByTagNameNS = Element.prototype.getElementsByTagNameNS;\n\n\n_extends(Element,Node);\nfunction Attr() {\n};\nAttr.prototype.nodeType = ATTRIBUTE_NODE;\n_extends(Attr,Node);\n\n\nfunction CharacterData() {\n};\nCharacterData.prototype = {\n\tdata : '',\n\tsubstringData : function(offset, count) {\n\t\treturn this.data.substring(offset, offset+count);\n\t},\n\tappendData: function(text) {\n\t\ttext = this.data+text;\n\t\tthis.nodeValue = this.data = text;\n\t\tthis.length = text.length;\n\t},\n\tinsertData: function(offset,text) {\n\t\tthis.replaceData(offset,0,text);\n\t\n\t},\n\tappendChild:function(newChild){\n\t\tthrow new Error(ExceptionMessage[HIERARCHY_REQUEST_ERR])\n\t},\n\tdeleteData: function(offset, count) {\n\t\tthis.replaceData(offset,count,\"\");\n\t},\n\treplaceData: function(offset, count, text) {\n\t\tvar start = this.data.substring(0,offset);\n\t\tvar end = this.data.substring(offset+count);\n\t\ttext = start + text + end;\n\t\tthis.nodeValue = this.data = text;\n\t\tthis.length = text.length;\n\t}\n}\n_extends(CharacterData,Node);\nfunction Text() {\n};\nText.prototype = {\n\tnodeName : \"#text\",\n\tnodeType : TEXT_NODE,\n\tsplitText : function(offset) {\n\t\tvar text = this.data;\n\t\tvar newText = text.substring(offset);\n\t\ttext = text.substring(0, offset);\n\t\tthis.data = this.nodeValue = text;\n\t\tthis.length = text.length;\n\t\tvar newNode = this.ownerDocument.createTextNode(newText);\n\t\tif(this.parentNode){\n\t\t\tthis.parentNode.insertBefore(newNode, this.nextSibling);\n\t\t}\n\t\treturn newNode;\n\t}\n}\n_extends(Text,CharacterData);\nfunction Comment() {\n};\nComment.prototype = {\n\tnodeName : \"#comment\",\n\tnodeType : COMMENT_NODE\n}\n_extends(Comment,CharacterData);\n\nfunction CDATASection() {\n};\nCDATASection.prototype = {\n\tnodeName : \"#cdata-section\",\n\tnodeType : CDATA_SECTION_NODE\n}\n_extends(CDATASection,CharacterData);\n\n\nfunction DocumentType() {\n};\nDocumentType.prototype.nodeType = DOCUMENT_TYPE_NODE;\n_extends(DocumentType,Node);\n\nfunction Notation() {\n};\nNotation.prototype.nodeType = NOTATION_NODE;\n_extends(Notation,Node);\n\nfunction Entity() {\n};\nEntity.prototype.nodeType = ENTITY_NODE;\n_extends(Entity,Node);\n\nfunction EntityReference() {\n};\nEntityReference.prototype.nodeType = ENTITY_REFERENCE_NODE;\n_extends(EntityReference,Node);\n\nfunction DocumentFragment() {\n};\nDocumentFragment.prototype.nodeName =\t\"#document-fragment\";\nDocumentFragment.prototype.nodeType =\tDOCUMENT_FRAGMENT_NODE;\n_extends(DocumentFragment,Node);\n\n\nfunction ProcessingInstruction() {\n}\nProcessingInstruction.prototype.nodeType = PROCESSING_INSTRUCTION_NODE;\n_extends(ProcessingInstruction,Node);\nfunction XMLSerializer(){}\nXMLSerializer.prototype.serializeToString = function(node,isHtml,nodeFilter){\n\treturn nodeSerializeToString.call(node,isHtml,nodeFilter);\n}\nNode.prototype.toString = nodeSerializeToString;\nfunction nodeSerializeToString(isHtml,nodeFilter){\n\tvar buf = [];\n\tvar refNode = this.nodeType == 9?this.documentElement:this;\n\tvar prefix = refNode.prefix;\n\tvar uri = refNode.namespaceURI;\n\t\n\tif(uri && prefix == null){\n\t\t//console.log(prefix)\n\t\tvar prefix = refNode.lookupPrefix(uri);\n\t\tif(prefix == null){\n\t\t\t//isHTML = true;\n\t\t\tvar visibleNamespaces=[\n\t\t\t{namespace:uri,prefix:null}\n\t\t\t//{namespace:uri,prefix:''}\n\t\t\t]\n\t\t}\n\t}\n\tserializeToString(this,buf,isHtml,nodeFilter,visibleNamespaces);\n\t//console.log('###',this.nodeType,uri,prefix,buf.join(''))\n\treturn buf.join('');\n}\nfunction needNamespaceDefine(node,isHTML, visibleNamespaces) {\n\tvar prefix = node.prefix||'';\n\tvar uri = node.namespaceURI;\n\tif (!prefix && !uri){\n\t\treturn false;\n\t}\n\tif (prefix === \"xml\" && uri === \"http://www.w3.org/XML/1998/namespace\" \n\t\t|| uri == 'http://www.w3.org/2000/xmlns/'){\n\t\treturn false;\n\t}\n\t\n\tvar i = visibleNamespaces.length \n\t//console.log('@@@@',node.tagName,prefix,uri,visibleNamespaces)\n\twhile (i--) {\n\t\tvar ns = visibleNamespaces[i];\n\t\t// get namespace prefix\n\t\t//console.log(node.nodeType,node.tagName,ns.prefix,prefix)\n\t\tif (ns.prefix == prefix){\n\t\t\treturn ns.namespace != uri;\n\t\t}\n\t}\n\t//console.log(isHTML,uri,prefix=='')\n\t//if(isHTML && prefix ==null && uri == 'http://www.w3.org/1999/xhtml'){\n\t//\treturn false;\n\t//}\n\t//node.flag = '11111'\n\t//console.error(3,true,node.flag,node.prefix,node.namespaceURI)\n\treturn true;\n}\nfunction serializeToString(node,buf,isHTML,nodeFilter,visibleNamespaces){\n\tif(nodeFilter){\n\t\tnode = nodeFilter(node);\n\t\tif(node){\n\t\t\tif(typeof node == 'string'){\n\t\t\t\tbuf.push(node);\n\t\t\t\treturn;\n\t\t\t}\n\t\t}else{\n\t\t\treturn;\n\t\t}\n\t\t//buf.sort.apply(attrs, attributeSorter);\n\t}\n\tswitch(node.nodeType){\n\tcase ELEMENT_NODE:\n\t\tif (!visibleNamespaces) visibleNamespaces = [];\n\t\tvar startVisibleNamespaces = visibleNamespaces.length;\n\t\tvar attrs = node.attributes;\n\t\tvar len = attrs.length;\n\t\tvar child = node.firstChild;\n\t\tvar nodeName = node.tagName;\n\t\t\n\t\tisHTML = (htmlns === node.namespaceURI) ||isHTML \n\t\tbuf.push('<',nodeName);\n\t\t\n\t\t\n\t\t\n\t\tfor(var i=0;i');\n\t\t\t//if is cdata child node\n\t\t\tif(isHTML && /^script$/i.test(nodeName)){\n\t\t\t\twhile(child){\n\t\t\t\t\tif(child.data){\n\t\t\t\t\t\tbuf.push(child.data);\n\t\t\t\t\t}else{\n\t\t\t\t\t\tserializeToString(child,buf,isHTML,nodeFilter,visibleNamespaces);\n\t\t\t\t\t}\n\t\t\t\t\tchild = child.nextSibling;\n\t\t\t\t}\n\t\t\t}else\n\t\t\t{\n\t\t\t\twhile(child){\n\t\t\t\t\tserializeToString(child,buf,isHTML,nodeFilter,visibleNamespaces);\n\t\t\t\t\tchild = child.nextSibling;\n\t\t\t\t}\n\t\t\t}\n\t\t\tbuf.push('');\n\t\t}else{\n\t\t\tbuf.push('/>');\n\t\t}\n\t\t// remove added visible namespaces\n\t\t//visibleNamespaces.length = startVisibleNamespaces;\n\t\treturn;\n\tcase DOCUMENT_NODE:\n\tcase DOCUMENT_FRAGMENT_NODE:\n\t\tvar child = node.firstChild;\n\t\twhile(child){\n\t\t\tserializeToString(child,buf,isHTML,nodeFilter,visibleNamespaces);\n\t\t\tchild = child.nextSibling;\n\t\t}\n\t\treturn;\n\tcase ATTRIBUTE_NODE:\n\t\treturn buf.push(' ',node.name,'=\"',node.value.replace(/[<&\"]/g,_xmlEncoder),'\"');\n\tcase TEXT_NODE:\n\t\treturn buf.push(node.data.replace(/[<&]/g,_xmlEncoder));\n\tcase CDATA_SECTION_NODE:\n\t\treturn buf.push( '');\n\tcase COMMENT_NODE:\n\t\treturn buf.push( \"\");\n\tcase DOCUMENT_TYPE_NODE:\n\t\tvar pubid = node.publicId;\n\t\tvar sysid = node.systemId;\n\t\tbuf.push('');\n\t\t}else if(sysid && sysid!='.'){\n\t\t\tbuf.push(' SYSTEM \"',sysid,'\">');\n\t\t}else{\n\t\t\tvar sub = node.internalSubset;\n\t\t\tif(sub){\n\t\t\t\tbuf.push(\" [\",sub,\"]\");\n\t\t\t}\n\t\t\tbuf.push(\">\");\n\t\t}\n\t\treturn;\n\tcase PROCESSING_INSTRUCTION_NODE:\n\t\treturn buf.push( \"\");\n\tcase ENTITY_REFERENCE_NODE:\n\t\treturn buf.push( '&',node.nodeName,';');\n\t//case ENTITY_NODE:\n\t//case NOTATION_NODE:\n\tdefault:\n\t\tbuf.push('??',node.nodeName);\n\t}\n}\nfunction importNode(doc,node,deep){\n\tvar node2;\n\tswitch (node.nodeType) {\n\tcase ELEMENT_NODE:\n\t\tnode2 = node.cloneNode(false);\n\t\tnode2.ownerDocument = doc;\n\t\t//var attrs = node2.attributes;\n\t\t//var len = attrs.length;\n\t\t//for(var i=0;i> 6);\n buffer8[i++] = 0x80 | (code & 0x3f);\n } else if (code < 0xd800 || code >= 0xe000) {\n buffer8[i++] = 0xe0 | (code >> 12);\n buffer8[i++] = 0x80 | ((code >> 6) & 0x3f);\n buffer8[i++] = 0x80 | (code & 0x3f);\n } else {\n code = 0x10000 + (((code & 0x3ff) << 10) | (message.charCodeAt(++index) & 0x3ff));\n buffer8[i++] = 0xf0 | (code >> 18);\n buffer8[i++] = 0x80 | ((code >> 12) & 0x3f);\n buffer8[i++] = 0x80 | ((code >> 6) & 0x3f);\n buffer8[i++] = 0x80 | (code & 0x3f);\n }\n }\n } else {\n for (i = this.start; index < length && i < 64; ++index) {\n code = message.charCodeAt(index);\n if (isBinStr || code < 0x80) {\n blocks[i >> 2] |= code << SHIFT[i++ & 3];\n } else if (code < 0x800) {\n blocks[i >> 2] |= (0xc0 | (code >> 6)) << SHIFT[i++ & 3];\n blocks[i >> 2] |= (0x80 | (code & 0x3f)) << SHIFT[i++ & 3];\n } else if (code < 0xd800 || code >= 0xe000) {\n blocks[i >> 2] |= (0xe0 | (code >> 12)) << SHIFT[i++ & 3];\n blocks[i >> 2] |= (0x80 | ((code >> 6) & 0x3f)) << SHIFT[i++ & 3];\n blocks[i >> 2] |= (0x80 | (code & 0x3f)) << SHIFT[i++ & 3];\n } else {\n code = 0x10000 + (((code & 0x3ff) << 10) | (message.charCodeAt(++index) & 0x3ff));\n blocks[i >> 2] |= (0xf0 | (code >> 18)) << SHIFT[i++ & 3];\n blocks[i >> 2] |= (0x80 | ((code >> 12) & 0x3f)) << SHIFT[i++ & 3];\n blocks[i >> 2] |= (0x80 | ((code >> 6) & 0x3f)) << SHIFT[i++ & 3];\n blocks[i >> 2] |= (0x80 | (code & 0x3f)) << SHIFT[i++ & 3];\n }\n }\n }\n this.lastByteIndex = i;\n this.bytes += i - this.start;\n if (i >= 64) {\n this.start = i - 64;\n this.hash();\n this.hashed = true;\n } else {\n this.start = i;\n }\n }\n if (this.bytes > 4294967295) {\n this.hBytes += this.bytes / 4294967296 << 0;\n this.bytes = this.bytes % 4294967296;\n }\n return this;\n };\n\n Md5.prototype.finalize = function () {\n if (this.finalized) {\n return;\n }\n this.finalized = true;\n var blocks = this.blocks, i = this.lastByteIndex;\n blocks[i >> 2] |= EXTRA[i & 3];\n if (i >= 56) {\n if (!this.hashed) {\n this.hash();\n }\n blocks[0] = blocks[16];\n blocks[16] = blocks[1] = blocks[2] = blocks[3] =\n blocks[4] = blocks[5] = blocks[6] = blocks[7] =\n blocks[8] = blocks[9] = blocks[10] = blocks[11] =\n blocks[12] = blocks[13] = blocks[14] = blocks[15] = 0;\n }\n blocks[14] = this.bytes << 3;\n blocks[15] = this.hBytes << 3 | this.bytes >>> 29;\n this.hash();\n };\n\n Md5.prototype.hash = function () {\n var a, b, c, d, bc, da, blocks = this.blocks;\n\n if (this.first) {\n a = blocks[0] - 680876937;\n a = (a << 7 | a >>> 25) - 271733879 << 0;\n d = (-1732584194 ^ a & 2004318071) + blocks[1] - 117830708;\n d = (d << 12 | d >>> 20) + a << 0;\n c = (-271733879 ^ (d & (a ^ -271733879))) + blocks[2] - 1126478375;\n c = (c << 17 | c >>> 15) + d << 0;\n b = (a ^ (c & (d ^ a))) + blocks[3] - 1316259209;\n b = (b << 22 | b >>> 10) + c << 0;\n } else {\n a = this.h0;\n b = this.h1;\n c = this.h2;\n d = this.h3;\n a += (d ^ (b & (c ^ d))) + blocks[0] - 680876936;\n a = (a << 7 | a >>> 25) + b << 0;\n d += (c ^ (a & (b ^ c))) + blocks[1] - 389564586;\n d = (d << 12 | d >>> 20) + a << 0;\n c += (b ^ (d & (a ^ b))) + blocks[2] + 606105819;\n c = (c << 17 | c >>> 15) + d << 0;\n b += (a ^ (c & (d ^ a))) + blocks[3] - 1044525330;\n b = (b << 22 | b >>> 10) + c << 0;\n }\n\n a += (d ^ (b & (c ^ d))) + blocks[4] - 176418897;\n a = (a << 7 | a >>> 25) + b << 0;\n d += (c ^ (a & (b ^ c))) + blocks[5] + 1200080426;\n d = (d << 12 | d >>> 20) + a << 0;\n c += (b ^ (d & (a ^ b))) + blocks[6] - 1473231341;\n c = (c << 17 | c >>> 15) + d << 0;\n b += (a ^ (c & (d ^ a))) + blocks[7] - 45705983;\n b = (b << 22 | b >>> 10) + c << 0;\n a += (d ^ (b & (c ^ d))) + blocks[8] + 1770035416;\n a = (a << 7 | a >>> 25) + b << 0;\n d += (c ^ (a & (b ^ c))) + blocks[9] - 1958414417;\n d = (d << 12 | d >>> 20) + a << 0;\n c += (b ^ (d & (a ^ b))) + blocks[10] - 42063;\n c = (c << 17 | c >>> 15) + d << 0;\n b += (a ^ (c & (d ^ a))) + blocks[11] - 1990404162;\n b = (b << 22 | b >>> 10) + c << 0;\n a += (d ^ (b & (c ^ d))) + blocks[12] + 1804603682;\n a = (a << 7 | a >>> 25) + b << 0;\n d += (c ^ (a & (b ^ c))) + blocks[13] - 40341101;\n d = (d << 12 | d >>> 20) + a << 0;\n c += (b ^ (d & (a ^ b))) + blocks[14] - 1502002290;\n c = (c << 17 | c >>> 15) + d << 0;\n b += (a ^ (c & (d ^ a))) + blocks[15] + 1236535329;\n b = (b << 22 | b >>> 10) + c << 0;\n a += (c ^ (d & (b ^ c))) + blocks[1] - 165796510;\n a = (a << 5 | a >>> 27) + b << 0;\n d += (b ^ (c & (a ^ b))) + blocks[6] - 1069501632;\n d = (d << 9 | d >>> 23) + a << 0;\n c += (a ^ (b & (d ^ a))) + blocks[11] + 643717713;\n c = (c << 14 | c >>> 18) + d << 0;\n b += (d ^ (a & (c ^ d))) + blocks[0] - 373897302;\n b = (b << 20 | b >>> 12) + c << 0;\n a += (c ^ (d & (b ^ c))) + blocks[5] - 701558691;\n a = (a << 5 | a >>> 27) + b << 0;\n d += (b ^ (c & (a ^ b))) + blocks[10] + 38016083;\n d = (d << 9 | d >>> 23) + a << 0;\n c += (a ^ (b & (d ^ a))) + blocks[15] - 660478335;\n c = (c << 14 | c >>> 18) + d << 0;\n b += (d ^ (a & (c ^ d))) + blocks[4] - 405537848;\n b = (b << 20 | b >>> 12) + c << 0;\n a += (c ^ (d & (b ^ c))) + blocks[9] + 568446438;\n a = (a << 5 | a >>> 27) + b << 0;\n d += (b ^ (c & (a ^ b))) + blocks[14] - 1019803690;\n d = (d << 9 | d >>> 23) + a << 0;\n c += (a ^ (b & (d ^ a))) + blocks[3] - 187363961;\n c = (c << 14 | c >>> 18) + d << 0;\n b += (d ^ (a & (c ^ d))) + blocks[8] + 1163531501;\n b = (b << 20 | b >>> 12) + c << 0;\n a += (c ^ (d & (b ^ c))) + blocks[13] - 1444681467;\n a = (a << 5 | a >>> 27) + b << 0;\n d += (b ^ (c & (a ^ b))) + blocks[2] - 51403784;\n d = (d << 9 | d >>> 23) + a << 0;\n c += (a ^ (b & (d ^ a))) + blocks[7] + 1735328473;\n c = (c << 14 | c >>> 18) + d << 0;\n b += (d ^ (a & (c ^ d))) + blocks[12] - 1926607734;\n b = (b << 20 | b >>> 12) + c << 0;\n bc = b ^ c;\n a += (bc ^ d) + blocks[5] - 378558;\n a = (a << 4 | a >>> 28) + b << 0;\n d += (bc ^ a) + blocks[8] - 2022574463;\n d = (d << 11 | d >>> 21) + a << 0;\n da = d ^ a;\n c += (da ^ b) + blocks[11] + 1839030562;\n c = (c << 16 | c >>> 16) + d << 0;\n b += (da ^ c) + blocks[14] - 35309556;\n b = (b << 23 | b >>> 9) + c << 0;\n bc = b ^ c;\n a += (bc ^ d) + blocks[1] - 1530992060;\n a = (a << 4 | a >>> 28) + b << 0;\n d += (bc ^ a) + blocks[4] + 1272893353;\n d = (d << 11 | d >>> 21) + a << 0;\n da = d ^ a;\n c += (da ^ b) + blocks[7] - 155497632;\n c = (c << 16 | c >>> 16) + d << 0;\n b += (da ^ c) + blocks[10] - 1094730640;\n b = (b << 23 | b >>> 9) + c << 0;\n bc = b ^ c;\n a += (bc ^ d) + blocks[13] + 681279174;\n a = (a << 4 | a >>> 28) + b << 0;\n d += (bc ^ a) + blocks[0] - 358537222;\n d = (d << 11 | d >>> 21) + a << 0;\n da = d ^ a;\n c += (da ^ b) + blocks[3] - 722521979;\n c = (c << 16 | c >>> 16) + d << 0;\n b += (da ^ c) + blocks[6] + 76029189;\n b = (b << 23 | b >>> 9) + c << 0;\n bc = b ^ c;\n a += (bc ^ d) + blocks[9] - 640364487;\n a = (a << 4 | a >>> 28) + b << 0;\n d += (bc ^ a) + blocks[12] - 421815835;\n d = (d << 11 | d >>> 21) + a << 0;\n da = d ^ a;\n c += (da ^ b) + blocks[15] + 530742520;\n c = (c << 16 | c >>> 16) + d << 0;\n b += (da ^ c) + blocks[2] - 995338651;\n b = (b << 23 | b >>> 9) + c << 0;\n a += (c ^ (b | ~d)) + blocks[0] - 198630844;\n a = (a << 6 | a >>> 26) + b << 0;\n d += (b ^ (a | ~c)) + blocks[7] + 1126891415;\n d = (d << 10 | d >>> 22) + a << 0;\n c += (a ^ (d | ~b)) + blocks[14] - 1416354905;\n c = (c << 15 | c >>> 17) + d << 0;\n b += (d ^ (c | ~a)) + blocks[5] - 57434055;\n b = (b << 21 | b >>> 11) + c << 0;\n a += (c ^ (b | ~d)) + blocks[12] + 1700485571;\n a = (a << 6 | a >>> 26) + b << 0;\n d += (b ^ (a | ~c)) + blocks[3] - 1894986606;\n d = (d << 10 | d >>> 22) + a << 0;\n c += (a ^ (d | ~b)) + blocks[10] - 1051523;\n c = (c << 15 | c >>> 17) + d << 0;\n b += (d ^ (c | ~a)) + blocks[1] - 2054922799;\n b = (b << 21 | b >>> 11) + c << 0;\n a += (c ^ (b | ~d)) + blocks[8] + 1873313359;\n a = (a << 6 | a >>> 26) + b << 0;\n d += (b ^ (a | ~c)) + blocks[15] - 30611744;\n d = (d << 10 | d >>> 22) + a << 0;\n c += (a ^ (d | ~b)) + blocks[6] - 1560198380;\n c = (c << 15 | c >>> 17) + d << 0;\n b += (d ^ (c | ~a)) + blocks[13] + 1309151649;\n b = (b << 21 | b >>> 11) + c << 0;\n a += (c ^ (b | ~d)) + blocks[4] - 145523070;\n a = (a << 6 | a >>> 26) + b << 0;\n d += (b ^ (a | ~c)) + blocks[11] - 1120210379;\n d = (d << 10 | d >>> 22) + a << 0;\n c += (a ^ (d | ~b)) + blocks[2] + 718787259;\n c = (c << 15 | c >>> 17) + d << 0;\n b += (d ^ (c | ~a)) + blocks[9] - 343485551;\n b = (b << 21 | b >>> 11) + c << 0;\n\n if (this.first) {\n this.h0 = a + 1732584193 << 0;\n this.h1 = b - 271733879 << 0;\n this.h2 = c - 1732584194 << 0;\n this.h3 = d + 271733878 << 0;\n this.first = false;\n } else {\n this.h0 = this.h0 + a << 0;\n this.h1 = this.h1 + b << 0;\n this.h2 = this.h2 + c << 0;\n this.h3 = this.h3 + d << 0;\n }\n };\n\n /**\n * @method hex\n * @memberof Md5\n * @instance\n * @description Output hash as hex string\n * @returns {String} Hex string\n * @see {@link md5.hex}\n * @example\n * hash.hex();\n */\n Md5.prototype.hex = function () {\n this.finalize();\n\n var h0 = this.h0, h1 = this.h1, h2 = this.h2, h3 = this.h3;\n\n return HEX_CHARS[(h0 >> 4) & 0x0F] + HEX_CHARS[h0 & 0x0F] +\n HEX_CHARS[(h0 >> 12) & 0x0F] + HEX_CHARS[(h0 >> 8) & 0x0F] +\n HEX_CHARS[(h0 >> 20) & 0x0F] + HEX_CHARS[(h0 >> 16) & 0x0F] +\n HEX_CHARS[(h0 >> 28) & 0x0F] + HEX_CHARS[(h0 >> 24) & 0x0F] +\n HEX_CHARS[(h1 >> 4) & 0x0F] + HEX_CHARS[h1 & 0x0F] +\n HEX_CHARS[(h1 >> 12) & 0x0F] + HEX_CHARS[(h1 >> 8) & 0x0F] +\n HEX_CHARS[(h1 >> 20) & 0x0F] + HEX_CHARS[(h1 >> 16) & 0x0F] +\n HEX_CHARS[(h1 >> 28) & 0x0F] + HEX_CHARS[(h1 >> 24) & 0x0F] +\n HEX_CHARS[(h2 >> 4) & 0x0F] + HEX_CHARS[h2 & 0x0F] +\n HEX_CHARS[(h2 >> 12) & 0x0F] + HEX_CHARS[(h2 >> 8) & 0x0F] +\n HEX_CHARS[(h2 >> 20) & 0x0F] + HEX_CHARS[(h2 >> 16) & 0x0F] +\n HEX_CHARS[(h2 >> 28) & 0x0F] + HEX_CHARS[(h2 >> 24) & 0x0F] +\n HEX_CHARS[(h3 >> 4) & 0x0F] + HEX_CHARS[h3 & 0x0F] +\n HEX_CHARS[(h3 >> 12) & 0x0F] + HEX_CHARS[(h3 >> 8) & 0x0F] +\n HEX_CHARS[(h3 >> 20) & 0x0F] + HEX_CHARS[(h3 >> 16) & 0x0F] +\n HEX_CHARS[(h3 >> 28) & 0x0F] + HEX_CHARS[(h3 >> 24) & 0x0F];\n };\n\n /**\n * @method toString\n * @memberof Md5\n * @instance\n * @description Output hash as hex string\n * @returns {String} Hex string\n * @see {@link md5.hex}\n * @example\n * hash.toString();\n */\n Md5.prototype.toString = Md5.prototype.hex;\n\n /**\n * @method digest\n * @memberof Md5\n * @instance\n * @description Output hash as bytes array\n * @returns {Array} Bytes array\n * @see {@link md5.digest}\n * @example\n * hash.digest();\n */\n Md5.prototype.digest = function (format) {\n if (format === 'hex') return this.hex();\n this.finalize();\n\n var h0 = this.h0, h1 = this.h1, h2 = this.h2, h3 = this.h3;\n var res = [\n h0 & 0xFF, (h0 >> 8) & 0xFF, (h0 >> 16) & 0xFF, (h0 >> 24) & 0xFF,\n h1 & 0xFF, (h1 >> 8) & 0xFF, (h1 >> 16) & 0xFF, (h1 >> 24) & 0xFF,\n h2 & 0xFF, (h2 >> 8) & 0xFF, (h2 >> 16) & 0xFF, (h2 >> 24) & 0xFF,\n h3 & 0xFF, (h3 >> 8) & 0xFF, (h3 >> 16) & 0xFF, (h3 >> 24) & 0xFF\n ];\n return res;\n };\n\n /**\n * @method array\n * @memberof Md5\n * @instance\n * @description Output hash as bytes array\n * @returns {Array} Bytes array\n * @see {@link md5.array}\n * @example\n * hash.array();\n */\n Md5.prototype.array = Md5.prototype.digest;\n\n /**\n * @method arrayBuffer\n * @memberof Md5\n * @instance\n * @description Output hash as ArrayBuffer\n * @returns {ArrayBuffer} ArrayBuffer\n * @see {@link md5.arrayBuffer}\n * @example\n * hash.arrayBuffer();\n */\n Md5.prototype.arrayBuffer = function () {\n this.finalize();\n\n var buffer = new ArrayBuffer(16);\n var blocks = new Uint32Array(buffer);\n blocks[0] = this.h0;\n blocks[1] = this.h1;\n blocks[2] = this.h2;\n blocks[3] = this.h3;\n return buffer;\n };\n\n /**\n * @method buffer\n * @deprecated This maybe confuse with Buffer in node.js. Please use arrayBuffer instead.\n * @memberof Md5\n * @instance\n * @description Output hash as ArrayBuffer\n * @returns {ArrayBuffer} ArrayBuffer\n * @see {@link md5.buffer}\n * @example\n * hash.buffer();\n */\n Md5.prototype.buffer = Md5.prototype.arrayBuffer;\n\n /**\n * @method base64\n * @memberof Md5\n * @instance\n * @description Output hash as base64 string\n * @returns {String} base64 string\n * @see {@link md5.base64}\n * @example\n * hash.base64();\n */\n Md5.prototype.base64 = function () {\n var v1, v2, v3, base64Str = '', bytes = this.array();\n for (var i = 0; i < 15;) {\n v1 = bytes[i++];\n v2 = bytes[i++];\n v3 = bytes[i++];\n base64Str += BASE64_ENCODE_CHAR[v1 >>> 2] +\n BASE64_ENCODE_CHAR[(v1 << 4 | v2 >>> 4) & 63] +\n BASE64_ENCODE_CHAR[(v2 << 2 | v3 >>> 6) & 63] +\n BASE64_ENCODE_CHAR[v3 & 63];\n }\n v1 = bytes[i];\n base64Str += BASE64_ENCODE_CHAR[v1 >>> 2] +\n BASE64_ENCODE_CHAR[(v1 << 4) & 63] +\n '==';\n return base64Str;\n };\n\n var exports = createMethod();\n\n if (COMMON_JS) {\n module.exports = exports;\n } else {\n /**\n * @method md5\b\n * @description Md5 hash function, export to global in browsers.\n * @param {String|Array|Uint8Array|ArrayBuffer} message message to hash\n * @returns {String} md5 hashes\n * @example\n * md5(''); // d41d8cd98f00b204e9800998ecf8427e\n * md5('The quick brown fox jumps over the lazy dog'); // 9e107d9d372bb6826bd81d3542a419d6\n * md5('The quick brown fox jumps over the lazy dog.'); // e4d909c290d0fb1ca068ffaddf22cbd0\n *\n * // It also supports UTF-8 encoding\n * md5('中文'); // a7bac2239fcdcb3a067903d8077c4a07\n *\n * // It also supports byte `Array`, `Uint8Array`, `ArrayBuffer`\n * md5([]); // d41d8cd98f00b204e9800998ecf8427e\n * md5(new Uint8Array([])); // d41d8cd98f00b204e9800998ecf8427e\n */\n root.md5 = exports;\n if (AMD) {\n define(function () {\n return exports;\n });\n }\n }\n})();\n","var REQUEST = require('../lib/request');\nvar util = require('./util');\n\n\n// Bucket 相关\n\n/**\n * 获取用户的 bucket 列表\n * @param {Object} params 回调函数,必须,下面为参数列表\n * 无特殊参数\n * @param {Function} callback 回调函数,必须\n */\nfunction getService(params, callback) {\n\n if (typeof params === 'function') {\n callback = params;\n params = {};\n }\n var protocol = this.options.Protocol || (util.isBrowser && location.protocol === 'http:' ? 'http:' : 'https:');\n var domain = this.options.ServiceDomain;\n var appId = params.AppId || this.options.appId;\n var region = params.Region;\n if (domain) {\n domain = domain.replace(/\\{\\{AppId\\}\\}/ig, appId || '')\n .replace(/\\{\\{Region\\}\\}/ig, region || '').replace(/\\{\\{.*?\\}\\}/ig, '');\n if (!/^[a-zA-Z]+:\\/\\//.test(domain)) {\n domain = protocol + '//' + domain;\n }\n if (domain.slice(-1) === '/') {\n domain = domain.slice(0, -1);\n }\n } else if (region) {\n domain = protocol + '//cos.' + region + '.myqcloud.com';\n } else {\n domain = protocol + '//service.cos.myqcloud.com';\n }\n\n var SignHost = '';\n var standardHost = region ? 'cos.' + region + '.myqcloud.com' : 'service.cos.myqcloud.com';\n var urlHost = domain.replace(/^https?:\\/\\/([^/]+)(\\/.*)?$/, '$1');\n if (standardHost === urlHost) SignHost = standardHost;\n\n submitRequest.call(this, {\n Action: 'name/cos:GetService',\n url: domain,\n method: 'GET',\n headers: params.Headers,\n SignHost: SignHost,\n }, function (err, data) {\n if (err) return callback(err);\n var buckets = (data && data.ListAllMyBucketsResult && data.ListAllMyBucketsResult.Buckets\n && data.ListAllMyBucketsResult.Buckets.Bucket) || [];\n buckets = util.isArray(buckets) ? buckets : [buckets];\n var owner = (data && data.ListAllMyBucketsResult && data.ListAllMyBucketsResult.Owner) || {};\n callback(null, {\n Buckets: buckets,\n Owner: owner,\n statusCode: data.statusCode,\n headers: data.headers,\n });\n });\n}\n\n/**\n * 创建 Bucket,并初始化访问权限\n * @param {Object} params 参数对象,必须\n * @param {String} params.Bucket Bucket名称,必须\n * @param {String} params.Region 地域名称,必须\n * @param {String} params.ACL 用户自定义文件权限,可以设置:private,public-read;默认值:private,非必须\n * @param {String} params.GrantRead 赋予被授权者读的权限,格式x-cos-grant-read: uin=\" \",uin=\" \",非必须\n * @param {String} params.GrantWrite 赋予被授权者写的权限,格式x-cos-grant-write: uin=\" \",uin=\" \",非必须\n * @param {String} params.GrantFullControl 赋予被授权者读写权限,格式x-cos-grant-full-control: uin=\" \",uin=\" \",非必须\n * @param {Function} callback 回调函数,必须\n * @return {Object} err 请求失败的错误,如果请求成功,则为空。https://cloud.tencent.com/document/product/436/7730\n * @return {Object} data 返回的数据\n * @return {String} data.Location 操作地址\n */\nfunction putBucket(params, callback) {\n\n var self = this;\n\n var xml = '';\n if(params['BucketAZConfig']){\n var CreateBucketConfiguration = {\n BucketAZConfig: params.BucketAZConfig\n };\n xml = util.json2xml({CreateBucketConfiguration: CreateBucketConfiguration});\n }\n\n submitRequest.call(this, {\n Action: 'name/cos:PutBucket',\n method: 'PUT',\n Bucket: params.Bucket,\n Region: params.Region,\n headers: params.Headers,\n body: xml,\n }, function (err, data) {\n if (err) return callback(err);\n var url = getUrl({\n protocol: self.options.Protocol,\n domain: self.options.Domain,\n bucket: params.Bucket,\n region: params.Region,\n isLocation: true,\n });\n callback(null, {\n Location: url,\n statusCode: data.statusCode,\n headers: data.headers,\n });\n });\n}\n\n/**\n * 查看是否存在该Bucket,是否有权限访问\n * @param {Object} params 参数对象,必须\n * @param {String} params.Bucket Bucket名称,必须\n * @param {String} params.Region 地域名称,必须\n * @param {Function} callback 回调函数,必须\n * @return {Object} err 请求失败的错误,如果请求成功,则为空。https://cloud.tencent.com/document/product/436/7730\n * @return {Object} data 返回的数据\n * @return {Boolean} data.BucketExist Bucket是否存在\n * @return {Boolean} data.BucketAuth 是否有 Bucket 的访问权限\n */\nfunction headBucket(params, callback) {\n submitRequest.call(this, {\n Action: 'name/cos:HeadBucket',\n Bucket: params.Bucket,\n Region: params.Region,\n headers: params.Headers,\n method: 'HEAD',\n }, callback);\n}\n\n/**\n * 获取 Bucket 下的 object 列表\n * @param {Object} params 参数对象,必须\n * @param {String} params.Bucket Bucket名称,必须\n * @param {String} params.Region 地域名称,必须\n * @param {String} params.Prefix 前缀匹配,用来规定返回的文件前缀地址,非必须\n * @param {String} params.Delimiter 定界符为一个符号,如果有Prefix,则将Prefix到delimiter之间的相同路径归为一类,非必须\n * @param {String} params.Marker 默认以UTF-8二进制顺序列出条目,所有列出条目从marker开始,非必须\n * @param {String} params.MaxKeys 单次返回最大的条目数量,默认1000,非必须\n * @param {String} params.EncodingType 规定返回值的编码方式,非必须\n * @param {Function} callback 回调函数,必须\n * @return {Object} err 请求失败的错误,如果请求成功,则为空。https://cloud.tencent.com/document/product/436/7730\n * @return {Object} data 返回的数据\n * @return {Object} data.ListBucketResult 返回的 object 列表信息\n */\nfunction getBucket(params, callback) {\n var reqParams = {};\n reqParams['prefix'] = params['Prefix'] || '';\n reqParams['delimiter'] = params['Delimiter'];\n reqParams['marker'] = params['Marker'];\n reqParams['max-keys'] = params['MaxKeys'];\n reqParams['encoding-type'] = params['EncodingType'];\n\n submitRequest.call(this, {\n Action: 'name/cos:GetBucket',\n ResourceKey: reqParams['prefix'],\n method: 'GET',\n Bucket: params.Bucket,\n Region: params.Region,\n headers: params.Headers,\n qs: reqParams,\n }, function (err, data) {\n if (err) return callback(err);\n var ListBucketResult = data.ListBucketResult || {};\n var Contents = ListBucketResult.Contents || [];\n var CommonPrefixes = ListBucketResult.CommonPrefixes || [];\n\n Contents = util.isArray(Contents) ? Contents : [Contents];\n CommonPrefixes = util.isArray(CommonPrefixes) ? CommonPrefixes : [CommonPrefixes];\n\n var result = util.clone(ListBucketResult);\n util.extend(result, {\n Contents: Contents,\n CommonPrefixes: CommonPrefixes,\n statusCode: data.statusCode,\n headers: data.headers,\n });\n\n callback(null, result);\n });\n}\n\n/**\n * 删除 Bucket\n * @param {Object} params 参数对象,必须\n * @param {String} params.Bucket Bucket名称,必须\n * @param {String} params.Region 地域名称,必须\n * @param {Function} callback 回调函数,必须\n * @return {Object} err 请求失败的错误,如果请求成功,则为空。https://cloud.tencent.com/document/product/436/7730\n * @return {Object} data 返回的数据\n * @return {String} data.Location 操作地址\n */\nfunction deleteBucket(params, callback) {\n submitRequest.call(this, {\n Action: 'name/cos:DeleteBucket',\n Bucket: params.Bucket,\n Region: params.Region,\n headers: params.Headers,\n method: 'DELETE',\n }, function (err, data) {\n if (err && err.statusCode === 204) {\n return callback(null, {statusCode: err.statusCode});\n } else if (err) {\n return callback(err);\n }\n callback(null, {\n statusCode: data.statusCode,\n headers: data.headers,\n });\n });\n}\n\n/**\n * 设置 Bucket 的 权限列表\n * @param {Object} params 参数对象,必须\n * @param {String} params.Bucket Bucket名称,必须\n * @param {String} params.Region 地域名称,必须\n * @param {String} params.ACL 用户自定义文件权限,可以设置:private,public-read;默认值:private,非必须\n * @param {String} params.GrantRead 赋予被授权者读的权限,格式x-cos-grant-read: uin=\" \",uin=\" \",非必须\n * @param {String} params.GrantWrite 赋予被授权者写的权限,格式x-cos-grant-write: uin=\" \",uin=\" \",非必须\n * @param {String} params.GrantFullControl 赋予被授权者读写权限,格式x-cos-grant-full-control: uin=\" \",uin=\" \",非必须\n * @param {Function} callback 回调函数,必须\n * @return {Object} err 请求失败的错误,如果请求成功,则为空。https://cloud.tencent.com/document/product/436/7730\n * @return {Object} data 返回的数据\n */\nfunction putBucketAcl(params, callback) {\n var headers = params.Headers;\n\n var xml = '';\n if (params['AccessControlPolicy']) {\n var AccessControlPolicy = util.clone(params['AccessControlPolicy'] || {});\n var Grants = AccessControlPolicy.Grants || AccessControlPolicy.Grant;\n Grants = util.isArray(Grants) ? Grants : [Grants];\n delete AccessControlPolicy.Grant;\n delete AccessControlPolicy.Grants;\n AccessControlPolicy.AccessControlList = {Grant: Grants};\n xml = util.json2xml({AccessControlPolicy: AccessControlPolicy});\n\n headers['Content-Type'] = 'application/xml';\n headers['Content-MD5'] = util.binaryBase64(util.md5(xml));\n }\n\n // Grant Header 去重\n util.each(headers, function (val, key) {\n if (key.indexOf('x-cos-grant-') === 0) {\n headers[key] = uniqGrant(headers[key]);\n }\n });\n\n submitRequest.call(this, {\n Action: 'name/cos:PutBucketACL',\n method: 'PUT',\n Bucket: params.Bucket,\n Region: params.Region,\n headers: headers,\n action: 'acl',\n body: xml,\n }, function (err, data) {\n if (err) return callback(err);\n callback(null, {\n statusCode: data.statusCode,\n headers: data.headers,\n });\n });\n}\n\n/**\n * 获取 Bucket 的 权限列表\n * @param {Object} params 参数对象,必须\n * @param {String} params.Bucket Bucket名称,必须\n * @param {String} params.Region 地域名称,必须\n * @param {Function} callback 回调函数,必须\n * @return {Object} err 请求失败的错误,如果请求成功,则为空。https://cloud.tencent.com/document/product/436/7730\n * @return {Object} data 返回的数据\n * @return {Object} data.AccessControlPolicy 访问权限信息\n */\nfunction getBucketAcl(params, callback) {\n\n submitRequest.call(this, {\n Action: 'name/cos:GetBucketACL',\n method: 'GET',\n Bucket: params.Bucket,\n Region: params.Region,\n headers: params.Headers,\n action: 'acl',\n }, function (err, data) {\n if (err) return callback(err);\n var AccessControlPolicy = data.AccessControlPolicy || {};\n var Owner = AccessControlPolicy.Owner || {};\n var Grant = AccessControlPolicy.AccessControlList.Grant || [];\n Grant = util.isArray(Grant) ? Grant : [Grant];\n var result = decodeAcl(AccessControlPolicy);\n if (data.headers && data.headers['x-cos-acl']) {\n result.ACL = data.headers['x-cos-acl'];\n }\n result = util.extend(result, {\n Owner: Owner,\n Grants: Grant,\n statusCode: data.statusCode,\n headers: data.headers,\n });\n callback(null, result);\n });\n}\n\n/**\n * 设置 Bucket 的 跨域设置\n * @param {Object} params 参数对象,必须\n * @param {String} params.Bucket Bucket名称,必须\n * @param {String} params.Region 地域名称,必须\n * @param {Object} params.CORSConfiguration 相关的跨域设置,必须\n * @param {Array} params.CORSConfiguration.CORSRules 对应的跨域规则\n * @param {Function} callback 回调函数,必须\n * @return {Object} err 请求失败的错误,如果请求成功,则为空。https://cloud.tencent.com/document/product/436/7730\n * @return {Object} data 返回的数据\n */\nfunction putBucketCors(params, callback) {\n\n var CORSConfiguration = params['CORSConfiguration'] || {};\n var CORSRules = CORSConfiguration['CORSRules'] || params['CORSRules'] || [];\n CORSRules = util.clone(util.isArray(CORSRules) ? CORSRules : [CORSRules]);\n util.each(CORSRules, function (rule) {\n util.each(['AllowedOrigin', 'AllowedHeader', 'AllowedMethod', 'ExposeHeader'], function (key) {\n var sKey = key + 's';\n var val = rule[sKey] || rule[key] || [];\n delete rule[sKey];\n rule[key] = util.isArray(val) ? val : [val];\n });\n });\n\n var xml = util.json2xml({CORSConfiguration: {CORSRule: CORSRules}});\n\n var headers = params.Headers;\n headers['Content-Type'] = 'application/xml';\n headers['Content-MD5'] = util.binaryBase64(util.md5(xml));\n\n submitRequest.call(this, {\n Action: 'name/cos:PutBucketCORS',\n method: 'PUT',\n Bucket: params.Bucket,\n Region: params.Region,\n body: xml,\n action: 'cors',\n headers: headers,\n }, function (err, data) {\n if (err) return callback(err);\n callback(null, {\n statusCode: data.statusCode,\n headers: data.headers,\n });\n });\n}\n\n/**\n * 获取 Bucket 的 跨域设置\n * @param {Object} params 参数对象,必须\n * @param {String} params.Bucket Bucket名称,必须\n * @param {String} params.Region 地域名称,必须\n * @param {Function} callback 回调函数,必须\n * @return {Object} err 请求失败的错误,如果请求成功,则为空。https://cloud.tencent.com/document/product/436/7730\n * @return {Object} data 返回的数据\n * @return {Object} data.CORSRules Bucket的跨域设置\n */\nfunction getBucketCors(params, callback) {\n submitRequest.call(this, {\n Action: 'name/cos:GetBucketCORS',\n method: 'GET',\n Bucket: params.Bucket,\n Region: params.Region,\n headers: params.Headers,\n action: 'cors',\n }, function (err, data) {\n if (err) {\n if (err.statusCode === 404 && err.error && err.error.Code === 'NoSuchCORSConfiguration') {\n var result = {\n CORSRules: [],\n statusCode: err.statusCode,\n };\n err.headers && (result.headers = err.headers);\n callback(null, result);\n } else {\n callback(err);\n }\n return;\n }\n var CORSConfiguration = data.CORSConfiguration || {};\n var CORSRules = CORSConfiguration.CORSRules || CORSConfiguration.CORSRule || [];\n CORSRules = util.clone(util.isArray(CORSRules) ? CORSRules : [CORSRules]);\n\n util.each(CORSRules, function (rule) {\n util.each(['AllowedOrigin', 'AllowedHeader', 'AllowedMethod', 'ExposeHeader'], function (key) {\n var sKey = key + 's';\n var val = rule[sKey] || rule[key] || [];\n delete rule[key];\n rule[sKey] = util.isArray(val) ? val : [val];\n });\n });\n\n callback(null, {\n CORSRules: CORSRules,\n statusCode: data.statusCode,\n headers: data.headers,\n });\n });\n}\n\n/**\n * 删除 Bucket 的 跨域设置\n * @param {Object} params 参数对象,必须\n * @param {String} params.Bucket Bucket名称,必须\n * @param {String} params.Region 地域名称,必须\n * @param {Function} callback 回调函数,必须\n * @return {Object} err 请求失败的错误,如果请求成功,则为空。https://cloud.tencent.com/document/product/436/7730\n * @return {Object} data 返回的数据\n */\nfunction deleteBucketCors(params, callback) {\n submitRequest.call(this, {\n Action: 'name/cos:DeleteBucketCORS',\n method: 'DELETE',\n Bucket: params.Bucket,\n Region: params.Region,\n headers: params.Headers,\n action: 'cors',\n }, function (err, data) {\n if (err && err.statusCode === 204) {\n return callback(null, {statusCode: err.statusCode});\n } else if (err) {\n return callback(err);\n }\n callback(null, {\n statusCode: data.statusCode || err.statusCode,\n headers: data.headers,\n });\n });\n}\n\n/**\n * 获取 Bucket 的 地域信息\n * @param {Object} params 参数对象,必须\n * @param {String} params.Bucket Bucket名称,必须\n * @param {String} params.Region 地域名称,必须\n * @param {Function} callback 回调函数,必须\n * @return {Object} err 请求失败的错误,如果请求成功,则为空。https://cloud.tencent.com/document/product/436/7730\n * @return {Object} data 返回数据,包含地域信息 LocationConstraint\n */\nfunction getBucketLocation(params, callback) {\n submitRequest.call(this, {\n Action: 'name/cos:GetBucketLocation',\n method: 'GET',\n Bucket: params.Bucket,\n Region: params.Region,\n headers: params.Headers,\n action: 'location',\n }, callback);\n}\n\nfunction putBucketPolicy(params, callback) {\n var Policy = params['Policy'];\n try {\n if (typeof Policy === 'string') Policy = JSON.parse(Policy);\n } catch (e) {\n }\n if (!Policy || typeof Policy === 'string') return callback(util.error(new Error('Policy format error')));\n var PolicyStr = JSON.stringify(Policy);\n if (!Policy.version) Policy.version = '2.0';\n\n var headers = params.Headers;\n headers['Content-Type'] = 'application/json';\n headers['Content-MD5'] = util.binaryBase64(util.md5(PolicyStr));\n\n submitRequest.call(this, {\n Action: 'name/cos:PutBucketPolicy',\n method: 'PUT',\n Bucket: params.Bucket,\n Region: params.Region,\n action: 'policy',\n body: PolicyStr,\n headers: headers,\n }, function (err, data) {\n if (err && err.statusCode === 204) {\n return callback(null, {statusCode: err.statusCode});\n } else if (err) {\n return callback(err);\n }\n callback(null, {\n statusCode: data.statusCode,\n headers: data.headers,\n });\n });\n}\n\n/**\n * 获取 Bucket 的读取权限策略\n * @param {Object} params 参数对象,必须\n * @param {String} params.Bucket Bucket名称,必须\n * @param {String} params.Region 地域名称,必须\n * @param {Function} callback 回调函数,必须\n * @return {Object} err 请求失败的错误,如果请求成功,则为空。https://cloud.tencent.com/document/product/436/7730\n * @return {Object} data 返回数据\n */\nfunction getBucketPolicy(params, callback) {\n submitRequest.call(this, {\n Action: 'name/cos:GetBucketPolicy',\n method: 'GET',\n Bucket: params.Bucket,\n Region: params.Region,\n headers: params.Headers,\n action: 'policy',\n rawBody: true,\n }, function (err, data) {\n if (err) {\n if (err.statusCode && err.statusCode === 403) {\n return callback(util.error(err, {ErrorStatus: 'Access Denied'}));\n }\n if (err.statusCode && err.statusCode === 405) {\n return callback(util.error(err, {ErrorStatus: 'Method Not Allowed'}));\n }\n if (err.statusCode && err.statusCode === 404) {\n return callback(util.error(err, {ErrorStatus: 'Policy Not Found'}));\n }\n return callback(err);\n }\n var Policy = {};\n try {\n Policy = JSON.parse(data.body);\n } catch (e) {\n }\n callback(null, {\n Policy: Policy,\n statusCode: data.statusCode,\n headers: data.headers,\n });\n });\n}\n\n/**\n * 删除 Bucket 的 跨域设置\n * @param {Object} params 参数对象,必须\n * @param {String} params.Bucket Bucket名称,必须\n * @param {String} params.Region 地域名称,必须\n * @param {Function} callback 回调函数,必须\n * @return {Object} err 请求失败的错误,如果请求成功,则为空。https://cloud.tencent.com/document/product/436/7730\n * @return {Object} data 返回的数据\n */\nfunction deleteBucketPolicy(params, callback) {\n submitRequest.call(this, {\n Action: 'name/cos:DeleteBucketPolicy',\n method: 'DELETE',\n Bucket: params.Bucket,\n Region: params.Region,\n headers: params.Headers,\n action: 'policy',\n }, function (err, data) {\n if (err && err.statusCode === 204) {\n return callback(null, {statusCode: err.statusCode});\n } else if (err) {\n return callback(err);\n }\n callback(null, {\n statusCode: data.statusCode || err.statusCode,\n headers: data.headers,\n });\n });\n}\n\n/**\n * 设置 Bucket 的标签\n * @param {Object} params 参数对象,必须\n * @param {String} params.Bucket Bucket名称,必须\n * @param {String} params.Region 地域名称,必须\n * @param {Array} params.TagSet 标签设置,必须\n * @param {Function} callback 回调函数,必须\n * @return {Object} err 请求失败的错误,如果请求成功,则为空。https://cloud.tencent.com/document/product/436/7730\n * @return {Object} data 返回数据\n */\nfunction putBucketTagging(params, callback) {\n\n var Tagging = params['Tagging'] || {};\n var Tags = Tagging.TagSet || Tagging.Tags || params['Tags'] || [];\n Tags = util.clone(util.isArray(Tags) ? Tags : [Tags]);\n var xml = util.json2xml({Tagging: {TagSet: {Tag: Tags}}});\n\n var headers = params.Headers;\n headers['Content-Type'] = 'application/xml';\n headers['Content-MD5'] = util.binaryBase64(util.md5(xml));\n\n submitRequest.call(this, {\n Action: 'name/cos:PutBucketTagging',\n method: 'PUT',\n Bucket: params.Bucket,\n Region: params.Region,\n body: xml,\n action: 'tagging',\n headers: headers,\n }, function (err, data) {\n if (err && err.statusCode === 204) {\n return callback(null, {statusCode: err.statusCode});\n } else if (err) {\n return callback(err);\n }\n callback(null, {\n statusCode: data.statusCode,\n headers: data.headers,\n });\n });\n}\n\n/**\n * 获取 Bucket 的标签设置\n * @param {Object} params 参数对象,必须\n * @param {String} params.Bucket Bucket名称,必须\n * @param {String} params.Region 地域名称,必须\n * @param {Function} callback 回调函数,必须\n * @return {Object} err 请求失败的错误,如果请求成功,则为空。https://cloud.tencent.com/document/product/436/7730\n * @return {Object} data 返回数据\n */\nfunction getBucketTagging(params, callback) {\n\n submitRequest.call(this, {\n Action: 'name/cos:GetBucketTagging',\n method: 'GET',\n Bucket: params.Bucket,\n Region: params.Region,\n headers: params.Headers,\n action: 'tagging',\n }, function (err, data) {\n if (err) {\n if (err.statusCode === 404 && err.error && (err.error === \"Not Found\" || err.error.Code === 'NoSuchTagSet')) {\n var result = {\n Tags: [],\n statusCode: err.statusCode,\n };\n err.headers && (result.headers = err.headers);\n callback(null, result);\n } else {\n callback(err);\n }\n return;\n }\n var Tags = [];\n try {\n Tags = data.Tagging.TagSet.Tag || [];\n } catch (e) {\n }\n Tags = util.clone(util.isArray(Tags) ? Tags : [Tags]);\n callback(null, {\n Tags: Tags,\n statusCode: data.statusCode,\n headers: data.headers,\n });\n });\n}\n\n/**\n * 删除 Bucket 的 标签设置\n * @param {Object} params 参数对象,必须\n * @param {String} params.Bucket Bucket名称,必须\n * @param {String} params.Region 地域名称,必须\n * @param {Function} callback 回调函数,必须\n * @return {Object} err 请求失败的错误,如果请求成功,则为空。https://cloud.tencent.com/document/product/436/7730\n * @return {Object} data 返回的数据\n */\nfunction deleteBucketTagging(params, callback) {\n submitRequest.call(this, {\n Action: 'name/cos:DeleteBucketTagging',\n method: 'DELETE',\n Bucket: params.Bucket,\n Region: params.Region,\n headers: params.Headers,\n action: 'tagging',\n }, function (err, data) {\n if (err && err.statusCode === 204) {\n return callback(null, {statusCode: err.statusCode});\n } else if (err) {\n return callback(err);\n }\n callback(null, {\n statusCode: data.statusCode,\n headers: data.headers,\n });\n });\n}\n\nfunction putBucketLifecycle(params, callback) {\n\n var LifecycleConfiguration = params['LifecycleConfiguration'] || {};\n var Rules = LifecycleConfiguration.Rules || params.Rules || [];\n Rules = util.clone(Rules);\n var xml = util.json2xml({LifecycleConfiguration: {Rule: Rules}});\n\n var headers = params.Headers;\n headers['Content-Type'] = 'application/xml';\n headers['Content-MD5'] = util.binaryBase64(util.md5(xml));\n\n submitRequest.call(this, {\n Action: 'name/cos:PutBucketLifecycle',\n method: 'PUT',\n Bucket: params.Bucket,\n Region: params.Region,\n body: xml,\n action: 'lifecycle',\n headers: headers,\n }, function (err, data) {\n if (err && err.statusCode === 204) {\n return callback(null, {statusCode: err.statusCode});\n } else if (err) {\n return callback(err);\n }\n callback(null, {\n statusCode: data.statusCode,\n headers: data.headers,\n });\n });\n}\n\nfunction getBucketLifecycle(params, callback) {\n submitRequest.call(this, {\n Action: 'name/cos:GetBucketLifecycle',\n method: 'GET',\n Bucket: params.Bucket,\n Region: params.Region,\n headers: params.Headers,\n action: 'lifecycle',\n }, function (err, data) {\n if (err) {\n if (err.statusCode === 404 && err.error && err.error.Code === 'NoSuchLifecycleConfiguration') {\n var result = {\n Rules: [],\n statusCode: err.statusCode,\n };\n err.headers && (result.headers = err.headers);\n callback(null, result);\n } else {\n callback(err);\n }\n return;\n }\n var Rules = [];\n try {\n Rules = data.LifecycleConfiguration.Rule || [];\n } catch (e) {\n }\n Rules = util.clone(util.isArray(Rules) ? Rules : [Rules]);\n callback(null, {\n Rules: Rules,\n statusCode: data.statusCode,\n headers: data.headers,\n });\n });\n}\n\nfunction deleteBucketLifecycle(params, callback) {\n submitRequest.call(this, {\n Action: 'name/cos:DeleteBucketLifecycle',\n method: 'DELETE',\n Bucket: params.Bucket,\n Region: params.Region,\n headers: params.Headers,\n action: 'lifecycle',\n }, function (err, data) {\n if (err && err.statusCode === 204) {\n return callback(null, {statusCode: err.statusCode});\n } else if (err) {\n return callback(err);\n }\n callback(null, {\n statusCode: data.statusCode,\n headers: data.headers,\n });\n });\n}\n\nfunction putBucketVersioning(params, callback) {\n\n if (!params['VersioningConfiguration']) {\n callback(util.error(new Error('missing param VersioningConfiguration')));\n return;\n }\n var VersioningConfiguration = params['VersioningConfiguration'] || {};\n var xml = util.json2xml({VersioningConfiguration: VersioningConfiguration});\n\n var headers = params.Headers;\n headers['Content-Type'] = 'application/xml';\n headers['Content-MD5'] = util.binaryBase64(util.md5(xml));\n\n submitRequest.call(this, {\n Action: 'name/cos:PutBucketVersioning',\n method: 'PUT',\n Bucket: params.Bucket,\n Region: params.Region,\n body: xml,\n action: 'versioning',\n headers: headers,\n }, function (err, data) {\n if (err && err.statusCode === 204) {\n return callback(null, {statusCode: err.statusCode});\n } else if (err) {\n return callback(err);\n }\n callback(null, {\n statusCode: data.statusCode,\n headers: data.headers,\n });\n });\n}\n\nfunction getBucketVersioning(params, callback) {\n submitRequest.call(this, {\n Action: 'name/cos:GetBucketVersioning',\n method: 'GET',\n Bucket: params.Bucket,\n Region: params.Region,\n headers: params.Headers,\n action: 'versioning',\n }, function (err, data) {\n if (!err) {\n !data.VersioningConfiguration && (data.VersioningConfiguration = {});\n }\n callback(err, data);\n });\n}\n\nfunction putBucketReplication(params, callback) {\n var ReplicationConfiguration = util.clone(params.ReplicationConfiguration);\n var xml = util.json2xml({ReplicationConfiguration: ReplicationConfiguration});\n xml = xml.replace(/<(\\/?)Rules>/ig, '<$1Rule>');\n xml = xml.replace(/<(\\/?)Tags>/ig, '<$1Tag>');\n\n var headers = params.Headers;\n headers['Content-Type'] = 'application/xml';\n headers['Content-MD5'] = util.binaryBase64(util.md5(xml));\n\n submitRequest.call(this, {\n Action: 'name/cos:PutBucketReplication',\n method: 'PUT',\n Bucket: params.Bucket,\n Region: params.Region,\n body: xml,\n action: 'replication',\n headers: headers,\n }, function (err, data) {\n if (err && err.statusCode === 204) {\n return callback(null, {statusCode: err.statusCode});\n } else if (err) {\n return callback(err);\n }\n callback(null, {\n statusCode: data.statusCode,\n headers: data.headers,\n });\n });\n}\n\nfunction getBucketReplication(params, callback) {\n submitRequest.call(this, {\n Action: 'name/cos:GetBucketReplication',\n method: 'GET',\n Bucket: params.Bucket,\n Region: params.Region,\n headers: params.Headers,\n action: 'replication',\n }, function (err, data) {\n if (err) {\n if (err.statusCode === 404 && err.error && (err.error === 'Not Found' || err.error.Code === 'ReplicationConfigurationnotFoundError')) {\n var result = {\n ReplicationConfiguration: {Rules: []},\n statusCode: err.statusCode,\n };\n err.headers && (result.headers = err.headers);\n callback(null, result);\n } else {\n callback(err);\n }\n return;\n }\n !data.ReplicationConfiguration && (data.ReplicationConfiguration = {});\n if (data.ReplicationConfiguration.Rule) {\n data.ReplicationConfiguration.Rules = util.makeArray(data.ReplicationConfiguration.Rule);\n delete data.ReplicationConfiguration.Rule;\n }\n callback(err, data);\n });\n}\n\nfunction deleteBucketReplication(params, callback) {\n submitRequest.call(this, {\n Action: 'name/cos:DeleteBucketReplication',\n method: 'DELETE',\n Bucket: params.Bucket,\n Region: params.Region,\n headers: params.Headers,\n action: 'replication',\n }, function (err, data) {\n if (err && err.statusCode === 204) {\n return callback(null, {statusCode: err.statusCode});\n } else if (err) {\n return callback(err);\n }\n callback(null, {\n statusCode: data.statusCode,\n headers: data.headers,\n });\n });\n}\n\n/**\n * 设置 Bucket 静态网站配置信息\n * @param {Object} params 参数对象,必须\n * @param {String} params.Bucket Bucket名称,必须\n * @param {String} params.Region 地域名称,必须\n * @param {Object} params.WebsiteConfiguration 地域名称,必须\n * @param {Object} WebsiteConfiguration.IndexDocument 索引文档,必须\n * @param {Object} WebsiteConfiguration.ErrorDocument 错误文档,非必须\n * @param {Object} WebsiteConfiguration.RedirectAllRequestsTo 重定向所有请求,非必须\n * @param {Array} params.RoutingRules 重定向规则,非必须\n * @param {Function} callback 回调函数,必须\n * @return {Object} err 请求失败的错误,如果请求成功,则为空。https://cloud.tencent.com/document/product/436/7730\n * @return {Object} data 返回数据\n */\nfunction putBucketWebsite(params, callback) {\n\n if (!params['WebsiteConfiguration']) {\n callback(util.error(new Error('missing param WebsiteConfiguration')));\n return;\n }\n\n var WebsiteConfiguration = util.clone(params['WebsiteConfiguration'] || {});\n var RoutingRules = WebsiteConfiguration['RoutingRules'] || WebsiteConfiguration['RoutingRule'] || [];\n RoutingRules = util.isArray(RoutingRules) ? RoutingRules : [RoutingRules];\n delete WebsiteConfiguration.RoutingRule;\n delete WebsiteConfiguration.RoutingRules;\n if (RoutingRules.length) WebsiteConfiguration.RoutingRules = { RoutingRule: RoutingRules };\n var xml = util.json2xml({ WebsiteConfiguration: WebsiteConfiguration });\n\n var headers = params.Headers;\n headers['Content-Type'] = 'application/xml';\n headers['Content-MD5'] = util.binaryBase64(util.md5(xml));\n\n submitRequest.call(this, {\n Action: 'name/cos:PutBucketWebsite',\n method: 'PUT',\n Bucket: params.Bucket,\n Region: params.Region,\n body: xml,\n action: 'website',\n headers: headers,\n }, function (err, data) {\n if (err && err.statusCode === 204) {\n return callback(null, {statusCode: err.statusCode});\n } else if (err) {\n return callback(err);\n }\n callback(null, {\n statusCode: data.statusCode,\n headers: data.headers,\n });\n });\n}\n\n/**\n * 获取 Bucket 的静态网站配置信息\n * @param {Object} params 参数对象,必须\n * @param {String} params.Bucket Bucket名称,必须\n * @param {String} params.Region 地域名称,必须\n * @param {Function} callback 回调函数,必须\n * @return {Object} err 请求失败的错误,如果请求成功,则为空。https://cloud.tencent.com/document/product/436/7730\n * @return {Object} data 返回数据\n */\nfunction getBucketWebsite(params, callback) {\n\n submitRequest.call(this, {\n Action: 'name/cos:GetBucketWebsite',\n method: 'GET',\n Bucket: params.Bucket,\n Region: params.Region,\n Key: params.Key,\n headers: params.Headers,\n action: 'website',\n }, function (err, data) {\n if (err) {\n if(err.statusCode === 404 && err.error.Code === 'NoSuchWebsiteConfiguration'){\n var result = {\n WebsiteConfiguration: {},\n statusCode: err.statusCode,\n };\n err.headers && (result.headers = err.headers);\n callback(null, result);\n } else {\n callback(err);\n }\n return;\n }\n\n var WebsiteConfiguration = data.WebsiteConfiguration || {};\n if (WebsiteConfiguration['RoutingRules']) {\n var RoutingRules = util.clone(WebsiteConfiguration['RoutingRules'].RoutingRule || []);\n RoutingRules = util.makeArray(RoutingRules);\n WebsiteConfiguration.RoutingRules = RoutingRules;\n }\n\n callback(null, {\n WebsiteConfiguration: WebsiteConfiguration,\n statusCode: data.statusCode,\n headers: data.headers,\n });\n });\n}\n\n/**\n * 删除 Bucket 的静态网站配置\n * @param {Object} params 参数对象,必须\n * @param {String} params.Bucket Bucket名称,必须\n * @param {String} params.Region 地域名称,必须\n * @param {Function} callback 回调函数,必须\n * @return {Object} err 请求失败的错误,如果请求成功,则为空。https://cloud.tencent.com/document/product/436/7730\n * @return {Object} data 返回数据\n */\nfunction deleteBucketWebsite(params, callback) {\n\n submitRequest.call(this, {\n Action: 'name/cos:DeleteBucketWebsite',\n method: 'DELETE',\n Bucket: params.Bucket,\n Region: params.Region,\n headers: params.Headers,\n action: 'website',\n }, function (err, data) {\n if (err && err.statusCode === 204) {\n return callback(null, {statusCode: err.statusCode});\n } else if (err) {\n return callback(err);\n }\n callback(null, {\n statusCode: data.statusCode,\n headers: data.headers,\n });\n });\n}\n\n/**\n * 设置 Bucket 的防盗链白名单或者黑名单\n * @param {Object} params 参数对象,必须\n * @param {String} params.Bucket Bucket名称,必须\n * @param {String} params.Region 地域名称,必须\n * @param {Object} params.RefererConfiguration 地域名称,必须\n * @param {String} RefererConfiguration.Status 是否开启防盗链,枚举值:Enabled、Disabled\n * @param {String} RefererConfiguration.RefererType 防盗链类型,枚举值:Black-List、White-List,必须\n * @param {Array} RefererConfiguration.DomianList.Domain 生效域名,必须\n * @param {String} RefererConfiguration.EmptyReferConfiguration ,非必须\n * @param {Function} callback 回调函数,必须\n * @return {Object} err 请求失败的错误,如果请求成功,则为空。https://cloud.tencent.com/document/product/436/7730\n * @return {Object} data 返回数据\n */\nfunction putBucketReferer(params, callback) {\n\n if (!params['RefererConfiguration']) {\n callback(util.error(new Error('missing param RefererConfiguration')));\n return;\n }\n\n var RefererConfiguration = util.clone(params['RefererConfiguration'] || {});\n var DomainList = RefererConfiguration['DomainList'] || {};\n var Domains = DomainList['Domains'] || DomainList['Domain'] || [];\n Domains = util.isArray(Domains) ? Domains : [Domains];\n if (Domains.length) RefererConfiguration.DomainList = {Domain: Domains};\n var xml = util.json2xml({ RefererConfiguration: RefererConfiguration });\n\n var headers = params.Headers;\n headers['Content-Type'] = 'application/xml';\n headers['Content-MD5'] = util.binaryBase64(util.md5(xml));\n\n submitRequest.call(this, {\n Action: 'name/cos:PutBucketReferer',\n method: 'PUT',\n Bucket: params.Bucket,\n Region: params.Region,\n body: xml,\n action: 'referer',\n headers: headers,\n }, function (err, data) {\n if (err && err.statusCode === 204) {\n return callback(null, {statusCode: err.statusCode});\n } else if (err) {\n return callback(err);\n }\n callback(null, {\n statusCode: data.statusCode,\n headers: data.headers,\n });\n });\n}\n\n/**\n * 获取 Bucket 的防盗链白名单或者黑名单\n * @param {Object} params 参数对象,必须\n * @param {String} params.Bucket Bucket名称,必须\n * @param {String} params.Region 地域名称,必须\n * @param {Function} callback 回调函数,必须\n * @return {Object} err 请求失败的错误,如果请求成功,则为空。https://cloud.tencent.com/document/product/436/7730\n * @return {Object} data 返回数据\n */\nfunction getBucketReferer(params, callback) {\n\n submitRequest.call(this, {\n Action: 'name/cos:GetBucketReferer',\n method: 'GET',\n Bucket: params.Bucket,\n Region: params.Region,\n Key: params.Key,\n headers: params.Headers,\n action: 'referer',\n }, function (err, data) {\n if (err) {\n if(err.statusCode === 404 && err.error.Code === 'NoSuchRefererConfiguration'){\n var result = {\n WebsiteConfiguration: {},\n statusCode: err.statusCode,\n };\n err.headers && (result.headers = err.headers);\n callback(null, result);\n } else {\n callback(err);\n }\n return;\n }\n\n var RefererConfiguration = data.RefererConfiguration || {};\n if (RefererConfiguration['DomainList']) {\n var Domains = util.makeArray(RefererConfiguration['DomainList'].Domain || []);\n RefererConfiguration.DomainList = {Domains: Domains};\n }\n\n callback(null, {\n RefererConfiguration: RefererConfiguration,\n statusCode: data.statusCode,\n headers: data.headers,\n });\n });\n}\n\n/**\n * 设置 Bucket 自定义域名\n * @param {Object} params 参数对象,必须\n * @param {String} params.Bucket Bucket名称,必须\n * @param {String} params.Region 地域名称,必须\n * @param {Function} callback 回调函数,必须\n * @return {Object} err 请求失败的错误,如果请求成功,则为空。https://cloud.tencent.com/document/product/436/7730\n * @return {Object} data 返回数据\n */\nfunction putBucketDomain(params, callback) {\n\n var DomainConfiguration = params['DomainConfiguration'] || {};\n var DomainRule = DomainConfiguration.DomainRule || params.DomainRule || [];\n DomainRule = util.clone(DomainRule);\n var xml = util.json2xml({DomainConfiguration: {DomainRule: DomainRule}});\n\n var headers = params.Headers;\n headers['Content-Type'] = 'application/xml';\n headers['Content-MD5'] = util.binaryBase64(util.md5(xml));\n\n submitRequest.call(this, {\n Action: 'name/cos:PutBucketDomain',\n method: 'PUT',\n Bucket: params.Bucket,\n Region: params.Region,\n body: xml,\n action: 'domain',\n headers: headers,\n }, function (err, data) {\n if (err && err.statusCode === 204) {\n return callback(null, {statusCode: err.statusCode});\n } else if (err) {\n return callback(err);\n }\n callback(null, {\n statusCode: data.statusCode,\n headers: data.headers,\n });\n });\n}\n\n/**\n * 获取 Bucket 的自定义域名\n * @param {Object} params 参数对象,必须\n * @param {String} params.Bucket Bucket名称,必须\n * @param {String} params.Region 地域名称,必须\n * @param {Function} callback 回调函数,必须\n * @return {Object} err 请求失败的错误,如果请求成功,则为空。https://cloud.tencent.com/document/product/436/7730\n * @return {Object} data 返回数据\n */\nfunction getBucketDomain(params, callback) {\n\n submitRequest.call(this, {\n Action: 'name/cos:GetBucketDomain',\n method: 'GET',\n Bucket: params.Bucket,\n Region: params.Region,\n headers: params.Headers,\n action: 'domain',\n }, function (err, data) {\n if (err) return callback(err);\n\n var DomainRule = [];\n try {\n DomainRule = data.DomainConfiguration.DomainRule || [];\n } catch (e) {\n }\n DomainRule = util.clone(util.isArray(DomainRule) ? DomainRule : [DomainRule]);\n callback(null, {\n DomainRule: DomainRule,\n statusCode: data.statusCode,\n headers: data.headers,\n });\n });\n}\n\n/**\n * 删除 Bucket 自定义域名\n * @param {Object} params 参数对象,必须\n * @param {String} params.Bucket Bucket名称,必须\n * @param {String} params.Region 地域名称,必须\n * @param {Function} callback 回调函数,必须\n * @return {Object} err 请求失败的错误,如果请求成功,则为空。https://cloud.tencent.com/document/product/436/7730\n * @return {Object} data 返回数据\n */\nfunction deleteBucketDomain(params, callback) {\n\n submitRequest.call(this, {\n Action: 'name/cos:DeleteBucketDomain',\n method: 'DELETE',\n Bucket: params.Bucket,\n Region: params.Region,\n headers: params.Headers,\n action: 'domain',\n }, function (err, data) {\n if (err && err.statusCode === 204) {\n return callback(null, {statusCode: err.statusCode});\n } else if (err) {\n return callback(err);\n }\n callback(null, {\n statusCode: data.statusCode,\n headers: data.headers,\n });\n });\n}\n\n/**\n * 设置 Bucket 的回源\n * @param {Object} params 参数对象,必须\n * @param {String} params.Bucket Bucket名称,必须\n * @param {String} params.Region 地域名称,必须\n * @param {Function} callback 回调函数,必须\n * @return {Object} err 请求失败的错误,如果请求成功,则为空。https://cloud.tencent.com/document/product/436/7730\n * @return {Object} data 返回数据\n */\nfunction putBucketOrigin(params, callback){\n var OriginConfiguration = params['OriginConfiguration'] || {};\n var OriginRule = OriginConfiguration.OriginRule || params.OriginRule || [];\n OriginRule = util.clone(OriginRule);\n var xml = util.json2xml({OriginConfiguration: {OriginRule: OriginRule}});\n\n var headers = params.Headers;\n headers['Content-Type'] = 'application/xml';\n headers['Content-MD5'] = util.binaryBase64(util.md5(xml));\n\n submitRequest.call(this, {\n Action: 'name/cos:PutBucketOrigin',\n method: 'PUT',\n Bucket: params.Bucket,\n Region: params.Region,\n body: xml,\n action: 'origin',\n headers: headers,\n }, function (err, data) {\n if (err && err.statusCode === 204) {\n return callback(null, {statusCode: err.statusCode});\n } else if (err) {\n return callback(err);\n }\n callback(null, {\n statusCode: data.statusCode,\n headers: data.headers,\n });\n });\n}\n\n/**\n * 获取 Bucket 的回源\n * @param {Object} params 参数对象,必须\n * @param {String} params.Bucket Bucket名称,必须\n * @param {String} params.Region 地域名称,必须\n * @param {Function} callback 回调函数,必须\n * @return {Object} err 请求失败的错误,如果请求成功,则为空。https://cloud.tencent.com/document/product/436/7730\n * @return {Object} data 返回数据\n */\nfunction getBucketOrigin(params, callback) {\n\n submitRequest.call(this, {\n Action: 'name/cos:GetBucketOrigin',\n method: 'GET',\n Bucket: params.Bucket,\n Region: params.Region,\n headers: params.Headers,\n action: 'origin',\n }, function (err, data) {\n if (err) return callback(err);\n\n var OriginRule = [];\n try {\n OriginRule = data.OriginConfiguration.OriginRule || [];\n } catch (e) {\n }\n OriginRule = util.clone(util.isArray(OriginRule) ? OriginRule : [OriginRule]);\n callback(null, {\n OriginRule: OriginRule,\n statusCode: data.statusCode,\n headers: data.headers,\n });\n });\n}\n\n/**\n * 删除 Bucket 的回源\n * @param {Object} params 参数对象,必须\n * @param {String} params.Bucket Bucket名称,必须\n * @param {String} params.Region 地域名称,必须\n * @param {Function} callback 回调函数,必须\n * @return {Object} err 请求失败的错误,如果请求成功,则为空。https://cloud.tencent.com/document/product/436/7730\n * @return {Object} data 返回数据\n */\nfunction deleteBucketOrigin(params, callback) {\n\n submitRequest.call(this, {\n Action: 'name/cos:DeleteBucketOrigin',\n method: 'DELETE',\n Bucket: params.Bucket,\n Region: params.Region,\n headers: params.Headers,\n action: 'origin',\n }, function (err, data) {\n if (err && err.statusCode === 204) {\n return callback(null, {statusCode: err.statusCode});\n } else if (err) {\n return callback(err);\n }\n callback(null, {\n statusCode: data.statusCode,\n headers: data.headers,\n });\n });\n}\n\n/**\n * 设置 Bucket 的日志记录\n * @param {Object} params 参数对象,必须\n * @param {String} params.Bucket Bucket名称,必须\n * @param {String} params.Region 地域名称,必须\n * @param {(Object|String)} params.BucketLoggingStatus 说明日志记录配置的状态,如果无子节点信息则意为关闭日志记录,必须\n * @param {Function} callback 回调函数,必须\n * @return {Object} err 请求失败的错误,如果请求成功,则为空。https://cloud.tencent.com/document/product/436/7730\n * @return {Object} data 返回数据\n */\nfunction putBucketLogging(params, callback) {\n var xml = util.json2xml({\n BucketLoggingStatus: params['BucketLoggingStatus'] || ''\n });\n\n var headers = params.Headers;\n headers['Content-Type'] = 'application/xml';\n headers['Content-MD5'] = util.binaryBase64(util.md5(xml));\n\n submitRequest.call(this, {\n Action: 'name/cos:PutBucketLogging',\n method: 'PUT',\n Bucket: params.Bucket,\n Region: params.Region,\n body: xml,\n action: 'logging',\n headers: headers,\n }, function (err, data) {\n if (err && err.statusCode === 204) {\n return callback(null, {statusCode: err.statusCode});\n } else if (err) {\n return callback(err);\n }\n callback(null, {\n statusCode: data.statusCode,\n headers: data.headers,\n });\n });\n}\n\n/**\n * 获取 Bucket 的日志记录\n * @param {Object} params 参数对象,必须\n * @param {String} params.Bucket Bucket名称,必须\n * @param {String} params.Region 地域名称,必须\n * @param {Function} callback 回调函数,必须\n * @return {Object} err 请求失败的错误,如果请求成功,则为空。https://cloud.tencent.com/document/product/436/7730\n * @return {Object} data 返回数据\n */\nfunction getBucketLogging(params, callback) {\n submitRequest.call(this, {\n Action: 'name/cos:GetBucketLogging',\n method: 'GET',\n Bucket: params.Bucket,\n Region: params.Region,\n headers: params.Headers,\n action: 'logging',\n }, function (err, data) {\n if (err) return callback(err);\n callback(null, {\n BucketLoggingStatus: data.BucketLoggingStatus,\n statusCode: data.statusCode,\n headers: data.headers,\n });\n });\n}\n\n/**\n * 创建/编辑 Bucket 的清单任务\n * @param {Object} params 参数对象,必须\n * @param {String} params.Bucket Bucket名称,必须\n * @param {String} params.Region 地域名称,必须\n * @param {String} params.Id 清单任务的名称,必须\n * @param {Object} params.InventoryConfiguration 包含清单的配置参数,必须\n * @param {Function} callback 回调函数,必须\n * @return {Object} err 请求失败的错误,如果请求成功,则为空。https://cloud.tencent.com/document/product/436/7730\n * @return {Object} data 返回数据\n */\nfunction putBucketInventory(params, callback) {\n var InventoryConfiguration = util.clone(params['InventoryConfiguration']);\n\n if (InventoryConfiguration.OptionalFields) {\n var Field = InventoryConfiguration.OptionalFields || [];\n InventoryConfiguration.OptionalFields = {\n Field: Field\n };\n }\n\n if (InventoryConfiguration.Destination\n && InventoryConfiguration.Destination.COSBucketDestination\n && InventoryConfiguration.Destination.COSBucketDestination.Encryption\n ) {\n var Encryption = InventoryConfiguration.Destination.COSBucketDestination.Encryption;\n if (Object.keys(Encryption).indexOf('SSECOS') > -1) {\n Encryption['SSE-COS'] = Encryption['SSECOS'];\n delete Encryption['SSECOS'];\n }\n }\n\n var xml = util.json2xml({\n InventoryConfiguration: InventoryConfiguration\n });\n\n var headers = params.Headers;\n headers['Content-Type'] = 'application/xml';\n headers['Content-MD5'] = util.binaryBase64(util.md5(xml));\n\n submitRequest.call(this, {\n Action: 'name/cos:PutBucketInventory',\n method: 'PUT',\n Bucket: params.Bucket,\n Region: params.Region,\n body: xml,\n action: 'inventory',\n qs: {\n id: params['Id']\n },\n headers: headers,\n }, function (err, data) {\n if (err && err.statusCode === 204) {\n return callback(null, {statusCode: err.statusCode});\n } else if (err) {\n return callback(err);\n }\n callback(null, {\n statusCode: data.statusCode,\n headers: data.headers,\n });\n });\n}\n\n/**\n * 获取 Bucket 的清单任务信息\n * @param {Object} params 参数对象,必须\n * @param {String} params.Bucket Bucket名称,必须\n * @param {String} params.Region 地域名称,必须\n * @param {String} params.Id 清单任务的名称,必须\n * @param {Function} callback 回调函数,必须\n * @return {Object} err 请求失败的错误,如果请求成功,则为空。https://cloud.tencent.com/document/product/436/7730\n * @return {Object} data 返回数据\n */\nfunction getBucketInventory(params, callback) {\n submitRequest.call(this, {\n Action: 'name/cos:GetBucketInventory',\n method: 'GET',\n Bucket: params.Bucket,\n Region: params.Region,\n headers: params.Headers,\n action: 'inventory',\n qs: {\n id: params['Id']\n }\n }, function (err, data) {\n if (err) return callback(err);\n\n var InventoryConfiguration = data['InventoryConfiguration'];\n if (InventoryConfiguration && InventoryConfiguration.OptionalFields && InventoryConfiguration.OptionalFields.Field) {\n var Field = InventoryConfiguration.OptionalFields.Field;\n if (!util.isArray(Field)) {\n Field = [Field];\n }\n InventoryConfiguration.OptionalFields = Field;\n }\n if (InventoryConfiguration.Destination\n && InventoryConfiguration.Destination.COSBucketDestination\n && InventoryConfiguration.Destination.COSBucketDestination.Encryption\n ) {\n var Encryption = InventoryConfiguration.Destination.COSBucketDestination.Encryption;\n if (Object.keys(Encryption).indexOf('SSE-COS') > -1) {\n Encryption['SSECOS'] = Encryption['SSE-COS'];\n delete Encryption['SSE-COS'];\n }\n }\n\n callback(null, {\n InventoryConfiguration: InventoryConfiguration,\n statusCode: data.statusCode,\n headers: data.headers,\n });\n });\n}\n\n/**\n * 获取 Bucket 的清单任务信息\n * @param {Object} params 参数对象,必须\n * @param {String} params.Bucket Bucket名称,必须\n * @param {String} params.Region 地域名称,必须\n * @param {String} params.ContinuationToken 当 COS 响应体中 IsTruncated 为 true,且 NextContinuationToken 节点中存在参数值时,您可以将这个参数作为 continuation-token 参数值,以获取下一页的清单任务信息,非必须\n * @param {Function} callback 回调函数,必须\n * @return {Object} err 请求失败的错误,如果请求成功,则为空。https://cloud.tencent.com/document/product/436/7730\n * @return {Object} data 返回数据\n */\nfunction listBucketInventory(params, callback) {\n submitRequest.call(this, {\n Action: 'name/cos:ListBucketInventory',\n method: 'GET',\n Bucket: params.Bucket,\n Region: params.Region,\n headers: params.Headers,\n action: 'inventory',\n qs: {\n 'continuation-token': params['ContinuationToken']\n }\n }, function (err, data) {\n if (err) return callback(err);\n var ListInventoryConfigurationResult = data['ListInventoryConfigurationResult'];\n var InventoryConfigurations = ListInventoryConfigurationResult.InventoryConfiguration || [];\n InventoryConfigurations = util.isArray(InventoryConfigurations) ? InventoryConfigurations : [InventoryConfigurations];\n delete ListInventoryConfigurationResult['InventoryConfiguration'];\n util.each(InventoryConfigurations, function (InventoryConfiguration) {\n if (InventoryConfiguration && InventoryConfiguration.OptionalFields && InventoryConfiguration.OptionalFields.Field) {\n var Field = InventoryConfiguration.OptionalFields.Field;\n if (!util.isArray(Field)) {\n Field = [Field];\n }\n InventoryConfiguration.OptionalFields = Field;\n }\n\n if (InventoryConfiguration.Destination\n && InventoryConfiguration.Destination.COSBucketDestination\n && InventoryConfiguration.Destination.COSBucketDestination.Encryption\n ) {\n var Encryption = InventoryConfiguration.Destination.COSBucketDestination.Encryption;\n if (Object.keys(Encryption).indexOf('SSE-COS') > -1) {\n Encryption['SSECOS'] = Encryption['SSE-COS'];\n delete Encryption['SSE-COS'];\n }\n }\n });\n ListInventoryConfigurationResult.InventoryConfigurations = InventoryConfigurations;\n util.extend(ListInventoryConfigurationResult, {\n statusCode: data.statusCode,\n headers: data.headers,\n });\n callback(null, ListInventoryConfigurationResult);\n });\n}\n\n/**\n * 删除 Bucket 的清单任务\n * @param {Object} params 参数对象,必须\n * @param {String} params.Bucket Bucket名称,必须\n * @param {String} params.Region 地域名称,必须\n * @param {String} params.Id 清单任务的名称,必须\n * @param {Function} callback 回调函数,必须\n * @return {Object} err 请求失败的错误,如果请求成功,则为空。https://cloud.tencent.com/document/product/436/7730\n * @return {Object} data 返回数据\n */\nfunction deleteBucketInventory(params, callback) {\n submitRequest.call(this, {\n Action: 'name/cos:DeleteBucketInventory',\n method: 'DELETE',\n Bucket: params.Bucket,\n Region: params.Region,\n headers: params.Headers,\n action: 'inventory',\n qs: {\n id: params['Id']\n }\n }, function (err, data) {\n if (err && err.statusCode === 204) {\n return callback(null, {statusCode: err.statusCode});\n } else if (err) {\n return callback(err);\n }\n callback(null, {\n statusCode: data.statusCode,\n headers: data.headers,\n });\n });\n}\n\n/* 全球加速 */\nfunction putBucketAccelerate(params, callback) {\n\n if (!params['AccelerateConfiguration']) {\n callback(util.error(new Error('missing param AccelerateConfiguration')));\n return;\n }\n\n var configuration = { AccelerateConfiguration: params.AccelerateConfiguration || {} };\n\n var xml = util.json2xml(configuration);\n\n var headers = {};\n headers['Content-Type'] = 'application/xml';\n headers['Content-MD5'] = util.binaryBase64(util.md5(xml));\n\n submitRequest.call(this, {\n Action: 'name/cos:PutBucketAccelerate',\n method: 'PUT',\n Bucket: params.Bucket,\n Region: params.Region,\n body: xml,\n action: 'accelerate',\n headers: headers,\n }, function (err, data) {\n if (err) return callback(err);\n callback(null, {\n statusCode: data.statusCode,\n headers: data.headers,\n });\n });\n}\n\nfunction getBucketAccelerate(params, callback) {\n submitRequest.call(this, {\n Action: 'name/cos:GetBucketAccelerate',\n method: 'GET',\n Bucket: params.Bucket,\n Region: params.Region,\n action: 'accelerate',\n }, function (err, data) {\n if (!err) {\n !data.AccelerateConfiguration && (data.AccelerateConfiguration = {});\n }\n callback(err, data);\n });\n}\n\nfunction putBucketEncryption(params, callback) {\n var conf = params.ServerSideEncryptionConfiguration || {};\n var Rules = conf.Rule || conf.Rules || [];\n var xml = util.json2xml({ServerSideEncryptionConfiguration: {Rule:Rules}});\n\n var headers = params.Headers;\n headers['Content-Type'] = 'application/xml';\n headers['Content-MD5'] = util.binaryBase64(util.md5(xml));\n\n submitRequest.call(this, {\n Action: 'name/cos:PutBucketEncryption',\n method: 'PUT',\n Bucket: params.Bucket,\n Region: params.Region,\n body: xml,\n action: 'encryption',\n headers: headers,\n }, function (err, data) {\n if (err && err.statusCode === 204) {\n return callback(null, {statusCode: err.statusCode});\n } else if (err) {\n return callback(err);\n }\n callback(null, {\n statusCode: data.statusCode,\n headers: data.headers,\n });\n });\n}\n\nfunction getBucketEncryption(params, callback) {\n submitRequest.call(this, {\n Action: 'name/cos:GetBucketEncryption',\n method: 'GET',\n Bucket: params.Bucket,\n Region: params.Region,\n headers: params.Headers,\n action: 'encryption',\n }, function (err, data) {\n if (err) {\n if (err.statusCode === 404 && err.code === 'NoSuchEncryptionConfiguration') {\n var result = {\n EncryptionConfiguration: {Rules: []},\n statusCode: err.statusCode,\n };\n err.headers && (result.headers = err.headers);\n callback(null, result);\n } else {\n callback(err);\n }\n return;\n }\n var Rules = util.makeArray(data.EncryptionConfiguration && data.EncryptionConfiguration.Rule || []);\n data.EncryptionConfiguration = {Rules: Rules};\n callback(err, data);\n });\n}\n\nfunction deleteBucketEncryption(params, callback) {\n submitRequest.call(this, {\n Action: 'name/cos:DeleteBucketReplication',\n method: 'DELETE',\n Bucket: params.Bucket,\n Region: params.Region,\n headers: params.Headers,\n action: 'encryption',\n }, function (err, data) {\n if (err && err.statusCode === 204) {\n return callback(null, {statusCode: err.statusCode});\n } else if (err) {\n return callback(err);\n }\n callback(null, {\n statusCode: data.statusCode,\n headers: data.headers,\n });\n });\n}\n\n// Object 相关\n\n/**\n * 取回对应Object的元数据,Head的权限与Get的权限一致\n * @param {Object} params 参数对象,必须\n * @param {String} params.Bucket Bucket名称,必须\n * @param {String} params.Region 地域名称,必须\n * @param {String} params.Key 文件名称,必须\n * @param {String} params.IfModifiedSince 当Object在指定时间后被修改,则返回对应Object元信息,否则返回304,非必须\n * @param {Function} callback 回调函数,必须\n * @return {Object} err 请求失败的错误,如果请求成功,则为空。https://cloud.tencent.com/document/product/436/7730\n * @return {Object} data 为指定 object 的元数据,如果设置了 IfModifiedSince ,且文件未修改,则返回一个对象,NotModified 属性为 true\n * @return {Boolean} data.NotModified 是否在 IfModifiedSince 时间点之后未修改该 object,则为 true\n */\nfunction headObject(params, callback) {\n submitRequest.call(this, {\n Action: 'name/cos:HeadObject',\n method: 'HEAD',\n Bucket: params.Bucket,\n Region: params.Region,\n Key: params.Key,\n VersionId: params.VersionId,\n headers: params.Headers,\n }, function (err, data) {\n if (err) {\n var statusCode = err.statusCode;\n if (params.Headers['If-Modified-Since'] && statusCode && statusCode === 304) {\n return callback(null, {\n NotModified: true,\n statusCode: statusCode,\n });\n }\n return callback(err);\n }\n data.ETag = util.attr(data.headers, 'etag', '');\n callback(null, data);\n });\n}\n\n\nfunction listObjectVersions(params, callback) {\n var reqParams = {};\n reqParams['prefix'] = params['Prefix'] || '';\n reqParams['delimiter'] = params['Delimiter'];\n reqParams['key-marker'] = params['KeyMarker'];\n reqParams['version-id-marker'] = params['VersionIdMarker'];\n reqParams['max-keys'] = params['MaxKeys'];\n reqParams['encoding-type'] = params['EncodingType'];\n\n submitRequest.call(this, {\n Action: 'name/cos:GetBucketObjectVersions',\n ResourceKey: reqParams['prefix'],\n method: 'GET',\n Bucket: params.Bucket,\n Region: params.Region,\n headers: params.Headers,\n qs: reqParams,\n action: 'versions',\n }, function (err, data) {\n if (err) return callback(err);\n var ListVersionsResult = data.ListVersionsResult || {};\n var DeleteMarkers = ListVersionsResult.DeleteMarker || [];\n DeleteMarkers = util.isArray(DeleteMarkers) ? DeleteMarkers : [DeleteMarkers];\n var Versions = ListVersionsResult.Version || [];\n Versions = util.isArray(Versions) ? Versions : [Versions];\n\n var result = util.clone(ListVersionsResult);\n delete result.DeleteMarker;\n delete result.Version;\n util.extend(result, {\n DeleteMarkers: DeleteMarkers,\n Versions: Versions,\n statusCode: data.statusCode,\n headers: data.headers,\n });\n\n callback(null, result);\n });\n}\n\n/**\n * 下载 object\n * @param {Object} params 参数对象,必须\n * @param {String} params.Bucket Bucket名称,必须\n * @param {String} params.Region 地域名称,必须\n * @param {String} params.Key 文件名称,必须\n * @param {WriteStream} params.Output 文件写入流,非必须\n * @param {String} params.IfModifiedSince 当Object在指定时间后被修改,则返回对应Object元信息,否则返回304,非必须\n * @param {String} params.IfUnmodifiedSince 如果文件修改时间早于或等于指定时间,才返回文件内容。否则返回 412 (precondition failed),非必须\n * @param {String} params.IfMatch 当 ETag 与指定的内容一致,才返回文件。否则返回 412 (precondition failed),非必须\n * @param {String} params.IfNoneMatch 当 ETag 与指定的内容不一致,才返回文件。否则返回304 (not modified),非必须\n * @param {String} params.ResponseContentType 设置返回头部中的 Content-Type 参数,非必须\n * @param {String} params.ResponseContentLanguage 设置返回头部中的 Content-Language 参数,非必须\n * @param {String} params.ResponseExpires 设置返回头部中的 Content-Expires 参数,非必须\n * @param {String} params.ResponseCacheControl 设置返回头部中的 Cache-Control 参数,非必须\n * @param {String} params.ResponseContentDisposition 设置返回头部中的 Content-Disposition 参数,非必须\n * @param {String} params.ResponseContentEncoding 设置返回头部中的 Content-Encoding 参数,非必须\n * @param {Function} callback 回调函数,必须\n * @param {Object} err 请求失败的错误,如果请求成功,则为空。https://cloud.tencent.com/document/product/436/7730\n * @param {Object} data 为对应的 object 数据,包括 body 和 headers\n */\nfunction getObject(params, callback) {\n var reqParams = params.Query || {};\n var reqParamsStr = params.QueryString || '';\n var onProgress = util.throttleOnProgress.call(this, 0, params.onProgress);\n\n reqParams['response-content-type'] = params['ResponseContentType'];\n reqParams['response-content-language'] = params['ResponseContentLanguage'];\n reqParams['response-expires'] = params['ResponseExpires'];\n reqParams['response-cache-control'] = params['ResponseCacheControl'];\n reqParams['response-content-disposition'] = params['ResponseContentDisposition'];\n reqParams['response-content-encoding'] = params['ResponseContentEncoding'];\n\n // 如果用户自己传入了 output\n submitRequest.call(this, {\n Action: 'name/cos:GetObject',\n method: 'GET',\n Bucket: params.Bucket,\n Region: params.Region,\n Key: params.Key,\n VersionId: params.VersionId,\n DataType: params.DataType,\n headers: params.Headers,\n qs: reqParams,\n qsStr: reqParamsStr,\n rawBody: true,\n onDownloadProgress: onProgress,\n }, function (err, data) {\n onProgress(null, true);\n if (err) {\n var statusCode = err.statusCode;\n if (params.Headers['If-Modified-Since'] && statusCode && statusCode === 304) {\n return callback(null, {\n NotModified: true\n });\n }\n return callback(err);\n }\n callback(null, {\n Body: data.body,\n ETag: util.attr(data.headers, 'etag', ''),\n statusCode: data.statusCode,\n headers: data.headers,\n });\n });\n\n}\n\n/**\n * 上传 object\n * @param {Object} params 参数对象,必须\n * @param {String} params.Bucket Bucket名称,必须\n * @param {String} params.Region 地域名称,必须\n * @param {String} params.Key 文件名称,必须\n * @param {File || Blob || String} params.Body 上传文件对象或字符串,必须\n * @param {String} params.CacheControl RFC 2616 中定义的缓存策略,将作为 Object 元数据保存,非必须\n * @param {String} params.ContentDisposition RFC 2616 中定义的文件名称,将作为 Object 元数据保存,非必须\n * @param {String} params.ContentEncoding RFC 2616 中定义的编码格式,将作为 Object 元数据保存,非必须\n * @param {String} params.ContentLength RFC 2616 中定义的 HTTP 请求内容长度(字节),必须\n * @param {String} params.ContentType RFC 2616 中定义的内容类型(MIME),将作为 Object 元数据保存,非必须\n * @param {String} params.Expect 当使用 Expect: 100-continue 时,在收到服务端确认后,才会发送请求内容,非必须\n * @param {String} params.Expires RFC 2616 中定义的过期时间,将作为 Object 元数据保存,非必须\n * @param {String} params.ACL 允许用户自定义文件权限,有效值:private | public-read,非必须\n * @param {String} params.GrantRead 赋予被授权者读取对象的权限,格式:id=\"[OwnerUin]\",可使用半角逗号(,)分隔多组被授权者,非必须\n * @param {String} params.GrantReadAcp 赋予被授权者读取对象的访问控制列表(ACL)的权限,格式:id=\"[OwnerUin]\",可使用半角逗号(,)分隔多组被授权者,非必须\n * @param {String} params.GrantWriteAcp 赋予被授权者写入对象的访问控制列表(ACL)的权限,格式:id=\"[OwnerUin]\",可使用半角逗号(,)分隔多组被授权者,非必须\n * @param {String} params.GrantFullControl 赋予被授权者操作对象的所有权限,格式:id=\"[OwnerUin]\",可使用半角逗号(,)分隔多组被授权者,非必须\n * @param {String} params.StorageClass 设置对象的存储级别,枚举值:STANDARD、STANDARD_IA、ARCHIVE,默认值:STANDARD,非必须\n * @param {String} params.x-cos-meta-* 允许用户自定义的头部信息,将作为对象的元数据保存。大小限制2KB,非必须\n * @param {String} params.ContentSha1 RFC 3174 中定义的 160-bit 内容 SHA-1 算法校验,非必须\n * @param {String} params.ServerSideEncryption 支持按照指定的加密算法进行服务端数据加密,格式 x-cos-server-side-encryption: \"AES256\",非必须\n * @param {Function} params.onProgress 上传进度回调函数\n * @param {Function} callback 回调函数,必须\n * @return {Object} err 请求失败的错误,如果请求成功,则为空。https://cloud.tencent.com/document/product/436/7730\n * @return {Object} data 为对应的 object 数据\n * @return {String} data.ETag 为对应上传文件的 ETag 值\n */\nfunction putObject(params, callback) {\n var self = this;\n var FileSize = params.ContentLength;\n var onProgress = util.throttleOnProgress.call(self, FileSize, params.onProgress);\n\n // 特殊处理 Cache-Control、Content-Type,避免代理更改这两个字段导致写入到 Object 属性里\n var headers = params.Headers;\n if (!headers['Cache-Control'] && !headers['cache-control']) headers['Cache-Control'] = '';\n if (!headers['Content-Type'] && !headers['content-type']) headers['Content-Type'] = params.Body && params.Body.type || '';\n var needCalcMd5 = params.UploadAddMetaMd5 || self.options.UploadAddMetaMd5 || self.options.UploadCheckContentMd5;\n util.getBodyMd5(needCalcMd5, params.Body, function (md5) {\n if (md5) {\n if (self.options.UploadCheckContentMd5) headers['Content-MD5'] = util.binaryBase64(md5);\n if (params.UploadAddMetaMd5 || self.options.UploadAddMetaMd5) headers['x-cos-meta-md5'] = md5;\n }\n if (params.ContentLength !== undefined) headers['Content-Length'] = params.ContentLength;\n onProgress(null, true); // 任务状态开始 uploading\n submitRequest.call(self, {\n Action: 'name/cos:PutObject',\n TaskId: params.TaskId,\n method: 'PUT',\n Bucket: params.Bucket,\n Region: params.Region,\n Key: params.Key,\n headers: params.Headers,\n qs: params.Query,\n body: params.Body,\n onProgress: onProgress,\n }, function (err, data) {\n if (err) {\n onProgress(null, true);\n return callback(err);\n }\n onProgress({loaded: FileSize, total: FileSize}, true);\n var url = getUrl({\n ForcePathStyle: self.options.ForcePathStyle,\n protocol: self.options.Protocol,\n domain: self.options.Domain,\n bucket: params.Bucket,\n region: !self.options.UseAccelerate ? params.Region : 'accelerate',\n object: params.Key,\n });\n url = url.substr(url.indexOf('://') + 3);\n data.Location = url;\n data.ETag = util.attr(data.headers, 'etag', '');\n callback(null, data);\n });\n }, params.onHashProgress);\n}\n\n/**\n * 删除 object\n * @param {Object} params 参数对象,必须\n * @param {String} params.Bucket Bucket名称,必须\n * @param {String} params.Region 地域名称,必须\n * @param {String} params.Key object名称,必须\n * @param {Function} callback 回调函数,必须\n * @param {Object} err 请求失败的错误,如果请求成功,则为空。https://cloud.tencent.com/document/product/436/7730\n * @param {Object} data 删除操作成功之后返回的数据\n */\nfunction deleteObject(params, callback) {\n submitRequest.call(this, {\n Action: 'name/cos:DeleteObject',\n method: 'DELETE',\n Bucket: params.Bucket,\n Region: params.Region,\n Key: params.Key,\n headers: params.Headers,\n VersionId: params.VersionId,\n action: params.Recursive ? 'recursive' : '',\n }, function (err, data) {\n if (err) {\n var statusCode = err.statusCode;\n if (statusCode && statusCode === 404) {\n return callback(null, {BucketNotFound: true, statusCode: statusCode,});\n } else {\n return callback(err);\n }\n }\n callback(null, {\n statusCode: data.statusCode,\n headers: data.headers,\n });\n });\n}\n\n/**\n * 获取 object 的 权限列表\n * @param {Object} params 参数对象,必须\n * @param {String} params.Bucket Bucket名称,必须\n * @param {String} params.Region 地域名称,必须\n * @param {String} params.Key object名称,必须\n * @param {Function} callback 回调函数,必须\n * @return {Object} err 请求失败的错误,如果请求成功,则为空。https://cloud.tencent.com/document/product/436/7730\n * @return {Object} data 返回的数据\n * @return {Object} data.AccessControlPolicy 权限列表\n */\nfunction getObjectAcl(params, callback) {\n\n submitRequest.call(this, {\n Action: 'name/cos:GetObjectACL',\n method: 'GET',\n Bucket: params.Bucket,\n Region: params.Region,\n Key: params.Key,\n headers: params.Headers,\n action: 'acl',\n }, function (err, data) {\n if (err) return callback(err);\n var AccessControlPolicy = data.AccessControlPolicy || {};\n var Owner = AccessControlPolicy.Owner || {};\n var Grant = AccessControlPolicy.AccessControlList && AccessControlPolicy.AccessControlList.Grant || [];\n Grant = util.isArray(Grant) ? Grant : [Grant];\n var result = decodeAcl(AccessControlPolicy);\n delete result.GrantWrite;\n if (data.headers && data.headers['x-cos-acl']) {\n result.ACL = data.headers['x-cos-acl'];\n }\n result = util.extend(result, {\n Owner: Owner,\n Grants: Grant,\n statusCode: data.statusCode,\n headers: data.headers,\n });\n callback(null, result);\n });\n}\n\n/**\n * 设置 object 的 权限列表\n * @param {Object} params 参数对象,必须\n * @param {String} params.Bucket Bucket名称,必须\n * @param {String} params.Region 地域名称,必须\n * @param {String} params.Key object名称,必须\n * @param {Function} callback 回调函数,必须\n * @return {Object} err 请求失败的错误,如果请求成功,则为空。https://cloud.tencent.com/document/product/436/7730\n * @return {Object} data 返回的数据\n */\nfunction putObjectAcl(params, callback) {\n var headers = params.Headers;\n\n var xml = '';\n if (params['AccessControlPolicy']) {\n var AccessControlPolicy = util.clone(params['AccessControlPolicy'] || {});\n var Grants = AccessControlPolicy.Grants || AccessControlPolicy.Grant;\n Grants = util.isArray(Grants) ? Grants : [Grants];\n delete AccessControlPolicy.Grant;\n delete AccessControlPolicy.Grants;\n AccessControlPolicy.AccessControlList = {Grant: Grants};\n xml = util.json2xml({AccessControlPolicy: AccessControlPolicy});\n\n headers['Content-Type'] = 'application/xml';\n headers['Content-MD5'] = util.binaryBase64(util.md5(xml));\n }\n\n // Grant Header 去重\n util.each(headers, function (val, key) {\n if (key.indexOf('x-cos-grant-') === 0) {\n headers[key] = uniqGrant(headers[key]);\n }\n });\n\n submitRequest.call(this, {\n Action: 'name/cos:PutObjectACL',\n method: 'PUT',\n Bucket: params.Bucket,\n Region: params.Region,\n Key: params.Key,\n action: 'acl',\n headers: headers,\n body: xml,\n }, function (err, data) {\n if (err) return callback(err);\n callback(null, {\n statusCode: data.statusCode,\n headers: data.headers,\n });\n });\n}\n\n/**\n * Options Object请求实现跨域访问的预请求。即发出一个 OPTIONS 请求给服务器以确认是否可以进行跨域操作。\n * @param {Object} params 参数对象,必须\n * @param {String} params.Bucket Bucket名称,必须\n * @param {String} params.Region 地域名称,必须\n * @param {String} params.Key object名称,必须\n * @param {Function} callback 回调函数,必须\n * @return {Object} err 请求失败的错误,如果请求成功,则为空。https://cloud.tencent.com/document/product/436/7730\n * @return {Object} data 返回的数据\n */\nfunction optionsObject(params, callback) {\n\n var headers = params.Headers;\n headers['Origin'] = params['Origin'];\n headers['Access-Control-Request-Method'] = params['AccessControlRequestMethod'];\n headers['Access-Control-Request-Headers'] = params['AccessControlRequestHeaders'];\n\n submitRequest.call(this, {\n Action: 'name/cos:OptionsObject',\n method: 'OPTIONS',\n Bucket: params.Bucket,\n Region: params.Region,\n Key: params.Key,\n headers: headers,\n }, function (err, data) {\n if (err) {\n if (err.statusCode && err.statusCode === 403) {\n return callback(null, {\n OptionsForbidden: true,\n statusCode: err.statusCode\n });\n }\n return callback(err);\n }\n\n var headers = data.headers || {};\n callback(null, {\n AccessControlAllowOrigin: headers['access-control-allow-origin'],\n AccessControlAllowMethods: headers['access-control-allow-methods'],\n AccessControlAllowHeaders: headers['access-control-allow-headers'],\n AccessControlExposeHeaders: headers['access-control-expose-headers'],\n AccessControlMaxAge: headers['access-control-max-age'],\n statusCode: data.statusCode,\n headers: data.headers,\n });\n });\n}\n\n/**\n * @param {Object} 参数列表\n * @param {String} Bucket Bucket 名称\n * @param {String} Region 地域名称\n * @param {String} Key 文件名称\n * @param {String} CopySource 源文件URL绝对路径,可以通过versionid子资源指定历史版本\n * @param {String} ACL 允许用户自定义文件权限。有效值:private,public-read默认值:private。\n * @param {String} GrantRead 赋予被授权者读的权限,格式 x-cos-grant-read: uin=\" \",uin=\" \",当需要给子账户授权时,uin=\"RootAcountID/SubAccountID\",当需要给根账户授权时,uin=\"RootAcountID\"。\n * @param {String} GrantWrite 赋予被授权者写的权限,格式 x-cos-grant-write: uin=\" \",uin=\" \",当需要给子账户授权时,uin=\"RootAcountID/SubAccountID\",当需要给根账户授权时,uin=\"RootAcountID\"。\n * @param {String} GrantFullControl 赋予被授权者读写权限,格式 x-cos-grant-full-control: uin=\" \",uin=\" \",当需要给子账户授权时,uin=\"RootAcountID/SubAccountID\",当需要给根账户授权时,uin=\"RootAcountID\"。\n * @param {String} MetadataDirective 是否拷贝元数据,枚举值:Copy, Replaced,默认值Copy。假如标记为Copy,忽略Header中的用户元数据信息直接复制;假如标记为Replaced,按Header信息修改元数据。当目标路径和原路径一致,即用户试图修改元数据时,必须为Replaced\n * @param {String} CopySourceIfModifiedSince 当Object在指定时间后被修改,则执行操作,否则返回412。可与x-cos-copy-source-If-None-Match一起使用,与其他条件联合使用返回冲突。\n * @param {String} CopySourceIfUnmodifiedSince 当Object在指定时间后未被修改,则执行操作,否则返回412。可与x-cos-copy-source-If-Match一起使用,与其他条件联合使用返回冲突。\n * @param {String} CopySourceIfMatch 当Object的ETag和给定一致时,则执行操作,否则返回412。可与x-cos-copy-source-If-Unmodified-Since一起使用,与其他条件联合使用返回冲突。\n * @param {String} CopySourceIfNoneMatch 当Object的ETag和给定不一致时,则执行操作,否则返回412。可与x-cos-copy-source-If-Modified-Since一起使用,与其他条件联合使用返回冲突。\n * @param {String} StorageClass 存储级别,枚举值:存储级别,枚举值:Standard, Standard_IA,Archive;默认值:Standard\n * @param {String} CacheControl 指定所有缓存机制在整个请求/响应链中必须服从的指令。\n * @param {String} ContentDisposition MIME 协议的扩展,MIME 协议指示 MIME 用户代理如何显示附加的文件\n * @param {String} ContentEncoding HTTP 中用来对「采用何种编码格式传输正文」进行协定的一对头部字段\n * @param {String} ContentLength 设置响应消息的实体内容的大小,单位为字节\n * @param {String} ContentType RFC 2616 中定义的 HTTP 请求内容类型(MIME),例如text/plain\n * @param {String} Expect 请求的特定的服务器行为\n * @param {String} Expires 响应过期的日期和时间\n * @param {String} params.ServerSideEncryption 支持按照指定的加密算法进行服务端数据加密,格式 x-cos-server-side-encryption: \"AES256\",非必须\n * @param {String} ContentLanguage 指定内容语言\n * @param {String} x-cos-meta-* 允许用户自定义的头部信息,将作为 Object 元数据返回。大小限制2K。\n */\nfunction putObjectCopy(params, callback) {\n\n // 特殊处理 Cache-Control\n var self = this;\n var headers = params.Headers;\n if (!headers['Cache-Control'] && !headers['cache-control']) headers['Cache-Control'] = '';\n\n var CopySource = params.CopySource || '';\n var m = util.getSourceParams.call(this, CopySource);\n if (!m) {\n callback(util.error(new Error('CopySource format error')));\n return;\n }\n\n var SourceBucket = m[1];\n var SourceRegion = m[3];\n var SourceKey = decodeURIComponent(m[4]);\n\n submitRequest.call(this, {\n Scope: [{\n action: 'name/cos:GetObject',\n bucket: SourceBucket,\n region: SourceRegion,\n prefix: SourceKey,\n }, {\n action: 'name/cos:PutObject',\n bucket: params.Bucket,\n region: params.Region,\n prefix: params.Key,\n }],\n method: 'PUT',\n Bucket: params.Bucket,\n Region: params.Region,\n Key: params.Key,\n VersionId: params.VersionId,\n headers: params.Headers,\n }, function (err, data) {\n if (err) return callback(err);\n var result = util.clone(data.CopyObjectResult || {});\n var url = getUrl({\n ForcePathStyle: self.options.ForcePathStyle,\n protocol: self.options.Protocol,\n domain: self.options.Domain,\n bucket: params.Bucket,\n region: params.Region,\n object: params.Key,\n isLocation: true,\n });\n util.extend(result, {\n Location: url,\n statusCode: data.statusCode,\n headers: data.headers,\n });\n callback(null, result);\n });\n}\n\nfunction uploadPartCopy(params, callback) {\n\n var CopySource = params.CopySource || '';\n var m = util.getSourceParams.call(this, CopySource);\n if (!m) {\n callback(util.error(new Error('CopySource format error')));\n return;\n }\n\n var SourceBucket = m[1];\n var SourceRegion = m[3];\n var SourceKey = decodeURIComponent(m[4]);\n\n submitRequest.call(this, {\n Scope: [{\n action: 'name/cos:GetObject',\n bucket: SourceBucket,\n region: SourceRegion,\n prefix: SourceKey,\n }, {\n action: 'name/cos:PutObject',\n bucket: params.Bucket,\n region: params.Region,\n prefix: params.Key,\n }],\n method: 'PUT',\n Bucket: params.Bucket,\n Region: params.Region,\n Key: params.Key,\n VersionId: params.VersionId,\n qs: {\n partNumber: params['PartNumber'],\n uploadId: params['UploadId'],\n },\n headers: params.Headers,\n }, function (err, data) {\n if (err) return callback(err);\n var result = util.clone(data.CopyPartResult || {});\n util.extend(result, {\n statusCode: data.statusCode,\n headers: data.headers,\n });\n callback(null, result);\n });\n}\n\nfunction deleteMultipleObject(params, callback) {\n var Objects = params.Objects || [];\n var Quiet = params.Quiet;\n Objects = util.isArray(Objects) ? Objects : [Objects];\n\n var xml = util.json2xml({Delete: {Object: Objects, Quiet: Quiet || false}});\n\n var headers = params.Headers;\n headers['Content-Type'] = 'application/xml';\n headers['Content-MD5'] = util.binaryBase64(util.md5(xml));\n\n var Scope = util.map(Objects, function (v) {\n return {\n action: 'name/cos:DeleteObject',\n bucket: params.Bucket,\n region: params.Region,\n prefix: v.Key,\n };\n });\n\n submitRequest.call(this, {\n Scope: Scope,\n method: 'POST',\n Bucket: params.Bucket,\n Region: params.Region,\n body: xml,\n action: 'delete',\n headers: headers,\n }, function (err, data) {\n if (err) return callback(err);\n var DeleteResult = data.DeleteResult || {};\n var Deleted = DeleteResult.Deleted || [];\n var Errors = DeleteResult.Error || [];\n\n Deleted = util.isArray(Deleted) ? Deleted : [Deleted];\n Errors = util.isArray(Errors) ? Errors : [Errors];\n\n var result = util.clone(DeleteResult);\n util.extend(result, {\n Error: Errors,\n Deleted: Deleted,\n statusCode: data.statusCode,\n headers: data.headers,\n });\n callback(null, result);\n });\n}\n\nfunction restoreObject(params, callback) {\n var headers = params.Headers;\n if (!params['RestoreRequest']) {\n callback(util.error(new Error('missing param RestoreRequest')));\n return;\n }\n\n var RestoreRequest = params.RestoreRequest || {};\n var xml = util.json2xml({RestoreRequest: RestoreRequest});\n\n headers['Content-Type'] = 'application/xml';\n headers['Content-MD5'] = util.binaryBase64(util.md5(xml));\n\n submitRequest.call(this, {\n Action: 'name/cos:RestoreObject',\n method: 'POST',\n Bucket: params.Bucket,\n Region: params.Region,\n Key: params.Key,\n VersionId: params.VersionId,\n body: xml,\n action: 'restore',\n headers: headers,\n }, callback);\n}\n\n/**\n * 设置 Object 的标签\n * @param {Object} params 参数对象,必须\n * @param {String} params.Bucket Object名称,必须\n * @param {String} params.Region 地域名称,必须\n * @param {Array} params.TagSet 标签设置,必须\n * @param {Function} callback 回调函数,必须\n * @return {Object} err 请求失败的错误,如果请求成功,则为空。https://cloud.tencent.com/document/product/436/42998\n * @return {Object} data 返回数据\n */\nfunction putObjectTagging(params, callback) {\n\n var Tagging = params['Tagging'] || {};\n var Tags = Tagging.TagSet || Tagging.Tags || params['Tags'] || [];\n Tags = util.clone(util.isArray(Tags) ? Tags : [Tags]);\n var xml = util.json2xml({Tagging: {TagSet: {Tag: Tags}}});\n\n var headers = params.Headers;\n headers['Content-Type'] = 'application/xml';\n headers['Content-MD5'] = util.binaryBase64(util.md5(xml));\n\n submitRequest.call(this, {\n Action: 'name/cos:PutObjectTagging',\n method: 'PUT',\n Bucket: params.Bucket,\n Key: params.Key,\n Region: params.Region,\n body: xml,\n action: 'tagging',\n headers: headers,\n VersionId: params.VersionId,\n }, function (err, data) {\n if (err && err.statusCode === 204) {\n return callback(null, {statusCode: err.statusCode});\n } else if (err) {\n return callback(err);\n }\n callback(null, {\n statusCode: data.statusCode,\n headers: data.headers,\n });\n });\n}\n\n/**\n * 获取 Object 的标签设置\n * @param {Object} params 参数对象,必须\n * @param {String} params.Bucket Bucket名称,必须\n * @param {String} params.Region 地域名称,必须\n * @param {Function} callback 回调函数,必须\n * @return {Object} err 请求失败的错误,如果请求成功,则为空。https://cloud.tencent.com/document/product/436/42998\n * @return {Object} data 返回数据\n */\nfunction getObjectTagging(params, callback) {\n\n submitRequest.call(this, {\n Action: 'name/cos:GetObjectTagging',\n method: 'GET',\n Key: params.Key,\n Bucket: params.Bucket,\n Region: params.Region,\n headers: params.Headers,\n action: 'tagging',\n VersionId: params.VersionId,\n }, function (err, data) {\n if (err) {\n if (err.statusCode === 404 && err.error && (err.error === \"Not Found\" || err.error.Code === 'NoSuchTagSet')) {\n var result = {\n Tags: [],\n statusCode: err.statusCode,\n };\n err.headers && (result.headers = err.headers);\n callback(null, result);\n } else {\n callback(err);\n }\n return;\n }\n var Tags = [];\n try {\n Tags = data.Tagging.TagSet.Tag || [];\n } catch (e) {\n }\n Tags = util.clone(util.isArray(Tags) ? Tags : [Tags]);\n callback(null, {\n Tags: Tags,\n statusCode: data.statusCode,\n headers: data.headers,\n });\n });\n}\n\n/**\n * 删除 Object 的 标签设置\n * @param {Object} params 参数对象,必须\n * @param {String} params.Bucket Object名称,必须\n * @param {String} params.Region 地域名称,必须\n * @param {Function} callback 回调函数,必须\n * @return {Object} err 请求失败的错误,如果请求成功,则为空。https://cloud.tencent.com/document/product/436/42998\n * @return {Object} data 返回的数据\n */\nfunction deleteObjectTagging(params, callback) {\n submitRequest.call(this, {\n Action: 'name/cos:DeleteObjectTagging',\n method: 'DELETE',\n Bucket: params.Bucket,\n Region: params.Region,\n Key: params.Key,\n headers: params.Headers,\n action: 'tagging',\n VersionId: params.VersionId,\n }, function (err, data) {\n if (err && err.statusCode === 204) {\n return callback(null, {statusCode: err.statusCode});\n } else if (err) {\n return callback(err);\n }\n callback(null, {\n statusCode: data.statusCode,\n headers: data.headers,\n });\n });\n}\n\n/**\n * 使用 SQL 语句从指定对象(CSV 格式或者 JSON 格式)中检索内容\n * @param {Object} params 参数对象,必须\n * @param {String} params.Bucket Object名称,必须\n * @param {String} params.Region 地域名称,必须\n * @param {Object} params.SelectRequest 地域名称,必须\n * @param {Function} callback 回调函数,必须\n * @return {Object} err 请求失败的错误,如果请求成功,则为空。https://cloud.tencent.com/document/product/436/42998\n * @return {Object} data 返回的数据\n */\nfunction selectObjectContent(params, callback) {\n var SelectType = params['SelectType'];\n if (!SelectType) return callback(util.error(new Error('missing param SelectType')));\n\n var SelectRequest = params['SelectRequest'] || {};\n var xml = util.json2xml({SelectRequest: SelectRequest});\n\n var headers = params.Headers;\n headers['Content-Type'] = 'application/xml';\n headers['Content-MD5'] = util.binaryBase64(util.md5(xml));\n\n submitRequest.call(this, {\n Action: 'name/cos:GetObject',\n method: 'POST',\n Bucket: params.Bucket,\n Region: params.Region,\n Key: params.Key,\n headers: params.Headers,\n action: 'select',\n qs: {\n 'select-type': params['SelectType'],\n },\n VersionId: params.VersionId,\n body: xml,\n DataType: 'arraybuffer',\n rawBody: true,\n }, function (err, data) {\n if (err && err.statusCode === 204) {\n return callback(null, {statusCode: err.statusCode});\n } else if (err) {\n return callback(err);\n }\n var result = util.parseSelectPayload(data.body);\n callback(null, {\n statusCode: data.statusCode,\n headers: data.headers,\n Body: result.body,\n Payload: result.payload,\n });\n });\n}\n\n\n// 分块上传\n\n\n/**\n * 初始化分块上传\n * @param {Object} params 参数对象,必须\n * @param {String} params.Bucket Bucket名称,必须\n * @param {String} params.Region 地域名称,必须\n * @param {String} params.Key object名称,必须\n * @param {String} params.UploadId object名称,必须\n * @param {String} params.CacheControl RFC 2616 中定义的缓存策略,将作为 Object 元数据保存,非必须\n * @param {String} params.ContentDisposition RFC 2616 中定义的文件名称,将作为 Object 元数据保存 ,非必须\n * @param {String} params.ContentEncoding RFC 2616 中定义的编码格式,将作为 Object 元数据保存,非必须\n * @param {String} params.ContentType RFC 2616 中定义的内容类型(MIME),将作为 Object 元数据保存,非必须\n * @param {String} params.Expires RFC 2616 中定义的过期时间,将作为 Object 元数据保存,非必须\n * @param {String} params.ACL 允许用户自定义文件权限,非必须\n * @param {String} params.GrantRead 赋予被授权者读的权限 ,非必须\n * @param {String} params.GrantWrite 赋予被授权者写的权限 ,非必须\n * @param {String} params.GrantFullControl 赋予被授权者读写权限 ,非必须\n * @param {String} params.StorageClass 设置Object的存储级别,枚举值:Standard,Standard_IA,Archive,非必须\n * @param {String} params.ServerSideEncryption 支持按照指定的加密算法进行服务端数据加密,格式 x-cos-server-side-encryption: \"AES256\",非必须\n * @param {Function} callback 回调函数,必须\n * @return {Object} err 请求失败的错误,如果请求成功,则为空。https://cloud.tencent.com/document/product/436/7730\n * @return {Object} data 返回的数据\n */\nfunction multipartInit(params, callback) {\n\n var self = this;\n // 特殊处理 Cache-Control\n var headers = params.Headers;\n\n // 特殊处理 Cache-Control、Content-Type\n if (!headers['Cache-Control'] && !headers['cache-control']) headers['Cache-Control'] = '';\n if (!headers['Content-Type'] && !headers['content-type']) headers['Content-Type'] = params.Body && params.Body.type || '';\n\n util.getBodyMd5(params.Body && (params.UploadAddMetaMd5 || self.options.UploadAddMetaMd5), params.Body, function (md5) {\n if (md5) params.Headers['x-cos-meta-md5'] = md5;\n submitRequest.call(self, {\n Action: 'name/cos:InitiateMultipartUpload',\n method: 'POST',\n Bucket: params.Bucket,\n Region: params.Region,\n Key: params.Key,\n action: 'uploads',\n headers: params.Headers,\n qs: params.Query,\n }, function (err, data) {\n if (err) return callback(err);\n data = util.clone(data || {});\n if (data && data.InitiateMultipartUploadResult) {\n return callback(null, util.extend(data.InitiateMultipartUploadResult, {\n statusCode: data.statusCode,\n headers: data.headers,\n }));\n }\n callback(null, data);\n });\n }, params.onHashProgress);\n}\n\n/**\n * 分块上传\n * @param {Object} params 参数对象,必须\n * @param {String} params.Bucket Bucket名称,必须\n * @param {String} params.Region 地域名称,必须\n * @param {String} params.Key object名称,必须\n * @param {File || Blob || String} params.Body 上传文件对象或字符串\n * @param {String} params.ContentLength RFC 2616 中定义的 HTTP 请求内容长度(字节),非必须\n * @param {String} params.Expect 当使用 Expect: 100-continue 时,在收到服务端确认后,才会发送请求内容,非必须\n * @param {String} params.ServerSideEncryption 支持按照指定的加密算法进行服务端数据加密,格式 x-cos-server-side-encryption: \"AES256\",非必须\n * @param {String} params.ContentSha1 RFC 3174 中定义的 160-bit 内容 SHA-1 算法校验值,非必须\n * @param {Function} callback 回调函数,必须\n * @return {Object} err 请求失败的错误,如果请求成功,则为空。https://cloud.tencent.com/document/product/436/7730\n * @return {Object} data 返回的数据\n * @return {Object} data.ETag 返回的文件分块 sha1 值\n */\nfunction multipartUpload(params, callback) {\n\n var self = this;\n util.getFileSize('multipartUpload', params, function () {\n util.getBodyMd5(self.options.UploadCheckContentMd5, params.Body, function (md5) {\n if (md5) params.Headers['Content-MD5'] = util.binaryBase64(md5);\n submitRequest.call(self, {\n Action: 'name/cos:UploadPart',\n TaskId: params.TaskId,\n method: 'PUT',\n Bucket: params.Bucket,\n Region: params.Region,\n Key: params.Key,\n qs: {\n partNumber: params['PartNumber'],\n uploadId: params['UploadId'],\n },\n headers: params.Headers,\n onProgress: params.onProgress,\n body: params.Body || null\n }, function (err, data) {\n if (err) return callback(err);\n callback(null, {\n ETag: util.attr(data.headers, 'etag', ''),\n statusCode: data.statusCode,\n headers: data.headers,\n });\n });\n });\n });\n\n}\n\n/**\n * 完成分块上传\n * @param {Object} params 参数对象,必须\n * @param {String} params.Bucket Bucket名称,必须\n * @param {String} params.Region 地域名称,必须\n * @param {String} params.Key object名称,必须\n * @param {Array} params.Parts 分块信息列表,必须\n * @param {String} params.Parts[i].PartNumber 块编号,必须\n * @param {String} params.Parts[i].ETag 分块的 sha1 校验值\n * @param {Function} callback 回调函数,必须\n * @return {Object} err 请求失败的错误,如果请求成功,则为空。https://cloud.tencent.com/document/product/436/7730\n * @return {Object} data 返回的数据\n * @return {Object} data.CompleteMultipartUpload 完成分块上传后的文件信息,包括Location, Bucket, Key 和 ETag\n */\nfunction multipartComplete(params, callback) {\n var self = this;\n\n var UploadId = params.UploadId;\n\n var Parts = params['Parts'];\n\n for (var i = 0, len = Parts.length; i < len; i++) {\n if (Parts[i]['ETag'] && Parts[i]['ETag'].indexOf('\"') === 0) {\n continue;\n }\n Parts[i]['ETag'] = '\"' + Parts[i]['ETag'] + '\"';\n }\n\n var xml = util.json2xml({CompleteMultipartUpload: {Part: Parts}});\n // CSP/ceph CompleteMultipartUpload 接口 body 写死了限制 1MB,这里醉倒 10000 片时,xml 字符串去掉空格853KB\n xml = xml.replace(/\\n\\s*/g, '');\n\n var headers = params.Headers;\n headers['Content-Type'] = 'application/xml';\n headers['Content-MD5'] = util.binaryBase64(util.md5(xml));\n\n submitRequest.call(this, {\n Action: 'name/cos:CompleteMultipartUpload',\n method: 'POST',\n Bucket: params.Bucket,\n Region: params.Region,\n Key: params.Key,\n qs: {\n uploadId: UploadId\n },\n body: xml,\n headers: headers,\n }, function (err, data) {\n if (err) return callback(err);\n var url = getUrl({\n ForcePathStyle: self.options.ForcePathStyle,\n protocol: self.options.Protocol,\n domain: self.options.Domain,\n bucket: params.Bucket,\n region: params.Region,\n object: params.Key,\n isLocation: true,\n });\n var res = data.CompleteMultipartUploadResult || {};\n if (res.ProcessResults) {\n if (res && res.ProcessResults) {\n res.UploadResult = {\n OriginalInfo: {\n Key: res.Key,\n Location: url,\n ETag: res.ETag,\n ImageInfo: res.ImageInfo,\n },\n ProcessResults: res.ProcessResults,\n };\n delete res.ImageInfo;\n delete res.ProcessResults;\n }\n }\n var result = util.extend(res, {\n Location: url,\n statusCode: data.statusCode,\n headers: data.headers,\n });\n callback(null, result);\n });\n}\n\n/**\n * 分块上传任务列表查询\n * @param {Object} params 参数对象,必须\n * @param {String} params.Bucket Bucket名称,必须\n * @param {String} params.Region 地域名称,必须\n * @param {String} params.Delimiter 定界符为一个符号,如果有Prefix,则将Prefix到delimiter之间的相同路径归为一类,定义为Common Prefix,然后列出所有Common Prefix。如果没有Prefix,则从路径起点开始,非必须\n * @param {String} params.EncodingType 规定返回值的编码方式,非必须\n * @param {String} params.Prefix 前缀匹配,用来规定返回的文件前缀地址,非必须\n * @param {String} params.MaxUploads 单次返回最大的条目数量,默认1000,非必须\n * @param {String} params.KeyMarker 与upload-id-marker一起使用
当upload-id-marker未被指定时,ObjectName字母顺序大于key-marker的条目将被列出
当upload-id-marker被指定时,ObjectName字母顺序大于key-marker的条目被列出,ObjectName字母顺序等于key-marker同时UploadId大于upload-id-marker的条目将被列出,非必须\n * @param {String} params.UploadIdMarker 与key-marker一起使用
当key-marker未被指定时,upload-id-marker将被忽略
当key-marker被指定时,ObjectName字母顺序大于key-marker的条目被列出,ObjectName字母顺序等于key-marker同时UploadId大于upload-id-marker的条目将被列出,非必须\n * @param {Function} callback 回调函数,必须\n * @return {Object} err 请求失败的错误,如果请求成功,则为空。https://cloud.tencent.com/document/product/436/7730\n * @return {Object} data 返回的数据\n * @return {Object} data.ListMultipartUploadsResult 分块上传任务信息\n */\nfunction multipartList(params, callback) {\n var reqParams = {};\n\n reqParams['delimiter'] = params['Delimiter'];\n reqParams['encoding-type'] = params['EncodingType'];\n reqParams['prefix'] = params['Prefix'] || '';\n\n reqParams['max-uploads'] = params['MaxUploads'];\n\n reqParams['key-marker'] = params['KeyMarker'];\n reqParams['upload-id-marker'] = params['UploadIdMarker'];\n\n reqParams = util.clearKey(reqParams);\n\n submitRequest.call(this, {\n Action: 'name/cos:ListMultipartUploads',\n ResourceKey: reqParams['prefix'],\n method: 'GET',\n Bucket: params.Bucket,\n Region: params.Region,\n headers: params.Headers,\n qs: reqParams,\n action: 'uploads',\n }, function (err, data) {\n if (err) return callback(err);\n\n if (data && data.ListMultipartUploadsResult) {\n var Upload = data.ListMultipartUploadsResult.Upload || [];\n Upload = util.isArray(Upload) ? Upload : [Upload];\n data.ListMultipartUploadsResult.Upload = Upload;\n }\n var result = util.clone(data.ListMultipartUploadsResult || {});\n util.extend(result, {\n statusCode: data.statusCode,\n headers: data.headers,\n });\n callback(null, result);\n });\n}\n\n/**\n * 上传的分块列表查询\n * @param {Object} params 参数对象,必须\n * @param {String} params.Bucket Bucket名称,必须\n * @param {String} params.Region 地域名称,必须\n * @param {String} params.Key object名称,必须\n * @param {String} params.UploadId 标示本次分块上传的ID,必须\n * @param {String} params.EncodingType 规定返回值的编码方式,非必须\n * @param {String} params.MaxParts 单次返回最大的条目数量,默认1000,非必须\n * @param {String} params.PartNumberMarker 默认以UTF-8二进制顺序列出条目,所有列出条目从marker开始,非必须\n * @param {Function} callback 回调函数,必须\n * @return {Object} err 请求失败的错误,如果请求成功,则为空。https://cloud.tencent.com/document/product/436/7730\n * @return {Object} data 返回的数据\n * @return {Object} data.ListMultipartUploadsResult 分块信息\n */\nfunction multipartListPart(params, callback) {\n var reqParams = {};\n\n reqParams['uploadId'] = params['UploadId'];\n reqParams['encoding-type'] = params['EncodingType'];\n reqParams['max-parts'] = params['MaxParts'];\n reqParams['part-number-marker'] = params['PartNumberMarker'];\n\n submitRequest.call(this, {\n Action: 'name/cos:ListParts',\n method: 'GET',\n Bucket: params.Bucket,\n Region: params.Region,\n Key: params.Key,\n headers: params.Headers,\n qs: reqParams,\n }, function (err, data) {\n if (err) return callback(err);\n var ListPartsResult = data.ListPartsResult || {};\n var Part = ListPartsResult.Part || [];\n Part = util.isArray(Part) ? Part : [Part];\n\n ListPartsResult.Part = Part;\n var result = util.clone(ListPartsResult);\n util.extend(result, {\n statusCode: data.statusCode,\n headers: data.headers,\n });\n callback(null, result);\n });\n}\n\n/**\n * 抛弃分块上传\n * @param {Object} params 参数对象,必须\n * @param {String} params.Bucket Bucket名称,必须\n * @param {String} params.Region 地域名称,必须\n * @param {String} params.Key object名称,必须\n * @param {String} params.UploadId 标示本次分块上传的ID,必须\n * @param {Function} callback 回调函数,必须\n * @return {Object} err 请求失败的错误,如果请求成功,则为空。https://cloud.tencent.com/document/product/436/7730\n * @return {Object} data 返回的数据\n */\nfunction multipartAbort(params, callback) {\n var reqParams = {};\n\n reqParams['uploadId'] = params['UploadId'];\n submitRequest.call(this, {\n Action: 'name/cos:AbortMultipartUpload',\n method: 'DELETE',\n Bucket: params.Bucket,\n Region: params.Region,\n Key: params.Key,\n headers: params.Headers,\n qs: reqParams,\n }, function (err, data) {\n if (err) return callback(err);\n callback(null, {\n statusCode: data.statusCode,\n headers: data.headers,\n });\n });\n}\n\n/**\n * 抛弃分块上传\n * @param {Object} params 参数对象,必须\n * @param {String} params.Bucket Bucket名称,必须\n * @param {String} params.Region 地域名称,必须\n * @param {String} params.Key object名称,必须\n * @param {String} params.UploadId 标示本次分块上传的ID,必须\n * @param {Function} callback 回调函数,必须\n * @return {Object} err 请求失败的错误,如果请求成功,则为空。https://cloud.tencent.com/document/product/436/7730\n * @return {Object} data 返回的数据\n */\nfunction request(params, callback) {\n submitRequest.call(this, {\n method: params.Method,\n Bucket: params.Bucket,\n Region: params.Region,\n Key: params.Key,\n action: params.Action,\n headers: params.Headers,\n qs: params.Query,\n body: params.Body,\n Url: params.Url,\n rawBody: params.RawBody,\n DataType: params.DataType,\n }, function (err, data) {\n if (err) return callback(err);\n if (data && data.body) {\n data.Body = data.body;\n delete data.body;\n }\n callback(err, data);\n });\n}\n\n/**\n * 追加上传\n * @param {Object} params 参数对象,必须\n * @param {String} params.Bucket Bucket名称,必须\n * @param {String} params.Region 地域名称,必须\n * @param {String} params.Key object名称,必须\n * @param {File || Blob || String} params.Body 上传文件对象或字符串\n * @param {Number} params.Position 追加操作的起始点,单位为字节,必须\n * @param {String} params.CacheControl RFC 2616 中定义的缓存策略,将作为 Object 元数据保存,非必须\n * @param {String} params.ContentDisposition RFC 2616 中定义的文件名称,将作为 Object 元数据保存,非必须\n * @param {String} params.ContentEncoding RFC 2616 中定义的编码格式,将作为 Object 元数据保存,非必须\n * @param {String} params.ContentLength RFC 2616 中定义的 HTTP 请求内容长度(字节),必须\n * @param {String} params.ContentType RFC 2616 中定义的内容类型(MIME),将作为 Object 元数据保存,非必须\n * @param {String} params.Expect 当使用 Expect: 100-continue 时,在收到服务端确认后,才会发送请求内容,非必须\n * @param {String} params.Expires RFC 2616 中定义的过期时间,将作为 Object 元数据保存,非必须\n * @param {String} params.ACL 允许用户自定义文件权限,有效值:private | public-read,非必须\n * @param {String} params.GrantRead 赋予被授权者读取对象的权限,格式:id=\"[OwnerUin]\",可使用半角逗号(,)分隔多组被授权者,非必须\n * @param {String} params.GrantReadAcp 赋予被授权者读取对象的访问控制列表(ACL)的权限,格式:id=\"[OwnerUin]\",可使用半角逗号(,)分隔多组被授权者,非必须\n * @param {String} params.GrantWriteAcp 赋予被授权者写入对象的访问控制列表(ACL)的权限,格式:id=\"[OwnerUin]\",可使用半角逗号(,)分隔多组被授权者,非必须\n * @param {String} params.GrantFullControl 赋予被授权者操作对象的所有权限,格式:id=\"[OwnerUin]\",可使用半角逗号(,)分隔多组被授权者,非必须\n * @param {String} params.StorageClass 设置对象的存储级别,枚举值:STANDARD、STANDARD_IA、ARCHIVE,默认值:STANDARD,非必须\n * @param {String} params.x-cos-meta-* 允许用户自定义的头部信息,将作为对象的元数据保存。大小限制2KB,非必须\n * @param {String} params.ContentSha1 RFC 3174 中定义的 160-bit 内容 SHA-1 算法校验,非必须\n * @param {String} params.ServerSideEncryption 支持按照指定的加密算法进行服务端数据加密,格式 x-cos-server-side-encryption: \"AES256\",非必须\n * @param {Function} callback 回调函数,必须\n * @return {Object} err 请求失败的错误,如果请求成功,则为空。https://cloud.tencent.com/document/product/436/7730\n * @return {Object} data 返回的数据\n */\nfunction appendObject(params, callback) {\n // 特殊处理 Cache-Control、Content-Type,避免代理更改这两个字段导致写入到 Object 属性里\n var headers = params.Headers;\n if (!headers['Cache-Control'] && !headers['cache-control']) headers['Cache-Control'] = '';\n if (!headers['Content-Type'] && !headers['content-type']) headers['Content-Type'] = params.Body && params.Body.type || '';\n submitRequest.call(this, {\n Action: 'name/cos:AppendObject',\n method: 'POST',\n Bucket: params.Bucket,\n Region: params.Region,\n action: 'append',\n Key: params.Key,\n body: params.Body,\n qs: {\n position: params.Position\n },\n headers: params.Headers,\n }, function (err, data) {\n if (err) return callback(err);\n callback(null, data);\n });\n}\n\n/**\n * 获取签名\n * @param {Object} params 参数对象,必须\n * @param {String} params.Method 请求方法,必须\n * @param {String} params.Key object名称,必须\n * @param {String} params.Expires 名超时时间,单位秒,可选\n * @return {String} data 返回签名字符串\n */\nfunction getAuth(params) {\n var self = this;\n return util.getAuth({\n SecretId: params.SecretId || this.options.SecretId || '',\n SecretKey: params.SecretKey || this.options.SecretKey || '',\n Bucket: params.Bucket,\n Region: params.Region,\n Method: params.Method,\n Key: params.Key,\n Query: params.Query,\n Headers: params.Headers,\n Expires: params.Expires,\n UseRawKey: self.options.UseRawKey,\n SystemClockOffset: self.options.SystemClockOffset,\n });\n}\n\n/**\n * 获取文件下载链接\n * @param {Object} params 参数对象,必须\n * @param {String} params.Bucket Bucket名称,必须\n * @param {String} params.Region 地域名称,必须\n * @param {String} params.Key object名称,必须\n * @param {String} params.Method 请求的方法,可选\n * @param {String} params.Expires 签名超时时间,单位秒,可选\n * @param {Function} callback 回调函数,必须\n * @return {Object} err 请求失败的错误,如果请求成功,则为空。https://cloud.tencent.com/document/product/436/7730\n * @return {Object} data 返回的数据\n */\nfunction getObjectUrl(params, callback) {\n var self = this;\n var url = getUrl({\n ForcePathStyle: self.options.ForcePathStyle,\n protocol: params.Protocol || self.options.Protocol,\n domain: params.Domain || self.options.Domain,\n bucket: params.Bucket,\n region: params.Region,\n object: params.Key,\n });\n\n var queryParamsStr = '';\n if(params.Query){\n queryParamsStr += util.obj2str(params.Query);\n }\n if(params.QueryString){\n queryParamsStr += (queryParamsStr ? '&' : '') + params.QueryString;\n }\n\n var syncUrl = url;\n if (params.Sign !== undefined && !params.Sign) {\n queryParamsStr && (syncUrl += '?' + queryParamsStr);\n callback(null, {Url: syncUrl});\n return syncUrl;\n }\n \n // 签名加上 Host,避免跨桶访问\n var SignHost = getSignHost.call(this, {Bucket: params.Bucket, Region: params.Region, Url: url});\n var AuthData = getAuthorizationAsync.call(this, {\n Action: ((params.Method || '').toUpperCase() === 'PUT' ? 'name/cos:PutObject' : 'name/cos:GetObject'),\n Bucket: params.Bucket || '',\n Region: params.Region || '',\n Method: params.Method || 'get',\n Key: params.Key,\n Expires: params.Expires,\n Headers: params.Headers,\n Query: params.Query,\n SignHost: SignHost,\n }, function (err, AuthData) {\n if (!callback) return;\n if (err) {\n callback(err);\n return;\n }\n\n // 兼容万象url qUrlParamList需要再encode一次\n var replaceUrlParamList = function(url) {\n var urlParams = url.match(/q-url-param-list.*?(?=&)/g)[0];\n var encodedParams = 'q-url-param-list=' + encodeURIComponent(urlParams.replace(/q-url-param-list=/, '')).toLowerCase();\n var reg = new RegExp(urlParams, 'g');\n var replacedUrl = url.replace(reg, encodedParams);\n return replacedUrl;\n }\n\n var signUrl = url;\n signUrl += '?' + (AuthData.Authorization.indexOf('q-signature') > -1 ?\n replaceUrlParamList(AuthData.Authorization) : 'sign=' + encodeURIComponent(AuthData.Authorization));\n AuthData.SecurityToken && (signUrl += '&x-cos-security-token=' + AuthData.SecurityToken);\n AuthData.ClientIP && (signUrl += '&clientIP=' + AuthData.ClientIP);\n AuthData.ClientUA && (signUrl += '&clientUA=' + AuthData.ClientUA);\n AuthData.Token && (signUrl += '&token=' + AuthData.Token);\n queryParamsStr && (signUrl += '&' + queryParamsStr);\n setTimeout(function () {\n callback(null, {Url: signUrl});\n });\n });\n if (AuthData) {\n syncUrl += '?' + AuthData.Authorization +\n (AuthData.SecurityToken ? '&x-cos-security-token=' + AuthData.SecurityToken : '');\n queryParamsStr && (syncUrl += '&' + queryParamsStr);\n } else{\n queryParamsStr && (syncUrl += '?' + queryParamsStr);\n }\n return syncUrl;\n}\n\n/**\n * 私有方法\n */\nfunction decodeAcl(AccessControlPolicy) {\n var result = {\n GrantFullControl: [],\n GrantWrite: [],\n GrantRead: [],\n GrantReadAcp: [],\n GrantWriteAcp: [],\n ACL: '',\n };\n var GrantMap = {\n 'FULL_CONTROL': 'GrantFullControl',\n 'WRITE': 'GrantWrite',\n 'READ': 'GrantRead',\n 'READ_ACP': 'GrantReadAcp',\n 'WRITE_ACP': 'GrantWriteAcp',\n };\n var AccessControlList = AccessControlPolicy && AccessControlPolicy.AccessControlList || {};\n var Grant = AccessControlList.Grant;\n if (Grant) {\n Grant = util.isArray(Grant) ? Grant : [Grant];\n }\n var PublicAcl = {READ: 0, WRITE: 0, FULL_CONTROL: 0};\n Grant && Grant.length && util.each(Grant, function (item) {\n if (item.Grantee.ID === 'qcs::cam::anyone:anyone' || item.Grantee.URI === 'http://cam.qcloud.com/groups/global/AllUsers') {\n PublicAcl[item.Permission] = 1;\n } else if (item.Grantee.ID !== AccessControlPolicy.Owner.ID) {\n result[GrantMap[item.Permission]].push('id=\"' + item.Grantee.ID + '\"');\n }\n });\n if (PublicAcl.FULL_CONTROL || (PublicAcl.WRITE && PublicAcl.READ)) {\n result.ACL = 'public-read-write';\n } else if (PublicAcl.READ) {\n result.ACL = 'public-read';\n } else {\n result.ACL = 'private';\n }\n util.each(GrantMap, function (item) {\n result[item] = uniqGrant(result[item].join(','));\n });\n return result;\n}\n\n// Grant 去重\nfunction uniqGrant(str) {\n var arr = str.split(',');\n var exist = {};\n var i, item;\n for (i = 0; i < arr.length; ) {\n item = arr[i].trim();\n if (exist[item]) {\n arr.splice(i, 1);\n } else {\n exist[item] = true;\n arr[i] = item;\n i++;\n }\n }\n return arr.join(',');\n}\n\n// 生成操作 url\nfunction getUrl(params) {\n var region = params.region || '';\n var longBucket = params.bucket || '';\n var shortBucket = longBucket.substr(0, longBucket.lastIndexOf('-'));\n var appId = longBucket.substr(longBucket.lastIndexOf('-') + 1);\n var domain = params.domain;\n var object = params.object;\n if (typeof domain === 'function') {\n domain = domain({Bucket: longBucket, Region: region});\n }\n var protocol = params.protocol || (util.isBrowser && location.protocol === 'http:' ? 'http:' : 'https:');\n if (!domain) {\n if (['cn-south', 'cn-south-2', 'cn-north', 'cn-east', 'cn-southwest', 'sg'].indexOf(region) > -1) {\n domain = '{Region}.myqcloud.com';\n } else {\n domain = 'cos.{Region}.myqcloud.com';\n }\n if (!params.ForcePathStyle) {\n domain = '{Bucket}.' + domain;\n }\n }\n domain = domain.replace(/\\{\\{AppId\\}\\}/ig, appId)\n .replace(/\\{\\{Bucket\\}\\}/ig, shortBucket)\n .replace(/\\{\\{Region\\}\\}/ig, region)\n .replace(/\\{\\{.*?\\}\\}/ig, '');\n domain = domain.replace(/\\{AppId\\}/ig, appId)\n .replace(/\\{BucketName\\}/ig, shortBucket)\n .replace(/\\{Bucket\\}/ig, longBucket)\n .replace(/\\{Region\\}/ig, region)\n .replace(/\\{.*?\\}/ig, '');\n if (!/^[a-zA-Z]+:\\/\\//.test(domain)) {\n domain = protocol + '//' + domain;\n }\n\n // 去掉域名最后的斜杆\n if (domain.slice(-1) === '/') {\n domain = domain.slice(0, -1);\n }\n var url = domain;\n\n if (params.ForcePathStyle) {\n url += '/' + longBucket;\n }\n url += '/';\n if (object) {\n url += util.camSafeUrlEncode(object).replace(/%2F/g, '/');\n }\n\n if (params.isLocation) {\n url = url.replace(/^https?:\\/\\//, '');\n }\n return url;\n}\n\nvar getSignHost = function (opt) {\n if (!opt.Bucket || !opt.Region) return '';\n var url = opt.Url || getUrl({\n ForcePathStyle: this.options.ForcePathStyle,\n protocol: this.options.Protocol,\n domain: this.options.Domain,\n bucket: opt.Bucket,\n region: this.options.UseAccelerate ? 'accelerate' : opt.Region,\n });\n var urlHost = url.replace(/^https?:\\/\\/([^/]+)(\\/.*)?$/, '$1');\n var standardHostReg = new RegExp('^([a-z\\\\d-]+-\\\\d+\\\\.)?(cos|cosv6|ci|pic)\\\\.([a-z\\\\d-]+)\\\\.myqcloud\\\\.com$');\n if (standardHostReg.test(urlHost)) return urlHost;\n return '';\n}\n\n\n// 异步获取签名\nfunction getAuthorizationAsync(params, callback) {\n var headers = util.clone(params.Headers);\n var headerHost = '';\n util.each(headers, function (v, k) {\n (v === '' || ['content-type', 'cache-control', 'expires'].indexOf(k.toLowerCase()) > -1) && delete headers[k];\n if (k.toLowerCase() === 'host') headerHost = v;\n });\n\n // Host 加入签名计算\n if (!headerHost && params.SignHost) headers.Host = params.SignHost;\n\n // 获取凭证的回调,避免用户 callback 多次\n var cbDone = false;\n var cb = function (err, AuthData) {\n if (cbDone) return;\n cbDone = true;\n if (AuthData && AuthData.XCosSecurityToken && !AuthData.SecurityToken) {\n AuthData = util.clone(AuthData);\n AuthData.SecurityToken = AuthData.XCosSecurityToken;\n delete AuthData.XCosSecurityToken;\n }\n callback && callback(err, AuthData);\n };\n\n var self = this;\n var Bucket = params.Bucket || '';\n var Region = params.Region || '';\n\n // PathName\n var KeyName = params.Key || '';\n if (self.options.ForcePathStyle && Bucket) {\n KeyName = Bucket + '/' + KeyName;\n }\n var Pathname = '/' + KeyName;\n\n // Action、ResourceKey\n var StsData = {};\n var Scope = params.Scope;\n if (!Scope) {\n var Action = params.Action || '';\n var ResourceKey = params.ResourceKey || params.Key || '';\n Scope = params.Scope || [{\n action: Action,\n bucket: Bucket,\n region: Region,\n prefix: ResourceKey,\n }];\n }\n var ScopeKey = util.md5(JSON.stringify(Scope));\n\n // STS\n self._StsCache = self._StsCache ||[];\n (function () {\n var i, AuthData;\n for (i = self._StsCache.length - 1; i >= 0; i--) {\n AuthData = self._StsCache[i];\n var compareTime = Math.round(util.getSkewTime(self.options.SystemClockOffset) / 1000) + 30;\n if (AuthData.StartTime && compareTime < AuthData.StartTime || compareTime >= AuthData.ExpiredTime) {\n self._StsCache.splice(i, 1);\n continue;\n }\n if (!AuthData.ScopeLimit || AuthData.ScopeLimit && AuthData.ScopeKey === ScopeKey) {\n StsData = AuthData;\n break;\n }\n }\n })();\n\n var calcAuthByTmpKey = function () {\n var KeyTime = StsData.StartTime && StsData.ExpiredTime ? StsData.StartTime + ';' + StsData.ExpiredTime : '';\n var Authorization = util.getAuth({\n SecretId: StsData.TmpSecretId,\n SecretKey: StsData.TmpSecretKey,\n Method: params.Method,\n Pathname: Pathname,\n Query: params.Query,\n Headers: headers,\n Expires: params.Expires,\n UseRawKey: self.options.UseRawKey,\n SystemClockOffset: self.options.SystemClockOffset,\n KeyTime: KeyTime\n });\n var AuthData = {\n Authorization: Authorization,\n SecurityToken: StsData.SecurityToken || StsData.XCosSecurityToken || '',\n Token: StsData.Token || '',\n ClientIP: StsData.ClientIP || '',\n ClientUA: StsData.ClientUA || '',\n };\n cb(null, AuthData);\n };\n var checkAuthError = function (AuthData) {\n if (AuthData.Authorization) {\n // 检查签名格式\n var formatAllow = false;\n var auth = AuthData.Authorization;\n if (auth) {\n if (auth.indexOf(' ') > -1) {\n formatAllow = false;\n } else if (auth.indexOf('q-sign-algorithm=') > -1 &&\n auth.indexOf('q-ak=') > -1 &&\n auth.indexOf('q-sign-time=') > -1 &&\n auth.indexOf('q-key-time=') > -1 &&\n auth.indexOf('q-url-param-list=') > -1) {\n formatAllow = true;\n } else {\n try {\n auth = atob(auth);\n if (auth.indexOf('a=') > -1 &&\n auth.indexOf('k=') > -1 &&\n auth.indexOf('t=') > -1 &&\n auth.indexOf('r=') > -1 &&\n auth.indexOf('b=') > -1) {\n formatAllow = true;\n }\n } catch (e) {}\n }\n }\n if (!formatAllow) return util.error(new Error('getAuthorization callback params format error'));\n } else {\n if (!AuthData.TmpSecretId) return util.error(new Error('getAuthorization callback params missing \"TmpSecretId\"'));\n if (!AuthData.TmpSecretKey) return util.error(new Error('getAuthorization callback params missing \"TmpSecretKey\"'));\n if (!AuthData.SecurityToken && !AuthData.XCosSecurityToken) return util.error(new Error('getAuthorization callback params missing \"SecurityToken\"'));\n if (!AuthData.ExpiredTime) return util.error(new Error('getAuthorization callback params missing \"ExpiredTime\"'));\n if (AuthData.ExpiredTime && AuthData.ExpiredTime.toString().length !== 10) return util.error(new Error('getAuthorization callback params \"ExpiredTime\" should be 10 digits'));\n if (AuthData.StartTime && AuthData.StartTime.toString().length !== 10) return util.error(new Error('getAuthorization callback params \"StartTime\" should be 10 StartTime'));\n }\n return false;\n };\n\n // 先判断是否有临时密钥\n if (StsData.ExpiredTime && StsData.ExpiredTime - (util.getSkewTime(self.options.SystemClockOffset) / 1000) > 60) { // 如果缓存的临时密钥有效,并还有超过60秒有效期就直接使用\n calcAuthByTmpKey();\n } else if (self.options.getAuthorization) { // 外部计算签名或获取临时密钥\n self.options.getAuthorization.call(self, {\n Bucket: Bucket,\n Region: Region,\n Method: params.Method,\n Key: KeyName,\n Pathname: Pathname,\n Query: params.Query,\n Headers: headers,\n Scope: Scope,\n SystemClockOffset: self.options.SystemClockOffset,\n }, function (AuthData) {\n if (typeof AuthData === 'string') AuthData = {Authorization: AuthData};\n var AuthError = checkAuthError(AuthData);\n if (AuthError) return cb(AuthError);\n if (AuthData.Authorization) {\n cb(null, AuthData);\n } else {\n StsData = AuthData || {};\n StsData.Scope = Scope;\n StsData.ScopeKey = ScopeKey;\n self._StsCache.push(StsData);\n calcAuthByTmpKey();\n }\n });\n } else if (self.options.getSTS) { // 外部获取临时密钥\n self.options.getSTS.call(self, {\n Bucket: Bucket,\n Region: Region,\n }, function (data) {\n StsData = data || {};\n StsData.Scope = Scope;\n StsData.ScopeKey = ScopeKey;\n if (!StsData.TmpSecretId) StsData.TmpSecretId = StsData.SecretId;\n if (!StsData.TmpSecretKey) StsData.TmpSecretKey = StsData.SecretKey;\n var AuthError = checkAuthError(StsData);\n if (AuthError) return cb(AuthError);\n self._StsCache.push(StsData);\n calcAuthByTmpKey();\n });\n } else { // 内部计算获取签名\n return (function () {\n var Authorization = util.getAuth({\n SecretId: params.SecretId || self.options.SecretId,\n SecretKey: params.SecretKey || self.options.SecretKey,\n Method: params.Method,\n Pathname: Pathname,\n Query: params.Query,\n Headers: headers,\n Expires: params.Expires,\n UseRawKey: self.options.UseRawKey,\n SystemClockOffset: self.options.SystemClockOffset,\n });\n var AuthData = {\n Authorization: Authorization,\n SecurityToken: self.options.SecurityToken || self.options.XCosSecurityToken,\n };\n cb(null, AuthData);\n return AuthData;\n })();\n }\n return '';\n}\n\n// 调整时间偏差\nfunction allowRetry(err) {\n var allowRetry = false;\n var isTimeError = false;\n var serverDate = (err.headers && (err.headers.date || err.headers.Date)) || (err.error && err.error.ServerTime);\n try {\n var errorCode = err.error.Code;\n var errorMessage = err.error.Message;\n if (errorCode === 'RequestTimeTooSkewed' ||\n (errorCode === 'AccessDenied' && errorMessage === 'Request has expired')) {\n isTimeError = true;\n }\n } catch (e) {\n }\n if (err) {\n if (isTimeError && serverDate) {\n var serverTime = Date.parse(serverDate);\n if (this.options.CorrectClockSkew && Math.abs(util.getSkewTime(this.options.SystemClockOffset) - serverTime) >= 30000) {\n console.error('error: Local time is too skewed.');\n this.options.SystemClockOffset = serverTime - Date.now();\n allowRetry = true;\n }\n } else if (Math.floor(err.statusCode / 100) === 5) {\n allowRetry = true;\n }\n }\n return allowRetry;\n}\n\n// 获取签名并发起请求\nfunction submitRequest(params, callback) {\n var self = this;\n\n // 处理 headers\n !params.headers && (params.headers = {});\n\n // 处理 query\n !params.qs && (params.qs = {});\n params.VersionId && (params.qs.versionId = params.VersionId);\n params.qs = util.clearKey(params.qs);\n\n // 清理 undefined 和 null 字段\n params.headers && (params.headers = util.clearKey(params.headers));\n params.qs && (params.qs = util.clearKey(params.qs));\n\n var Query = util.clone(params.qs);\n params.action && (Query[params.action] = '');\n\n var paramsUrl = params.url || params.Url;\n var SignHost = params.SignHost || getSignHost.call(this, {Bucket: params.Bucket, Region: params.Region, Url: paramsUrl});\n var next = function (tryTimes) {\n var oldClockOffset = self.options.SystemClockOffset;\n getAuthorizationAsync.call(self, {\n Bucket: params.Bucket || '',\n Region: params.Region || '',\n Method: params.method,\n Key: params.Key,\n Query: Query,\n Headers: params.headers,\n SignHost: SignHost,\n Action: params.Action,\n ResourceKey: params.ResourceKey,\n Scope: params.Scope,\n }, function (err, AuthData) {\n if (err) {\n callback(err);\n return;\n }\n params.AuthData = AuthData;\n _submitRequest.call(self, params, function (err, data) {\n if (err && tryTimes < 2 && (oldClockOffset !== self.options.SystemClockOffset || allowRetry.call(self, err))) {\n if (params.headers) {\n delete params.headers.Authorization;\n delete params.headers['token'];\n delete params.headers['clientIP'];\n delete params.headers['clientUA'];\n params.headers['x-cos-security-token'] && (delete params.headers['x-cos-security-token']);\n params.headers['x-ci-security-token'] && (delete params.headers['x-ci-security-token']);\n }\n next(tryTimes + 1);\n } else {\n callback(err, data);\n }\n });\n });\n };\n next(1);\n\n}\n\n// 发起请求\nfunction _submitRequest(params, callback) {\n var self = this;\n var TaskId = params.TaskId;\n if (TaskId && !self._isRunningTask(TaskId)) return;\n\n var bucket = params.Bucket;\n var region = params.Region;\n var object = params.Key;\n var method = params.method || 'GET';\n var url = params.Url || params.url;\n var body = params.body;\n var rawBody = params.rawBody;\n\n // url\n if (self.options.UseAccelerate) {\n region = 'accelerate';\n }\n url = url || getUrl({\n ForcePathStyle: self.options.ForcePathStyle,\n protocol: self.options.Protocol,\n domain: self.options.Domain,\n bucket: bucket,\n region: region,\n object: object,\n });\n if (params.action) {\n url = url + '?' + params.action;\n }\n if (params.qsStr) {\n if(url.indexOf('?') > -1){\n url = url + '&' + params.qsStr;\n }else{\n url = url + '?' + params.qsStr;\n }\n }\n\n var opt = {\n method: method,\n url: url,\n headers: params.headers,\n qs: params.qs,\n body: body,\n };\n\n // 兼容ci接口\n var token = 'x-cos-security-token';\n if (util.isCIHost(url)) {\n token = 'x-ci-security-token';\n }\n\n // 获取签名\n opt.headers.Authorization = params.AuthData.Authorization;\n params.AuthData.Token && (opt.headers['token'] = params.AuthData.Token);\n params.AuthData.ClientIP && (opt.headers['clientIP'] = params.AuthData.ClientIP);\n params.AuthData.ClientUA && (opt.headers['clientUA'] = params.AuthData.ClientUA);\n params.AuthData.SecurityToken && (opt.headers[token] = params.AuthData.SecurityToken);\n\n // 清理 undefined 和 null 字段\n opt.headers && (opt.headers = util.clearKey(opt.headers));\n opt = util.clearKey(opt);\n\n // progress\n if (params.onProgress && typeof params.onProgress === 'function') {\n var contentLength = body && (body.size || body.length) || 0;\n opt.onProgress = function (e) {\n if (TaskId && !self._isRunningTask(TaskId)) return;\n var loaded = e ? e.loaded : 0;\n params.onProgress({loaded: loaded, total: contentLength});\n };\n }\n if (params.onDownloadProgress) {\n opt.onDownloadProgress = params.onDownloadProgress;\n }\n if (params.DataType) {\n opt.dataType = params.DataType;\n }\n if (this.options.Timeout) {\n opt.timeout = this.options.Timeout;\n }\n\n self.options.ForcePathStyle && (opt.pathStyle = self.options.ForcePathStyle);\n self.emit('before-send', opt);\n var sender = (self.options.Request || REQUEST)(opt, function (r) {\n if (r.error === 'abort') return;\n\n var receive = {\n options: opt,\n error: err,\n statusCode: response && response.statusCode || 0,\n headers: response && response.headers || {},\n body: body,\n };\n self.emit('after-receive', receive);\n err = receive.error;\n body = receive.body;\n response = {\n statusCode: receive.statusCode,\n headers: receive.headers,\n };\n\n // 抛出事件,允许修改返回值的 error、statusCode、statusMessage、body\n self.emit('after-receive', r);\n var response = {statusCode: r.statusCode, statusMessage: r.statusMessage, headers: r.headers};\n var err = r.error;\n var body = r.body;\n\n // 返回内容添加 状态码 和 headers\n var hasReturned;\n var cb = function (err, data) {\n TaskId && self.off('inner-kill-task', killTask);\n if (hasReturned) return;\n hasReturned = true;\n var attrs = {};\n response && response.statusCode && (attrs.statusCode = response.statusCode);\n response && response.headers && (attrs.headers = response.headers);\n\n if (err) {\n err = util.extend(err || {}, attrs)\n callback(err, null);\n } else {\n data = util.extend(data || {}, attrs);\n callback(null, data);\n }\n sender = null;\n };\n\n // 请求错误,发生网络错误\n if (err) return cb(util.error(err));\n\n // 请求返回码不为 200\n var statusCode = response.statusCode;\n var statusSuccess = Math.floor(statusCode / 100) === 2; // 200 202 204 206\n\n // 不对 body 进行转换,body 直接挂载返回\n if (rawBody && statusSuccess) return cb(null, {body: body});\n\n // 解析 xml body\n var json;\n try {\n json = body && body.indexOf('<') > -1 && body.indexOf('>') > -1 && util.xml2json(body) || {};\n } catch (e) {\n json = {};\n }\n\n // 处理返回值\n var xmlError = json && json.Error;\n if (statusSuccess) { // 正确返回,状态码 2xx 时,body 不会有 Error\n cb(null, json);\n } else if (xmlError) { // 正常返回了 xml body,且有 Error 节点\n cb(util.error(new Error(xmlError.Message), {code: xmlError.Code, error: xmlError}));\n } else if (statusCode) { // 有错误的状态码\n cb(util.error(new Error(response.statusMessage), {code: '' + statusCode}));\n } else if (statusCode) { // 无状态码,或者获取不到状态码\n cb(util.error(new Error('statusCode error')));\n }\n });\n\n // kill task\n var killTask = function (data) {\n if (data.TaskId === TaskId) {\n sender && sender.abort && sender.abort();\n self.off('inner-kill-task', killTask);\n }\n };\n TaskId && self.on('inner-kill-task', killTask);\n\n}\n\n\nvar API_MAP = {\n // Bucket 相关方法\n getService: getService, // Bucket\n putBucket: putBucket,\n headBucket: headBucket, // Bucket\n getBucket: getBucket,\n deleteBucket: deleteBucket,\n putBucketAcl: putBucketAcl, // BucketACL\n getBucketAcl: getBucketAcl,\n putBucketCors: putBucketCors, // BucketCors\n getBucketCors: getBucketCors,\n deleteBucketCors: deleteBucketCors,\n getBucketLocation: getBucketLocation, // BucketLocation\n getBucketPolicy: getBucketPolicy, // BucketPolicy\n putBucketPolicy: putBucketPolicy,\n deleteBucketPolicy: deleteBucketPolicy,\n putBucketTagging: putBucketTagging, // BucketTagging\n getBucketTagging: getBucketTagging,\n deleteBucketTagging: deleteBucketTagging,\n putBucketLifecycle: putBucketLifecycle, // BucketLifecycle\n getBucketLifecycle: getBucketLifecycle,\n deleteBucketLifecycle: deleteBucketLifecycle,\n putBucketVersioning: putBucketVersioning, // BucketVersioning\n getBucketVersioning: getBucketVersioning,\n putBucketReplication: putBucketReplication, // BucketReplication\n getBucketReplication: getBucketReplication,\n deleteBucketReplication: deleteBucketReplication,\n putBucketWebsite: putBucketWebsite, // BucketWebsite\n getBucketWebsite: getBucketWebsite,\n deleteBucketWebsite: deleteBucketWebsite,\n putBucketReferer: putBucketReferer, // BucketReferer\n getBucketReferer: getBucketReferer,\n putBucketDomain: putBucketDomain, // BucketDomain\n getBucketDomain: getBucketDomain,\n deleteBucketDomain: deleteBucketDomain,\n putBucketOrigin: putBucketOrigin, // BucketOrigin\n getBucketOrigin: getBucketOrigin,\n deleteBucketOrigin: deleteBucketOrigin,\n putBucketLogging: putBucketLogging, // BucketLogging\n getBucketLogging: getBucketLogging,\n putBucketInventory: putBucketInventory, // BucketInventory\n getBucketInventory: getBucketInventory,\n listBucketInventory: listBucketInventory,\n deleteBucketInventory: deleteBucketInventory,\n putBucketAccelerate: putBucketAccelerate,\n getBucketAccelerate: getBucketAccelerate,\n putBucketEncryption: putBucketEncryption,\n getBucketEncryption: getBucketEncryption,\n deleteBucketEncryption: deleteBucketEncryption,\n\n // Object 相关方法\n getObject: getObject,\n headObject: headObject,\n listObjectVersions: listObjectVersions,\n putObject: putObject,\n deleteObject: deleteObject,\n getObjectAcl: getObjectAcl,\n putObjectAcl: putObjectAcl,\n optionsObject: optionsObject,\n putObjectCopy: putObjectCopy,\n deleteMultipleObject: deleteMultipleObject,\n restoreObject: restoreObject,\n putObjectTagging: putObjectTagging,\n getObjectTagging: getObjectTagging,\n deleteObjectTagging: deleteObjectTagging,\n selectObjectContent: selectObjectContent,\n appendObject: appendObject,\n\n // 分块上传相关方法\n uploadPartCopy: uploadPartCopy,\n multipartInit: multipartInit,\n multipartUpload: multipartUpload,\n multipartComplete: multipartComplete,\n multipartList: multipartList,\n multipartListPart: multipartListPart,\n multipartAbort: multipartAbort,\n\n // 工具方法\n request: request,\n getObjectUrl: getObjectUrl,\n getAuth: getAuth,\n};\n\nfunction warnOldApi(apiName, fn, proto) {\n util.each(['Cors', 'Acl'], function (suffix) {\n if (apiName.slice(-suffix.length) === suffix) {\n var oldName = apiName.slice(0, -suffix.length) + suffix.toUpperCase();\n var apiFn = util.apiWrapper(apiName, fn);\n var warned = false;\n proto[oldName] = function () {\n !warned && console.warn('warning: cos.' + oldName + ' has been deprecated. Please Use cos.' + apiName + ' instead.');\n warned = true;\n apiFn.apply(this, arguments);\n };\n }\n });\n}\n\nmodule.exports.init = function (COS, task) {\n task.transferToTaskMethod(API_MAP, 'putObject');\n util.each(API_MAP, function (fn, apiName) {\n COS.prototype[apiName] = util.apiWrapper(apiName, fn);\n warnOldApi(apiName, fn, COS.prototype);\n });\n};\n\n\n","//copyright Ryan Day 2010 , Joscha Feth 2013 [MIT Licensed]\n\nvar element_start_char =\n \"a-zA-Z_\\u00C0-\\u00D6\\u00D8-\\u00F6\\u00F8-\\u00FF\\u0370-\\u037D\\u037F-\\u1FFF\\u200C-\\u200D\\u2070-\\u218F\\u2C00-\\u2FFF\\u3001-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFFD\";\nvar element_non_start_char = \"\\-.0-9\\u00B7\\u0300-\\u036F\\u203F\\u2040\";\nvar element_replace = new RegExp(\"^([^\" + element_start_char + \"])|^((x|X)(m|M)(l|L))|([^\" + element_start_char + element_non_start_char + \"])\", \"g\");\nvar not_safe_in_xml = /[^\\x09\\x0A\\x0D\\x20-\\xFF\\x85\\xA0-\\uD7FF\\uE000-\\uFDCF\\uFDE0-\\uFFFD]/gm;\n\nvar objKeys = function (obj) {\n var l = [];\n if (obj instanceof Object) {\n for (var k in obj) {\n if (obj.hasOwnProperty(k)) {\n l.push(k);\n }\n }\n }\n return l;\n};\nvar process_to_xml = function (node_data, options) {\n\n var makeNode = function (name, content, attributes, level, hasSubNodes) {\n var indent_value = options.indent !== undefined ? options.indent : \"\\t\";\n var indent = options.prettyPrint ? '\\n' + new Array(level).join(indent_value) : '';\n if (options.removeIllegalNameCharacters) {\n name = name.replace(element_replace, '_');\n }\n\n var node = [indent, '<', name, (attributes || '')];\n if (content && content.length > 0) {\n node.push('>')\n node.push(content);\n hasSubNodes && node.push(indent);\n node.push('');\n } else {\n node.push('/>');\n }\n return node.join('');\n };\n\n return (function fn(node_data, node_descriptor, level) {\n var type = typeof node_data;\n if ((Array.isArray) ? Array.isArray(node_data) : node_data instanceof Array) {\n type = 'array';\n } else if (node_data instanceof Date) {\n type = 'date';\n }\n\n switch (type) {\n //if value is an array create child nodes from values\n case 'array':\n var ret = [];\n node_data.map(function (v) {\n ret.push(fn(v, 1, level + 1));\n //entries that are values of an array are the only ones that can be special node descriptors\n });\n options.prettyPrint && ret.push('\\n');\n return ret.join('');\n break;\n\n case 'date':\n // cast dates to ISO 8601 date (soap likes it)\n return node_data.toJSON ? node_data.toJSON() : node_data + '';\n break;\n\n case 'object':\n var nodes = [];\n for (var name in node_data) {\n if (node_data.hasOwnProperty(name)) {\n if (node_data[name] instanceof Array) {\n for (var j = 0; j < node_data[name].length; j++) {\n if (node_data[name].hasOwnProperty(j)) {\n nodes.push(makeNode(name, fn(node_data[name][j], 0, level + 1), null, level + 1, objKeys(node_data[name][j]).length));\n }\n }\n } else {\n nodes.push(makeNode(name, fn(node_data[name], 0, level + 1), null, level + 1));\n }\n }\n }\n options.prettyPrint && nodes.length > 0 && nodes.push('\\n');\n return nodes.join('');\n break;\n\n case 'function':\n return node_data();\n break;\n\n default:\n return options.escape ? esc(node_data) : '' + node_data;\n }\n\n }(node_data, 0, 0))\n};\n\n\nvar xml_header = function (standalone) {\n var ret = ['');\n\n return ret.join('');\n};\n\nfunction esc(str) {\n return ('' + str).replace(/&/g, '&')\n .replace(//g, '>')\n .replace(/'/g, ''')\n .replace(/\"/g, '"')\n .replace(not_safe_in_xml, '');\n}\n\nmodule.exports = function (obj, options) {\n if (!options) {\n options = {\n xmlHeader: {\n standalone: true\n },\n prettyPrint: true,\n indent: \" \",\n escape: true,\n };\n }\n\n if (typeof obj == 'string') {\n try {\n obj = JSON.parse(obj.toString());\n } catch (e) {\n return false;\n }\n }\n\n var xmlheader = '';\n var docType = '';\n if (options) {\n if (typeof options == 'object') {\n // our config is an object\n\n if (options.xmlHeader) {\n // the user wants an xml header\n xmlheader = xml_header(!!options.xmlHeader.standalone);\n }\n\n if (typeof options.docType != 'undefined') {\n docType = ''\n }\n } else {\n // our config is a boolean value, so just add xml header\n xmlheader = xml_header();\n }\n }\n options = options || {}\n\n var ret = [\n xmlheader,\n (options.prettyPrint && docType ? '\\n' : ''),\n docType,\n process_to_xml(obj, options)\n ];\n return ret.join('').replace(/\\n{2,}/g, '\\n').replace(/\\s+$/g, '');\n};","var eachLimit = function (arr, limit, iterator, callback) {\n callback = callback || function () {};\n if (!arr.length || limit <= 0) {\n return callback();\n }\n\n var completed = 0;\n var started = 0;\n var running = 0;\n\n (function replenish () {\n if (completed >= arr.length) {\n return callback();\n }\n\n while (running < limit && started < arr.length) {\n started += 1;\n running += 1;\n iterator(arr[started - 1], function (err) {\n\n if (err) {\n callback(err);\n callback = function () {};\n } else {\n completed += 1;\n running -= 1;\n if (completed >= arr.length) {\n callback();\n } else {\n replenish();\n }\n }\n });\n }\n })();\n};\n\nvar retry = function (times, iterator, callback) {\n var next = function (index) {\n iterator(function (err, data) {\n if (err && index < times) {\n next(index + 1);\n } else {\n callback(err, data);\n }\n });\n };\n if (times < 1) {\n callback();\n } else {\n next(1);\n }\n};\n\nvar async = {\n eachLimit: eachLimit,\n retry: retry\n};\n\nmodule.exports = async;","var stringifyPrimitive = function(v) {\n switch (typeof v) {\n case 'string':\n return v;\n case 'boolean':\n return v ? 'true' : 'false';\n case 'number':\n return isFinite(v) ? v : '';\n default:\n return '';\n }\n};\n\nvar queryStringify = function(obj, sep, eq, name) {\n sep = sep || '&';\n eq = eq || '=';\n if (obj === null) {\n obj = undefined;\n }\n if (typeof obj === 'object') {\n return Object.keys(obj).map(function(k) {\n var ks = encodeURIComponent(stringifyPrimitive(k)) + eq;\n if (Array.isArray(obj[k])) {\n return obj[k].map(function(v) {\n return ks + encodeURIComponent(stringifyPrimitive(v));\n }).join(sep);\n } else {\n return ks + encodeURIComponent(stringifyPrimitive(obj[k]));\n }\n }).filter(Boolean).join(sep);\n\n }\n if (!name) return '';\n return encodeURIComponent(stringifyPrimitive(name)) + eq +\n encodeURIComponent(stringifyPrimitive(obj));\n};\n\nvar xhrRes = function (err, xhr, body) {\n var headers = {};\n xhr.getAllResponseHeaders().trim().split('\\n').forEach(function (item) {\n if (item) {\n var index = item.indexOf(':');\n var key = item.substr(0, index).trim().toLowerCase();\n var val = item.substr(index + 1).trim();\n headers[key] = val;\n }\n });\n return {\n error: err,\n statusCode: xhr.status,\n statusMessage: xhr.statusText,\n headers: headers,\n body: body,\n };\n};\n\nvar xhrBody = function (xhr, dataType) {\n return !dataType && dataType === 'text' ? xhr.responseText : xhr.response;\n};\n\nvar request = function (opt, callback) {\n\n // method\n var method = (opt.method || 'GET').toUpperCase();\n\n // url、qs\n var url = opt.url;\n if (opt.qs) {\n var qsStr = queryStringify(opt.qs);\n if (qsStr) {\n url += (url.indexOf('?') === -1 ? '?' : '&') + qsStr;\n }\n }\n\n // 创建 ajax 实例\n var xhr = new XMLHttpRequest();\n xhr.open(method, url, true);\n xhr.responseType = opt.dataType || 'text';\n\n // 处理 xhrFields 属性\n if (opt.xhrFields) {\n for (var xhrField in opt.xhrFields) {\n xhr[xhrField] = opt.xhrFields[xhrField]\n }\n }\n\n // 处理 headers\n var headers = opt.headers;\n if (headers) {\n for (var key in headers) {\n if (headers.hasOwnProperty(key) &&\n key.toLowerCase() !== 'content-length' &&\n key.toLowerCase() !== 'user-agent' &&\n key.toLowerCase() !== 'origin' &&\n key.toLowerCase() !== 'host') {\n xhr.setRequestHeader(key, headers[key]);\n }\n }\n }\n\n // onprogress\n if (opt.onProgress && xhr.upload) xhr.upload.onprogress = opt.onProgress;\n if (opt.onDownloadProgress) xhr.onprogress = opt.onDownloadProgress;\n\n // timeout\n if (opt.timeout) xhr.timeout = opt.timeout;\n xhr.ontimeout = function(event){\n var error = new Error('timeout');\n callback(xhrRes(error, xhr));\n };\n\n // success 2xx/3xx/4xx\n xhr.onload = function () {\n callback(xhrRes(null, xhr, xhrBody(xhr, opt.dataType)));\n };\n\n // error 5xx/0 (网络错误、跨域报错、Https connect-src 限制的报错时 statusCode 为 0)\n xhr.onerror = function (err) {\n var body = xhrBody(xhr, opt.dataType);\n if (body) { // 5xx\n callback(xhrRes(null, xhr, body));\n } else { // 0\n var error = xhr.statusText;\n if (!error && xhr.status === 0) error = new Error('CORS blocked or network error');\n callback(xhrRes(error, xhr, body));\n }\n };\n\n // send\n xhr.send(opt.body || '');\n\n // 返回 ajax 实例,用于外部调用 xhr.abort\n return xhr;\n};\n\nmodule.exports = request;\n","//[4] \tNameStartChar\t ::= \t\":\" | [A-Z] | \"_\" | [a-z] | [#xC0-#xD6] | [#xD8-#xF6] | [#xF8-#x2FF] | [#x370-#x37D] | [#x37F-#x1FFF] | [#x200C-#x200D] | [#x2070-#x218F] | [#x2C00-#x2FEF] | [#x3001-#xD7FF] | [#xF900-#xFDCF] | [#xFDF0-#xFFFD] | [#x10000-#xEFFFF]\r\n//[4a] \tNameChar\t ::= \tNameStartChar | \"-\" | \".\" | [0-9] | #xB7 | [#x0300-#x036F] | [#x203F-#x2040]\r\n//[5] \tName\t ::= \tNameStartChar (NameChar)*\r\nvar nameStartChar = /[A-Z_a-z\\xC0-\\xD6\\xD8-\\xF6\\u00F8-\\u02FF\\u0370-\\u037D\\u037F-\\u1FFF\\u200C-\\u200D\\u2070-\\u218F\\u2C00-\\u2FEF\\u3001-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFFD]///\\u10000-\\uEFFFF\r\nvar nameChar = new RegExp(\"[\\\\-\\\\.0-9\"+nameStartChar.source.slice(1,-1)+\"\\\\u00B7\\\\u0300-\\\\u036F\\\\u203F-\\\\u2040]\");\r\nvar tagNamePattern = new RegExp('^'+nameStartChar.source+nameChar.source+'*(?:\\:'+nameStartChar.source+nameChar.source+'*)?$');\r\n//var tagNamePattern = /^[a-zA-Z_][\\w\\-\\.]*(?:\\:[a-zA-Z_][\\w\\-\\.]*)?$/\r\n//var handlers = 'resolveEntity,getExternalSubset,characters,endDocument,endElement,endPrefixMapping,ignorableWhitespace,processingInstruction,setDocumentLocator,skippedEntity,startDocument,startElement,startPrefixMapping,notationDecl,unparsedEntityDecl,error,fatalError,warning,attributeDecl,elementDecl,externalEntityDecl,internalEntityDecl,comment,endCDATA,endDTD,endEntity,startCDATA,startDTD,startEntity'.split(',')\r\n\r\n//S_TAG,\tS_ATTR,\tS_EQ,\tS_ATTR_NOQUOT_VALUE\r\n//S_ATTR_SPACE,\tS_ATTR_END,\tS_TAG_SPACE, S_TAG_CLOSE\r\nvar S_TAG = 0;//tag name offerring\r\nvar S_ATTR = 1;//attr name offerring \r\nvar S_ATTR_SPACE=2;//attr name end and space offer\r\nvar S_EQ = 3;//=space?\r\nvar S_ATTR_NOQUOT_VALUE = 4;//attr value(no quot value only)\r\nvar S_ATTR_END = 5;//attr value end and no space(quot end)\r\nvar S_TAG_SPACE = 6;//(attr value end || tag end ) && (space offer)\r\nvar S_TAG_CLOSE = 7;//closed el\r\n\r\nfunction XMLReader(){\r\n\t\r\n}\r\n\r\nXMLReader.prototype = {\r\n\tparse:function(source,defaultNSMap,entityMap){\r\n\t\tvar domBuilder = this.domBuilder;\r\n\t\tdomBuilder.startDocument();\r\n\t\t_copy(defaultNSMap ,defaultNSMap = {})\r\n\t\tparse(source,defaultNSMap,entityMap,\r\n\t\t\t\tdomBuilder,this.errorHandler);\r\n\t\tdomBuilder.endDocument();\r\n\t}\r\n}\r\nfunction parse(source,defaultNSMapCopy,entityMap,domBuilder,errorHandler){\r\n\tfunction fixedFromCharCode(code) {\r\n\t\t// String.prototype.fromCharCode does not supports\r\n\t\t// > 2 bytes unicode chars directly\r\n\t\tif (code > 0xffff) {\r\n\t\t\tcode -= 0x10000;\r\n\t\t\tvar surrogate1 = 0xd800 + (code >> 10)\r\n\t\t\t\t, surrogate2 = 0xdc00 + (code & 0x3ff);\r\n\r\n\t\t\treturn String.fromCharCode(surrogate1, surrogate2);\r\n\t\t} else {\r\n\t\t\treturn String.fromCharCode(code);\r\n\t\t}\r\n\t}\r\n\tfunction entityReplacer(a){\r\n\t\tvar k = a.slice(1,-1);\r\n\t\tif(k in entityMap){\r\n\t\t\treturn entityMap[k]; \r\n\t\t}else if(k.charAt(0) === '#'){\r\n\t\t\treturn fixedFromCharCode(parseInt(k.substr(1).replace('x','0x')))\r\n\t\t}else{\r\n\t\t\terrorHandler.error('entity not found:'+a);\r\n\t\t\treturn a;\r\n\t\t}\r\n\t}\r\n\tfunction appendText(end){//has some bugs\r\n\t\tif(end>start){\r\n\t\t\tvar xt = source.substring(start,end).replace(/&#?\\w+;/g,entityReplacer);\r\n\t\t\tlocator&&position(start);\r\n\t\t\tdomBuilder.characters(xt,0,end-start);\r\n\t\t\tstart = end\r\n\t\t}\r\n\t}\r\n\tfunction position(p,m){\r\n\t\twhile(p>=lineEnd && (m = linePattern.exec(source))){\r\n\t\t\tlineStart = m.index;\r\n\t\t\tlineEnd = lineStart + m[0].length;\r\n\t\t\tlocator.lineNumber++;\r\n\t\t\t//console.log('line++:',locator,startPos,endPos)\r\n\t\t}\r\n\t\tlocator.columnNumber = p-lineStart+1;\r\n\t}\r\n\tvar lineStart = 0;\r\n\tvar lineEnd = 0;\r\n\tvar linePattern = /.*(?:\\r\\n?|\\n)|.*$/g\r\n\tvar locator = domBuilder.locator;\r\n\t\r\n\tvar parseStack = [{currentNSMap:defaultNSMapCopy}]\r\n\tvar closeMap = {};\r\n\tvar start = 0;\r\n\twhile(true){\r\n\t\ttry{\r\n\t\t\tvar tagStart = source.indexOf('<',start);\r\n\t\t\tif(tagStart<0){\r\n\t\t\t\tif(!source.substr(start).match(/^\\s*$/)){\r\n\t\t\t\t\tvar doc = domBuilder.doc;\r\n\t \t\t\tvar text = doc.createTextNode(source.substr(start));\r\n\t \t\t\tdoc.appendChild(text);\r\n\t \t\t\tdomBuilder.currentElement = text;\r\n\t\t\t\t}\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\t\t\tif(tagStart>start){\r\n\t\t\t\tappendText(tagStart);\r\n\t\t\t}\r\n\t\t\tswitch(source.charAt(tagStart+1)){\r\n\t\t\tcase '/':\r\n\t\t\t\tvar end = source.indexOf('>',tagStart+3);\r\n\t\t\t\tvar tagName = source.substring(tagStart+2,end);\r\n\t\t\t\tvar config = parseStack.pop();\r\n\t\t\t\tif(end<0){\r\n\t\t\t\t\t\r\n\t \t\ttagName = source.substring(tagStart+2).replace(/[\\s<].*/,'');\r\n\t \t\t//console.error('#@@@@@@'+tagName)\r\n\t \t\terrorHandler.error(\"end tag name: \"+tagName+' is not complete:'+config.tagName);\r\n\t \t\tend = tagStart+1+tagName.length;\r\n\t \t}else if(tagName.match(/\\s\r\n\t\t\t\tlocator&&position(tagStart);\r\n\t\t\t\tend = parseInstruction(source,tagStart,domBuilder);\r\n\t\t\t\tbreak;\r\n\t\t\tcase '!':// start){\r\n\t\t\tstart = end;\r\n\t\t}else{\r\n\t\t\t//TODO: 这里有可能sax回退,有位置错误风险\r\n\t\t\tappendText(Math.max(tagStart,start)+1);\r\n\t\t}\r\n\t}\r\n}\r\nfunction copyLocator(f,t){\r\n\tt.lineNumber = f.lineNumber;\r\n\tt.columnNumber = f.columnNumber;\r\n\treturn t;\r\n}\r\n\r\n/**\r\n * @see #appendElement(source,elStartEnd,el,selfClosed,entityReplacer,domBuilder,parseStack);\r\n * @return end of the elementStartPart(end of elementEndPart for selfClosed el)\r\n */\r\nfunction parseElementStartPart(source,start,el,currentNSMap,entityReplacer,errorHandler){\r\n\tvar attrName;\r\n\tvar value;\r\n\tvar p = ++start;\r\n\tvar s = S_TAG;//status\r\n\twhile(true){\r\n\t\tvar c = source.charAt(p);\r\n\t\tswitch(c){\r\n\t\tcase '=':\r\n\t\t\tif(s === S_ATTR){//attrName\r\n\t\t\t\tattrName = source.slice(start,p);\r\n\t\t\t\ts = S_EQ;\r\n\t\t\t}else if(s === S_ATTR_SPACE){\r\n\t\t\t\ts = S_EQ;\r\n\t\t\t}else{\r\n\t\t\t\t//fatalError: equal must after attrName or space after attrName\r\n\t\t\t\tthrow new Error('attribute equal must after attrName');\r\n\t\t\t}\r\n\t\t\tbreak;\r\n\t\tcase '\\'':\r\n\t\tcase '\"':\r\n\t\t\tif(s === S_EQ || s === S_ATTR //|| s == S_ATTR_SPACE\r\n\t\t\t\t){//equal\r\n\t\t\t\tif(s === S_ATTR){\r\n\t\t\t\t\terrorHandler.warning('attribute value must after \"=\"')\r\n\t\t\t\t\tattrName = source.slice(start,p)\r\n\t\t\t\t}\r\n\t\t\t\tstart = p+1;\r\n\t\t\t\tp = source.indexOf(c,start)\r\n\t\t\t\tif(p>0){\r\n\t\t\t\t\tvalue = source.slice(start,p).replace(/&#?\\w+;/g,entityReplacer);\r\n\t\t\t\t\tel.add(attrName,value,start-1);\r\n\t\t\t\t\ts = S_ATTR_END;\r\n\t\t\t\t}else{\r\n\t\t\t\t\t//fatalError: no end quot match\r\n\t\t\t\t\tthrow new Error('attribute value no end \\''+c+'\\' match');\r\n\t\t\t\t}\r\n\t\t\t}else if(s == S_ATTR_NOQUOT_VALUE){\r\n\t\t\t\tvalue = source.slice(start,p).replace(/&#?\\w+;/g,entityReplacer);\r\n\t\t\t\t//console.log(attrName,value,start,p)\r\n\t\t\t\tel.add(attrName,value,start);\r\n\t\t\t\t//console.dir(el)\r\n\t\t\t\terrorHandler.warning('attribute \"'+attrName+'\" missed start quot('+c+')!!');\r\n\t\t\t\tstart = p+1;\r\n\t\t\t\ts = S_ATTR_END\r\n\t\t\t}else{\r\n\t\t\t\t//fatalError: no equal before\r\n\t\t\t\tthrow new Error('attribute value must after \"=\"');\r\n\t\t\t}\r\n\t\t\tbreak;\r\n\t\tcase '/':\r\n\t\t\tswitch(s){\r\n\t\t\tcase S_TAG:\r\n\t\t\t\tel.setTagName(source.slice(start,p));\r\n\t\t\tcase S_ATTR_END:\r\n\t\t\tcase S_TAG_SPACE:\r\n\t\t\tcase S_TAG_CLOSE:\r\n\t\t\t\ts =S_TAG_CLOSE;\r\n\t\t\t\tel.closed = true;\r\n\t\t\tcase S_ATTR_NOQUOT_VALUE:\r\n\t\t\tcase S_ATTR:\r\n\t\t\tcase S_ATTR_SPACE:\r\n\t\t\t\tbreak;\r\n\t\t\t//case S_EQ:\r\n\t\t\tdefault:\r\n\t\t\t\tthrow new Error(\"attribute invalid close char('/')\")\r\n\t\t\t}\r\n\t\t\tbreak;\r\n\t\tcase ''://end document\r\n\t\t\t//throw new Error('unexpected end of input')\r\n\t\t\terrorHandler.error('unexpected end of input');\r\n\t\t\tif(s == S_TAG){\r\n\t\t\t\tel.setTagName(source.slice(start,p));\r\n\t\t\t}\r\n\t\t\treturn p;\r\n\t\tcase '>':\r\n\t\t\tswitch(s){\r\n\t\t\tcase S_TAG:\r\n\t\t\t\tel.setTagName(source.slice(start,p));\r\n\t\t\tcase S_ATTR_END:\r\n\t\t\tcase S_TAG_SPACE:\r\n\t\t\tcase S_TAG_CLOSE:\r\n\t\t\t\tbreak;//normal\r\n\t\t\tcase S_ATTR_NOQUOT_VALUE://Compatible state\r\n\t\t\tcase S_ATTR:\r\n\t\t\t\tvalue = source.slice(start,p);\r\n\t\t\t\tif(value.slice(-1) === '/'){\r\n\t\t\t\t\tel.closed = true;\r\n\t\t\t\t\tvalue = value.slice(0,-1)\r\n\t\t\t\t}\r\n\t\t\tcase S_ATTR_SPACE:\r\n\t\t\t\tif(s === S_ATTR_SPACE){\r\n\t\t\t\t\tvalue = attrName;\r\n\t\t\t\t}\r\n\t\t\t\tif(s == S_ATTR_NOQUOT_VALUE){\r\n\t\t\t\t\terrorHandler.warning('attribute \"'+value+'\" missed quot(\")!!');\r\n\t\t\t\t\tel.add(attrName,value.replace(/&#?\\w+;/g,entityReplacer),start)\r\n\t\t\t\t}else{\r\n\t\t\t\t\tif(currentNSMap[''] !== 'http://www.w3.org/1999/xhtml' || !value.match(/^(?:disabled|checked|selected)$/i)){\r\n\t\t\t\t\t\terrorHandler.warning('attribute \"'+value+'\" missed value!! \"'+value+'\" instead!!')\r\n\t\t\t\t\t}\r\n\t\t\t\t\tel.add(value,value,start)\r\n\t\t\t\t}\r\n\t\t\t\tbreak;\r\n\t\t\tcase S_EQ:\r\n\t\t\t\tthrow new Error('attribute value missed!!');\r\n\t\t\t}\r\n//\t\t\tconsole.log(tagName,tagNamePattern,tagNamePattern.test(tagName))\r\n\t\t\treturn p;\r\n\t\t/*xml space '\\x20' | #x9 | #xD | #xA; */\r\n\t\tcase '\\u0080':\r\n\t\t\tc = ' ';\r\n\t\tdefault:\r\n\t\t\tif(c<= ' '){//space\r\n\t\t\t\tswitch(s){\r\n\t\t\t\tcase S_TAG:\r\n\t\t\t\t\tel.setTagName(source.slice(start,p));//tagName\r\n\t\t\t\t\ts = S_TAG_SPACE;\r\n\t\t\t\t\tbreak;\r\n\t\t\t\tcase S_ATTR:\r\n\t\t\t\t\tattrName = source.slice(start,p)\r\n\t\t\t\t\ts = S_ATTR_SPACE;\r\n\t\t\t\t\tbreak;\r\n\t\t\t\tcase S_ATTR_NOQUOT_VALUE:\r\n\t\t\t\t\tvar value = source.slice(start,p).replace(/&#?\\w+;/g,entityReplacer);\r\n\t\t\t\t\terrorHandler.warning('attribute \"'+value+'\" missed quot(\")!!');\r\n\t\t\t\t\tel.add(attrName,value,start)\r\n\t\t\t\tcase S_ATTR_END:\r\n\t\t\t\t\ts = S_TAG_SPACE;\r\n\t\t\t\t\tbreak;\r\n\t\t\t\t//case S_TAG_SPACE:\r\n\t\t\t\t//case S_EQ:\r\n\t\t\t\t//case S_ATTR_SPACE:\r\n\t\t\t\t//\tvoid();break;\r\n\t\t\t\t//case S_TAG_CLOSE:\r\n\t\t\t\t\t//ignore warning\r\n\t\t\t\t}\r\n\t\t\t}else{//not space\r\n//S_TAG,\tS_ATTR,\tS_EQ,\tS_ATTR_NOQUOT_VALUE\r\n//S_ATTR_SPACE,\tS_ATTR_END,\tS_TAG_SPACE, S_TAG_CLOSE\r\n\t\t\t\tswitch(s){\r\n\t\t\t\t//case S_TAG:void();break;\r\n\t\t\t\t//case S_ATTR:void();break;\r\n\t\t\t\t//case S_ATTR_NOQUOT_VALUE:void();break;\r\n\t\t\t\tcase S_ATTR_SPACE:\r\n\t\t\t\t\tvar tagName = el.tagName;\r\n\t\t\t\t\tif(currentNSMap[''] !== 'http://www.w3.org/1999/xhtml' || !attrName.match(/^(?:disabled|checked|selected)$/i)){\r\n\t\t\t\t\t\terrorHandler.warning('attribute \"'+attrName+'\" missed value!! \"'+attrName+'\" instead2!!')\r\n\t\t\t\t\t}\r\n\t\t\t\t\tel.add(attrName,attrName,start);\r\n\t\t\t\t\tstart = p;\r\n\t\t\t\t\ts = S_ATTR;\r\n\t\t\t\t\tbreak;\r\n\t\t\t\tcase S_ATTR_END:\r\n\t\t\t\t\terrorHandler.warning('attribute space is required\"'+attrName+'\"!!')\r\n\t\t\t\tcase S_TAG_SPACE:\r\n\t\t\t\t\ts = S_ATTR;\r\n\t\t\t\t\tstart = p;\r\n\t\t\t\t\tbreak;\r\n\t\t\t\tcase S_EQ:\r\n\t\t\t\t\ts = S_ATTR_NOQUOT_VALUE;\r\n\t\t\t\t\tstart = p;\r\n\t\t\t\t\tbreak;\r\n\t\t\t\tcase S_TAG_CLOSE:\r\n\t\t\t\t\tthrow new Error(\"elements closed character '/' and '>' must be connected to\");\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}//end outer switch\r\n\t\t//console.log('p++',p)\r\n\t\tp++;\r\n\t}\r\n}\r\n/**\r\n * @return true if has new namespace define\r\n */\r\nfunction appendElement(el,domBuilder,currentNSMap){\r\n\tvar tagName = el.tagName;\r\n\tvar localNSMap = null;\r\n\t//var currentNSMap = parseStack[parseStack.length-1].currentNSMap;\r\n\tvar i = el.length;\r\n\twhile(i--){\r\n\t\tvar a = el[i];\r\n\t\tvar qName = a.qName;\r\n\t\tvar value = a.value;\r\n\t\tvar nsp = qName.indexOf(':');\r\n\t\tif(nsp>0){\r\n\t\t\tvar prefix = a.prefix = qName.slice(0,nsp);\r\n\t\t\tvar localName = qName.slice(nsp+1);\r\n\t\t\tvar nsPrefix = prefix === 'xmlns' && localName\r\n\t\t}else{\r\n\t\t\tlocalName = qName;\r\n\t\t\tprefix = null\r\n\t\t\tnsPrefix = qName === 'xmlns' && ''\r\n\t\t}\r\n\t\t//can not set prefix,because prefix !== ''\r\n\t\ta.localName = localName ;\r\n\t\t//prefix == null for no ns prefix attribute \r\n\t\tif(nsPrefix !== false){//hack!!\r\n\t\t\tif(localNSMap == null){\r\n\t\t\t\tlocalNSMap = {}\r\n\t\t\t\t//console.log(currentNSMap,0)\r\n\t\t\t\t_copy(currentNSMap,currentNSMap={})\r\n\t\t\t\t//console.log(currentNSMap,1)\r\n\t\t\t}\r\n\t\t\tcurrentNSMap[nsPrefix] = localNSMap[nsPrefix] = value;\r\n\t\t\ta.uri = 'http://www.w3.org/2000/xmlns/'\r\n\t\t\tdomBuilder.startPrefixMapping(nsPrefix, value) \r\n\t\t}\r\n\t}\r\n\tvar i = el.length;\r\n\twhile(i--){\r\n\t\ta = el[i];\r\n\t\tvar prefix = a.prefix;\r\n\t\tif(prefix){//no prefix attribute has no namespace\r\n\t\t\tif(prefix === 'xml'){\r\n\t\t\t\ta.uri = 'http://www.w3.org/XML/1998/namespace';\r\n\t\t\t}if(prefix !== 'xmlns'){\r\n\t\t\t\ta.uri = currentNSMap[prefix || '']\r\n\t\t\t\t\r\n\t\t\t\t//{console.log('###'+a.qName,domBuilder.locator.systemId+'',currentNSMap,a.uri)}\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\tvar nsp = tagName.indexOf(':');\r\n\tif(nsp>0){\r\n\t\tprefix = el.prefix = tagName.slice(0,nsp);\r\n\t\tlocalName = el.localName = tagName.slice(nsp+1);\r\n\t}else{\r\n\t\tprefix = null;//important!!\r\n\t\tlocalName = el.localName = tagName;\r\n\t}\r\n\t//no prefix element has default namespace\r\n\tvar ns = el.uri = currentNSMap[prefix || ''];\r\n\tdomBuilder.startElement(ns,localName,tagName,el);\r\n\t//endPrefixMapping and startPrefixMapping have not any help for dom builder\r\n\t//localNSMap = null\r\n\tif(el.closed){\r\n\t\tdomBuilder.endElement(ns,localName,tagName);\r\n\t\tif(localNSMap){\r\n\t\t\tfor(prefix in localNSMap){\r\n\t\t\t\tdomBuilder.endPrefixMapping(prefix) \r\n\t\t\t}\r\n\t\t}\r\n\t}else{\r\n\t\tel.currentNSMap = currentNSMap;\r\n\t\tel.localNSMap = localNSMap;\r\n\t\t//parseStack.push(el);\r\n\t\treturn true;\r\n\t}\r\n}\r\nfunction parseHtmlSpecialContent(source,elStartEnd,tagName,entityReplacer,domBuilder){\r\n\tif(/^(?:script|textarea)$/i.test(tagName)){\r\n\t\tvar elEndStart = source.indexOf('',elStartEnd);\r\n\t\tvar text = source.substring(elStartEnd+1,elEndStart);\r\n\t\tif(/[&<]/.test(text)){\r\n\t\t\tif(/^script$/i.test(tagName)){\r\n\t\t\t\t//if(!/\\]\\]>/.test(text)){\r\n\t\t\t\t\t//lexHandler.startCDATA();\r\n\t\t\t\t\tdomBuilder.characters(text,0,text.length);\r\n\t\t\t\t\t//lexHandler.endCDATA();\r\n\t\t\t\t\treturn elEndStart;\r\n\t\t\t\t//}\r\n\t\t\t}//}else{//text area\r\n\t\t\t\ttext = text.replace(/&#?\\w+;/g,entityReplacer);\r\n\t\t\t\tdomBuilder.characters(text,0,text.length);\r\n\t\t\t\treturn elEndStart;\r\n\t\t\t//}\r\n\t\t\t\r\n\t\t}\r\n\t}\r\n\treturn elStartEnd+1;\r\n}\r\nfunction fixSelfClosed(source,elStartEnd,tagName,closeMap){\r\n\t//if(tagName in closeMap){\r\n\tvar pos = closeMap[tagName];\r\n\tif(pos == null){\r\n\t\t//console.log(tagName)\r\n\t\tpos = source.lastIndexOf('')\r\n\t\tif(pos',start+4);\r\n\t\t\t//append comment source.substring(4,end)//