@aurigami/sdk 1.5.2 → 1.5.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/SDK.d.ts +2 -0
- package/dist/sdk.cjs.development.js +5 -4
- package/dist/sdk.cjs.development.js.map +1 -1
- package/dist/sdk.cjs.production.min.js +1 -1
- package/dist/sdk.cjs.production.min.js.map +1 -1
- package/dist/sdk.esm.js +5 -4
- package/dist/sdk.esm.js.map +1 -1
- package/package.json +4 -1
- package/src/SDK.ts +6 -4
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sdk.cjs.development.js","sources":["../node_modules/regenerator-runtime/runtime.js","../src/BlockchainEntity.ts","../src/constants.ts","../src/aurora-api-helpers.ts","../src/decimals.ts","../src/helpers.ts","../src/types.ts","../src/token.ts","../src/tokenAmount.ts","../src/priceFetcher.ts","../src/MoneyMarket.ts","../src/Papermill.ts","../src/Staking.ts","../src/SDK.ts","../src/dummy.ts","../src/transfer-event-query.ts","../src/airdrop-lottery.ts","../src/index.ts"],"sourcesContent":["/**\n * Copyright (c) 2014-present, Facebook, Inc.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\nvar runtime = (function (exports) {\n \"use strict\";\n\n var Op = Object.prototype;\n var hasOwn = Op.hasOwnProperty;\n var undefined; // More compressible than void 0.\n var $Symbol = typeof Symbol === \"function\" ? Symbol : {};\n var iteratorSymbol = $Symbol.iterator || \"@@iterator\";\n var asyncIteratorSymbol = $Symbol.asyncIterator || \"@@asyncIterator\";\n var toStringTagSymbol = $Symbol.toStringTag || \"@@toStringTag\";\n\n function define(obj, key, value) {\n Object.defineProperty(obj, key, {\n value: value,\n enumerable: true,\n configurable: true,\n writable: true\n });\n return obj[key];\n }\n try {\n // IE 8 has a broken Object.defineProperty that only works on DOM objects.\n define({}, \"\");\n } catch (err) {\n define = function(obj, key, value) {\n return obj[key] = value;\n };\n }\n\n function wrap(innerFn, outerFn, self, tryLocsList) {\n // If outerFn provided and outerFn.prototype is a Generator, then outerFn.prototype instanceof Generator.\n var protoGenerator = outerFn && outerFn.prototype instanceof Generator ? outerFn : Generator;\n var generator = Object.create(protoGenerator.prototype);\n var context = new Context(tryLocsList || []);\n\n // The ._invoke method unifies the implementations of the .next,\n // .throw, and .return methods.\n generator._invoke = makeInvokeMethod(innerFn, self, context);\n\n return generator;\n }\n exports.wrap = wrap;\n\n // Try/catch helper to minimize deoptimizations. Returns a completion\n // record like context.tryEntries[i].completion. This interface could\n // have been (and was previously) designed to take a closure to be\n // invoked without arguments, but in all the cases we care about we\n // already have an existing method we want to call, so there's no need\n // to create a new function object. We can even get away with assuming\n // the method takes exactly one argument, since that happens to be true\n // in every case, so we don't have to touch the arguments object. The\n // only additional allocation required is the completion record, which\n // has a stable shape and so hopefully should be cheap to allocate.\n function tryCatch(fn, obj, arg) {\n try {\n return { type: \"normal\", arg: fn.call(obj, arg) };\n } catch (err) {\n return { type: \"throw\", arg: err };\n }\n }\n\n var GenStateSuspendedStart = \"suspendedStart\";\n var GenStateSuspendedYield = \"suspendedYield\";\n var GenStateExecuting = \"executing\";\n var GenStateCompleted = \"completed\";\n\n // Returning this object from the innerFn has the same effect as\n // breaking out of the dispatch switch statement.\n var ContinueSentinel = {};\n\n // Dummy constructor functions that we use as the .constructor and\n // .constructor.prototype properties for functions that return Generator\n // objects. For full spec compliance, you may wish to configure your\n // minifier not to mangle the names of these two functions.\n function Generator() {}\n function GeneratorFunction() {}\n function GeneratorFunctionPrototype() {}\n\n // This is a polyfill for %IteratorPrototype% for environments that\n // don't natively support it.\n var IteratorPrototype = {};\n define(IteratorPrototype, iteratorSymbol, function () {\n return this;\n });\n\n var getProto = Object.getPrototypeOf;\n var NativeIteratorPrototype = getProto && getProto(getProto(values([])));\n if (NativeIteratorPrototype &&\n NativeIteratorPrototype !== Op &&\n hasOwn.call(NativeIteratorPrototype, iteratorSymbol)) {\n // This environment has a native %IteratorPrototype%; use it instead\n // of the polyfill.\n IteratorPrototype = NativeIteratorPrototype;\n }\n\n var Gp = GeneratorFunctionPrototype.prototype =\n Generator.prototype = Object.create(IteratorPrototype);\n GeneratorFunction.prototype = GeneratorFunctionPrototype;\n define(Gp, \"constructor\", GeneratorFunctionPrototype);\n define(GeneratorFunctionPrototype, \"constructor\", GeneratorFunction);\n GeneratorFunction.displayName = define(\n GeneratorFunctionPrototype,\n toStringTagSymbol,\n \"GeneratorFunction\"\n );\n\n // Helper for defining the .next, .throw, and .return methods of the\n // Iterator interface in terms of a single ._invoke method.\n function defineIteratorMethods(prototype) {\n [\"next\", \"throw\", \"return\"].forEach(function(method) {\n define(prototype, method, function(arg) {\n return this._invoke(method, arg);\n });\n });\n }\n\n exports.isGeneratorFunction = function(genFun) {\n var ctor = typeof genFun === \"function\" && genFun.constructor;\n return ctor\n ? ctor === GeneratorFunction ||\n // For the native GeneratorFunction constructor, the best we can\n // do is to check its .name property.\n (ctor.displayName || ctor.name) === \"GeneratorFunction\"\n : false;\n };\n\n exports.mark = function(genFun) {\n if (Object.setPrototypeOf) {\n Object.setPrototypeOf(genFun, GeneratorFunctionPrototype);\n } else {\n genFun.__proto__ = GeneratorFunctionPrototype;\n define(genFun, toStringTagSymbol, \"GeneratorFunction\");\n }\n genFun.prototype = Object.create(Gp);\n return genFun;\n };\n\n // Within the body of any async function, `await x` is transformed to\n // `yield regeneratorRuntime.awrap(x)`, so that the runtime can test\n // `hasOwn.call(value, \"__await\")` to determine if the yielded value is\n // meant to be awaited.\n exports.awrap = function(arg) {\n return { __await: arg };\n };\n\n function AsyncIterator(generator, PromiseImpl) {\n function invoke(method, arg, resolve, reject) {\n var record = tryCatch(generator[method], generator, arg);\n if (record.type === \"throw\") {\n reject(record.arg);\n } else {\n var result = record.arg;\n var value = result.value;\n if (value &&\n typeof value === \"object\" &&\n hasOwn.call(value, \"__await\")) {\n return PromiseImpl.resolve(value.__await).then(function(value) {\n invoke(\"next\", value, resolve, reject);\n }, function(err) {\n invoke(\"throw\", err, resolve, reject);\n });\n }\n\n return PromiseImpl.resolve(value).then(function(unwrapped) {\n // When a yielded Promise is resolved, its final value becomes\n // the .value of the Promise<{value,done}> result for the\n // current iteration.\n result.value = unwrapped;\n resolve(result);\n }, function(error) {\n // If a rejected Promise was yielded, throw the rejection back\n // into the async generator function so it can be handled there.\n return invoke(\"throw\", error, resolve, reject);\n });\n }\n }\n\n var previousPromise;\n\n function enqueue(method, arg) {\n function callInvokeWithMethodAndArg() {\n return new PromiseImpl(function(resolve, reject) {\n invoke(method, arg, resolve, reject);\n });\n }\n\n return previousPromise =\n // If enqueue has been called before, then we want to wait until\n // all previous Promises have been resolved before calling invoke,\n // so that results are always delivered in the correct order. If\n // enqueue has not been called before, then it is important to\n // call invoke immediately, without waiting on a callback to fire,\n // so that the async generator function has the opportunity to do\n // any necessary setup in a predictable way. This predictability\n // is why the Promise constructor synchronously invokes its\n // executor callback, and why async functions synchronously\n // execute code before the first await. Since we implement simple\n // async functions in terms of async generators, it is especially\n // important to get this right, even though it requires care.\n previousPromise ? previousPromise.then(\n callInvokeWithMethodAndArg,\n // Avoid propagating failures to Promises returned by later\n // invocations of the iterator.\n callInvokeWithMethodAndArg\n ) : callInvokeWithMethodAndArg();\n }\n\n // Define the unified helper method that is used to implement .next,\n // .throw, and .return (see defineIteratorMethods).\n this._invoke = enqueue;\n }\n\n defineIteratorMethods(AsyncIterator.prototype);\n define(AsyncIterator.prototype, asyncIteratorSymbol, function () {\n return this;\n });\n exports.AsyncIterator = AsyncIterator;\n\n // Note that simple async functions are implemented on top of\n // AsyncIterator objects; they just return a Promise for the value of\n // the final result produced by the iterator.\n exports.async = function(innerFn, outerFn, self, tryLocsList, PromiseImpl) {\n if (PromiseImpl === void 0) PromiseImpl = Promise;\n\n var iter = new AsyncIterator(\n wrap(innerFn, outerFn, self, tryLocsList),\n PromiseImpl\n );\n\n return exports.isGeneratorFunction(outerFn)\n ? iter // If outerFn is a generator, return the full iterator.\n : iter.next().then(function(result) {\n return result.done ? result.value : iter.next();\n });\n };\n\n function makeInvokeMethod(innerFn, self, context) {\n var state = GenStateSuspendedStart;\n\n return function invoke(method, arg) {\n if (state === GenStateExecuting) {\n throw new Error(\"Generator is already running\");\n }\n\n if (state === GenStateCompleted) {\n if (method === \"throw\") {\n throw arg;\n }\n\n // Be forgiving, per 25.3.3.3.3 of the spec:\n // https://people.mozilla.org/~jorendorff/es6-draft.html#sec-generatorresume\n return doneResult();\n }\n\n context.method = method;\n context.arg = arg;\n\n while (true) {\n var delegate = context.delegate;\n if (delegate) {\n var delegateResult = maybeInvokeDelegate(delegate, context);\n if (delegateResult) {\n if (delegateResult === ContinueSentinel) continue;\n return delegateResult;\n }\n }\n\n if (context.method === \"next\") {\n // Setting context._sent for legacy support of Babel's\n // function.sent implementation.\n context.sent = context._sent = context.arg;\n\n } else if (context.method === \"throw\") {\n if (state === GenStateSuspendedStart) {\n state = GenStateCompleted;\n throw context.arg;\n }\n\n context.dispatchException(context.arg);\n\n } else if (context.method === \"return\") {\n context.abrupt(\"return\", context.arg);\n }\n\n state = GenStateExecuting;\n\n var record = tryCatch(innerFn, self, context);\n if (record.type === \"normal\") {\n // If an exception is thrown from innerFn, we leave state ===\n // GenStateExecuting and loop back for another invocation.\n state = context.done\n ? GenStateCompleted\n : GenStateSuspendedYield;\n\n if (record.arg === ContinueSentinel) {\n continue;\n }\n\n return {\n value: record.arg,\n done: context.done\n };\n\n } else if (record.type === \"throw\") {\n state = GenStateCompleted;\n // Dispatch the exception by looping back around to the\n // context.dispatchException(context.arg) call above.\n context.method = \"throw\";\n context.arg = record.arg;\n }\n }\n };\n }\n\n // Call delegate.iterator[context.method](context.arg) and handle the\n // result, either by returning a { value, done } result from the\n // delegate iterator, or by modifying context.method and context.arg,\n // setting context.delegate to null, and returning the ContinueSentinel.\n function maybeInvokeDelegate(delegate, context) {\n var method = delegate.iterator[context.method];\n if (method === undefined) {\n // A .throw or .return when the delegate iterator has no .throw\n // method always terminates the yield* loop.\n context.delegate = null;\n\n if (context.method === \"throw\") {\n // Note: [\"return\"] must be used for ES3 parsing compatibility.\n if (delegate.iterator[\"return\"]) {\n // If the delegate iterator has a return method, give it a\n // chance to clean up.\n context.method = \"return\";\n context.arg = undefined;\n maybeInvokeDelegate(delegate, context);\n\n if (context.method === \"throw\") {\n // If maybeInvokeDelegate(context) changed context.method from\n // \"return\" to \"throw\", let that override the TypeError below.\n return ContinueSentinel;\n }\n }\n\n context.method = \"throw\";\n context.arg = new TypeError(\n \"The iterator does not provide a 'throw' method\");\n }\n\n return ContinueSentinel;\n }\n\n var record = tryCatch(method, delegate.iterator, context.arg);\n\n if (record.type === \"throw\") {\n context.method = \"throw\";\n context.arg = record.arg;\n context.delegate = null;\n return ContinueSentinel;\n }\n\n var info = record.arg;\n\n if (! info) {\n context.method = \"throw\";\n context.arg = new TypeError(\"iterator result is not an object\");\n context.delegate = null;\n return ContinueSentinel;\n }\n\n if (info.done) {\n // Assign the result of the finished delegate to the temporary\n // variable specified by delegate.resultName (see delegateYield).\n context[delegate.resultName] = info.value;\n\n // Resume execution at the desired location (see delegateYield).\n context.next = delegate.nextLoc;\n\n // If context.method was \"throw\" but the delegate handled the\n // exception, let the outer generator proceed normally. If\n // context.method was \"next\", forget context.arg since it has been\n // \"consumed\" by the delegate iterator. If context.method was\n // \"return\", allow the original .return call to continue in the\n // outer generator.\n if (context.method !== \"return\") {\n context.method = \"next\";\n context.arg = undefined;\n }\n\n } else {\n // Re-yield the result returned by the delegate method.\n return info;\n }\n\n // The delegate iterator is finished, so forget it and continue with\n // the outer generator.\n context.delegate = null;\n return ContinueSentinel;\n }\n\n // Define Generator.prototype.{next,throw,return} in terms of the\n // unified ._invoke helper method.\n defineIteratorMethods(Gp);\n\n define(Gp, toStringTagSymbol, \"Generator\");\n\n // A Generator should always return itself as the iterator object when the\n // @@iterator function is called on it. Some browsers' implementations of the\n // iterator prototype chain incorrectly implement this, causing the Generator\n // object to not be returned from this call. This ensures that doesn't happen.\n // See https://github.com/facebook/regenerator/issues/274 for more details.\n define(Gp, iteratorSymbol, function() {\n return this;\n });\n\n define(Gp, \"toString\", function() {\n return \"[object Generator]\";\n });\n\n function pushTryEntry(locs) {\n var entry = { tryLoc: locs[0] };\n\n if (1 in locs) {\n entry.catchLoc = locs[1];\n }\n\n if (2 in locs) {\n entry.finallyLoc = locs[2];\n entry.afterLoc = locs[3];\n }\n\n this.tryEntries.push(entry);\n }\n\n function resetTryEntry(entry) {\n var record = entry.completion || {};\n record.type = \"normal\";\n delete record.arg;\n entry.completion = record;\n }\n\n function Context(tryLocsList) {\n // The root entry object (effectively a try statement without a catch\n // or a finally block) gives us a place to store values thrown from\n // locations where there is no enclosing try statement.\n this.tryEntries = [{ tryLoc: \"root\" }];\n tryLocsList.forEach(pushTryEntry, this);\n this.reset(true);\n }\n\n exports.keys = function(object) {\n var keys = [];\n for (var key in object) {\n keys.push(key);\n }\n keys.reverse();\n\n // Rather than returning an object with a next method, we keep\n // things simple and return the next function itself.\n return function next() {\n while (keys.length) {\n var key = keys.pop();\n if (key in object) {\n next.value = key;\n next.done = false;\n return next;\n }\n }\n\n // To avoid creating an additional object, we just hang the .value\n // and .done properties off the next function object itself. This\n // also ensures that the minifier will not anonymize the function.\n next.done = true;\n return next;\n };\n };\n\n function values(iterable) {\n if (iterable) {\n var iteratorMethod = iterable[iteratorSymbol];\n if (iteratorMethod) {\n return iteratorMethod.call(iterable);\n }\n\n if (typeof iterable.next === \"function\") {\n return iterable;\n }\n\n if (!isNaN(iterable.length)) {\n var i = -1, next = function next() {\n while (++i < iterable.length) {\n if (hasOwn.call(iterable, i)) {\n next.value = iterable[i];\n next.done = false;\n return next;\n }\n }\n\n next.value = undefined;\n next.done = true;\n\n return next;\n };\n\n return next.next = next;\n }\n }\n\n // Return an iterator with no values.\n return { next: doneResult };\n }\n exports.values = values;\n\n function doneResult() {\n return { value: undefined, done: true };\n }\n\n Context.prototype = {\n constructor: Context,\n\n reset: function(skipTempReset) {\n this.prev = 0;\n this.next = 0;\n // Resetting context._sent for legacy support of Babel's\n // function.sent implementation.\n this.sent = this._sent = undefined;\n this.done = false;\n this.delegate = null;\n\n this.method = \"next\";\n this.arg = undefined;\n\n this.tryEntries.forEach(resetTryEntry);\n\n if (!skipTempReset) {\n for (var name in this) {\n // Not sure about the optimal order of these conditions:\n if (name.charAt(0) === \"t\" &&\n hasOwn.call(this, name) &&\n !isNaN(+name.slice(1))) {\n this[name] = undefined;\n }\n }\n }\n },\n\n stop: function() {\n this.done = true;\n\n var rootEntry = this.tryEntries[0];\n var rootRecord = rootEntry.completion;\n if (rootRecord.type === \"throw\") {\n throw rootRecord.arg;\n }\n\n return this.rval;\n },\n\n dispatchException: function(exception) {\n if (this.done) {\n throw exception;\n }\n\n var context = this;\n function handle(loc, caught) {\n record.type = \"throw\";\n record.arg = exception;\n context.next = loc;\n\n if (caught) {\n // If the dispatched exception was caught by a catch block,\n // then let that catch block handle the exception normally.\n context.method = \"next\";\n context.arg = undefined;\n }\n\n return !! caught;\n }\n\n for (var i = this.tryEntries.length - 1; i >= 0; --i) {\n var entry = this.tryEntries[i];\n var record = entry.completion;\n\n if (entry.tryLoc === \"root\") {\n // Exception thrown outside of any try block that could handle\n // it, so set the completion value of the entire function to\n // throw the exception.\n return handle(\"end\");\n }\n\n if (entry.tryLoc <= this.prev) {\n var hasCatch = hasOwn.call(entry, \"catchLoc\");\n var hasFinally = hasOwn.call(entry, \"finallyLoc\");\n\n if (hasCatch && hasFinally) {\n if (this.prev < entry.catchLoc) {\n return handle(entry.catchLoc, true);\n } else if (this.prev < entry.finallyLoc) {\n return handle(entry.finallyLoc);\n }\n\n } else if (hasCatch) {\n if (this.prev < entry.catchLoc) {\n return handle(entry.catchLoc, true);\n }\n\n } else if (hasFinally) {\n if (this.prev < entry.finallyLoc) {\n return handle(entry.finallyLoc);\n }\n\n } else {\n throw new Error(\"try statement without catch or finally\");\n }\n }\n }\n },\n\n abrupt: function(type, arg) {\n for (var i = this.tryEntries.length - 1; i >= 0; --i) {\n var entry = this.tryEntries[i];\n if (entry.tryLoc <= this.prev &&\n hasOwn.call(entry, \"finallyLoc\") &&\n this.prev < entry.finallyLoc) {\n var finallyEntry = entry;\n break;\n }\n }\n\n if (finallyEntry &&\n (type === \"break\" ||\n type === \"continue\") &&\n finallyEntry.tryLoc <= arg &&\n arg <= finallyEntry.finallyLoc) {\n // Ignore the finally entry if control is not jumping to a\n // location outside the try/catch block.\n finallyEntry = null;\n }\n\n var record = finallyEntry ? finallyEntry.completion : {};\n record.type = type;\n record.arg = arg;\n\n if (finallyEntry) {\n this.method = \"next\";\n this.next = finallyEntry.finallyLoc;\n return ContinueSentinel;\n }\n\n return this.complete(record);\n },\n\n complete: function(record, afterLoc) {\n if (record.type === \"throw\") {\n throw record.arg;\n }\n\n if (record.type === \"break\" ||\n record.type === \"continue\") {\n this.next = record.arg;\n } else if (record.type === \"return\") {\n this.rval = this.arg = record.arg;\n this.method = \"return\";\n this.next = \"end\";\n } else if (record.type === \"normal\" && afterLoc) {\n this.next = afterLoc;\n }\n\n return ContinueSentinel;\n },\n\n finish: function(finallyLoc) {\n for (var i = this.tryEntries.length - 1; i >= 0; --i) {\n var entry = this.tryEntries[i];\n if (entry.finallyLoc === finallyLoc) {\n this.complete(entry.completion, entry.afterLoc);\n resetTryEntry(entry);\n return ContinueSentinel;\n }\n }\n },\n\n \"catch\": function(tryLoc) {\n for (var i = this.tryEntries.length - 1; i >= 0; --i) {\n var entry = this.tryEntries[i];\n if (entry.tryLoc === tryLoc) {\n var record = entry.completion;\n if (record.type === \"throw\") {\n var thrown = record.arg;\n resetTryEntry(entry);\n }\n return thrown;\n }\n }\n\n // The context.catch method must only be called with a location\n // argument that corresponds to a known catch block.\n throw new Error(\"illegal catch attempt\");\n },\n\n delegateYield: function(iterable, resultName, nextLoc) {\n this.delegate = {\n iterator: values(iterable),\n resultName: resultName,\n nextLoc: nextLoc\n };\n\n if (this.method === \"next\") {\n // Deliberately forget the last sent value so that we don't\n // accidentally pass it on to the delegate.\n this.arg = undefined;\n }\n\n return ContinueSentinel;\n }\n };\n\n // Regardless of whether this script is executing as a CommonJS module\n // or not, return the runtime object so that we can declare the variable\n // regeneratorRuntime in the outer scope, which allows this module to be\n // injected easily by `bin/regenerator --include-runtime script.js`.\n return exports;\n\n}(\n // If this script is executing as a CommonJS module, use module.exports\n // as the regeneratorRuntime namespace. Otherwise create a new empty\n // object. Either way, the resulting object will be used to initialize\n // the regeneratorRuntime variable at the top of this file.\n typeof module === \"object\" ? module.exports : {}\n));\n\ntry {\n regeneratorRuntime = runtime;\n} catch (accidentalStrictMode) {\n // This module should not be running in strict mode, so the above\n // assignment should always work unless something is misconfigured. Just\n // in case runtime.js accidentally runs in strict mode, in modern engines\n // we can explicitly access globalThis. In older engines we can escape\n // strict mode using a global Function call. This could conceivably fail\n // if a Content Security Policy forbids using Function, but in that case\n // the proper solution is to fix the accidental strict mode problem. If\n // you've misconfigured your bundler to force strict mode and applied a\n // CSP to forbid Function, and you're not willing to fix either of those\n // problems, please detail your unique predicament in a GitHub issue.\n if (typeof globalThis === \"object\") {\n globalThis.regeneratorRuntime = runtime;\n } else {\n Function(\"r\", \"regeneratorRuntime = r\")(runtime);\n }\n}\n","import { Signer } from '@ethersproject/abstract-signer';\nimport { NetworkConnection } from './types';\n\nexport class BlockchainEntityRead {\n protected _networkConnection: NetworkConnection;\n public constructor(networkConnection: NetworkConnection) {\n this._networkConnection = networkConnection;\n }\n}\n\nexport class BlockchainEntityReadWrite extends BlockchainEntityRead {\n public constructor(networkConnection: NetworkConnection) {\n if (!(networkConnection.signer instanceof Signer)) {\n throw Error(\n 'Signer is not provided when constructing BlockchainEntityReadWrite'\n );\n }\n super(networkConnection);\n }\n}\n\nexport class BlockchainEntity {\n constructor() {}\n public read(networkConnection: NetworkConnection): BlockchainEntityRead {\n return new BlockchainEntityRead(networkConnection);\n }\n\n public readWrite(\n networkConnection: NetworkConnection\n ): BlockchainEntityReadWrite {\n return new BlockchainEntityReadWrite(networkConnection);\n }\n}\n","import BigNumber from 'bignumber.js';\nimport { ethers, Signer, BigNumber as BN } from 'ethers';\nexport const dummyAddress: string =\n '0xDEADbeEfEEeEEEeEEEeEEeeeeeEeEEeeeeEEEEeE';\nexport const ETHAddress: string = '0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE';\n\nexport const AURORA_CHAINID = 1313161554;\n\nexport const DECIMAL_PRECISION = 10;\n\nexport type NetworkAddresses = {\n auTokens: {\n name: string;\n address: string;\n underlying: string;\n }[];\n misc: Record<string, string>;\n tokens: Record<string, string>;\n};\nexport const networkAddresses: NetworkAddresses = {\n auTokens: [\n {\n name: 'auUSDC',\n address: '0x4f0d864b1ABf4B701799a0b30b57A22dFEB5917b'.toLowerCase(),\n underlying: '0xb12bfca5a55806aaf64e99521918a4bf0fc40802'.toLowerCase(),\n },\n {\n name: 'auETH',\n address: '0xca9511B610bA5fc7E311FDeF9cE16050eE4449E9'.toLowerCase(),\n underlying: ETHAddress.toLowerCase(),\n },\n {\n name: 'auWBTC',\n address: '0xCFb6b0498cb7555e7e21502E0F449bf28760Adbb'.toLowerCase(),\n underlying: '0xf4eb217ba2454613b15dbdea6e5f22276410e89e'.toLowerCase(),\n },\n {\n name: 'auUSDT',\n address: '0xaD5A2437Ff55ed7A8Cad3b797b3eC7c5a19B1c54'.toLowerCase(),\n underlying: '0x4988a896b1227218e4a686fde5eabdcabd91571f'.toLowerCase(),\n },\n {\n name: 'auDAI',\n address: '0xCE4166363E3a584DAc84A47bCD3414B43EfCDd1c'.toLowerCase(),\n underlying: '0xe3520349f477a5f6eb06107066048508498a291b'.toLowerCase(),\n },\n {\n name: 'auWNEAR',\n address: '0xaE4fac24dCdAE0132C6d04f564dCf059616E9423'.toLowerCase(),\n underlying: '0xC42C30aC6Cc15faC9bD938618BcaA1a1FaE8501d'.toLowerCase(),\n },\n {\n name: 'auSTNEAR',\n address: '0x3195949f267702723bc614cAE037cdc8D1E94786'.toLowerCase(),\n underlying: '0x07F9F7f963C5cD2BBFFd30CcfB964Be114332E30'.toLowerCase(),\n },\n {\n name: 'auAURORA',\n address: '0x8888682E24dd4Df7B7Ff2B91fccB575737E433bf'.toLowerCase(),\n underlying: '0x8bec47865ade3b172a928df8f990bc7f2a3b9f79'.toLowerCase(),\n },\n {\n name: 'auTRI',\n address: '0x6Ea6C03061bDdCE23d4Ec60B6E6e880c33d24dca'.toLowerCase(),\n underlying: '0xFa94348467f64D5A457F75F8bc40495D33c65aBB'.toLowerCase(),\n },\n ],\n misc: {\n COMPTROLLER: '0x817af6cfAF35BdC1A634d6cC94eE9e4c68369Aeb'.toLowerCase(),\n oracle: '0xC6e5185438e1730959c1eF3551059A3feC744E90'.toLowerCase(),\n AURIFAIRLAUNCH: '0x6f068608573c840bB27b39458d7d87eB865e19Cc'.toLowerCase(),\n AURILENS: '0xFfdFfBDB966Cb84B50e62d70105f2Dbf2e0A1e70'.toLowerCase(),\n TOKENLOCK: '0xDACC02a4Ff16Ea3c1515AdbfdCeb7B1F448B79c8'.toLowerCase(),\n ETHREPAYHELPER: '0xa308A5003fA1A25BFdD9418FcEE51d48Dbe441e6'.toLowerCase(),\n AURI_AIRDROP: '0x6C42aA5b128B62D6CCf357726D7d13F3888335EC'.toLowerCase(),\n },\n tokens: {\n AURORA: '0x8bec47865ade3b172a928df8f990bc7f2a3b9f79'.toLowerCase(),\n PLY: '0x09c9d464b58d96837f8d8b6f4d9fe4ad408d3a4f'.toLowerCase(),\n stNEAR: '0x07f9f7f963c5cd2bbffd30ccfb964be114332e30'.toLowerCase(),\n USDC: '0xb12bfca5a55806aaf64e99521918a4bf0fc40802'.toLowerCase(),\n WNEAR: '0xC42C30aC6Cc15faC9bD938618BcaA1a1FaE8501d'.toLowerCase(),\n TRI: '0xFa94348467f64D5A457F75F8bc40495D33c65aBB'.toLowerCase(),\n META: '0xc21ff01229e982d7c8b8691163b0a3cb8f357453'.toLocaleLowerCase(),\n PULP: '0x04Ac48711BCdc45b4d223fb021E09DA73c71095e'.toLowerCase(),\n PLYWNEAR: '0x044b6B0CD3Bb13D2b9057781Df4459C66781dCe7'.toLowerCase(), //TODO: changes this\n },\n};\n\n// All token that we can calculate the price via oracle + coingecko\nexport const PRICE_WHITELISTED = new Set([\n ...networkAddresses.auTokens.map((t) => t.underlying),\n networkAddresses.tokens.AURORA,\n networkAddresses.tokens.TRI,\n networkAddresses.tokens.META,\n networkAddresses.tokens.stNEAR,\n]);\n\nexport const REWARD_CLAIM_START = 1651748400; // 5 May 2022 11:00:00 UTC\n\nexport const BORROW_LIMIT_BUFFER = new BigNumber(1);\n\nexport const ONE_DAY = 86400;\nexport const ONE_WEEK = ONE_DAY * 7;\nexport const ONE_YEAR = ONE_DAY * 365;\n\nexport const PLYWNEAR_POOL_ID = 0;\nexport const PLYWNEAR_REWARD_TOKENS = [\n '0x09C9D464b58d96837f8d8b6f4d9fE4aD408d3A4f', // PLY\n '0xC42C30aC6Cc15faC9bD938618BcaA1a1FaE8501d', // WNEAR\n '0x8BEc47865aDe3B172A928df8f990Bc7f2A3b9f79', // AURORA\n '0xFa94348467f64D5A457F75F8bc40495D33c65aBB', // TRI\n];\n// could call RPC to get all the staking pools but it's not necessary for now\n// export const ALL_STAKING_POOLS = [PLYWNEAR_POOL_ID];\n// TODO: fix this\nexport const ALL_STAKING_POOLS: number[] = [];\nexport const INF = BN.from(2).pow(256).sub(1);\n\nexport const AIRDROP_START_TIMESTAMP = 1649858400;\nexport const AIRDROP_END_TIMESTAMP = 1651068000;\nexport const AIRDROP_KEEP_THRESHOLD = 7 * 86400;\n\nexport const DEPOSIT_NEAR_REWARDS_PER_WEEK: { [k: string]: string } =\n Object.fromEntries(\n // lower case all addresses\n Object.entries({\n '0xb12bfca5a55806aaf64e99521918a4bf0fc40802': '36375', // USDC\n '0x4988a896b1227218e4a686fde5eabdcabd91571f': '14550', // USDT\n '0xf4eb217ba2454613b15dbdea6e5f22276410e89e': '3638', // WBTC\n '0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE': '14550', // ETH\n '0xc42c30ac6cc15fac9bd938618bcaa1a1fae8501d': '3638', // WNEAR\n }).map(([k, v]) => [k.toLowerCase(), v])\n );\n\nexport const BORROW_NEAR_REWARDS_PER_WEEK: { [k: string]: string } = {\n // currently 0 for all markets\n};\n","import axios from 'axios';\n\nconst AURORA_API_BASE_URL = 'https://api.aurorascan.dev/api';\n\nexport async function getQuery(\n module: string,\n action: string,\n params: Record<string, any> = {}\n): Promise<any> {\n params = { ...params, module: module, action: action };\n\n let resp = await axios.get(\n AURORA_API_BASE_URL + '?' + new URLSearchParams(params),\n {\n headers: { 'Content-Type': 'application/json' },\n }\n );\n\n return resp.data.result!;\n}\n","export const decimalRecords: Record<string, number> = {\n '0xeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee': 18,\n '0x09c9d464b58d96837f8d8b6f4d9fe4ad408d3a4f': 18,\n '0x3195949f267702723bc614cae037cdc8d1e94786': 8,\n '0xfa94348467f64d5a457f75f8bc40495d33c65abb': 18,\n '0x07f9f7f963c5cd2bbffd30ccfb964be114332e30': 24,\n '0xc42c30ac6cc15fac9bd938618bcaa1a1fae8501d': 24,\n '0x6ea6c03061bddce23d4ec60b6e6e880c33d24dca': 8,\n '0xca9511b610ba5fc7e311fdef9ce16050ee4449e9': 8,\n '0x8bec47865ade3b172a928df8f990bc7f2a3b9f79': 18,\n '0xcfb6b0498cb7555e7e21502e0f449bf28760adbb': 8,\n '0x4f0d864b1abf4b701799a0b30b57a22dfeb5917b': 8,\n '0xad5a2437ff55ed7a8cad3b797b3ec7c5a19b1c54': 8,\n '0x4988a896b1227218e4a686fde5eabdcabd91571f': 6,\n '0xb12bfca5a55806aaf64e99521918a4bf0fc40802': 6,\n '0xe3520349f477a5f6eb06107066048508498a291b': 18,\n '0x8888682e24dd4df7b7ff2b91fccb575737e433bf': 8,\n '0xae4fac24dcdae0132c6d04f564dcf059616e9423': 8,\n '0xce4166363e3a584dac84a47bcd3414b43efcdd1c': 8,\n '0xf4eb217ba2454613b15dbdea6e5f22276410e89e': 8,\n '0xc21ff01229e982d7c8b8691163b0a3cb8f357453': 24,\n '0x04ac48711bcdc45b4d223fb021e09da73c71095e': 18, // PULP\n '0x044b6b0cd3bb13d2b9057781df4459c66781dce7': 18, // PLYWNEAR\n};\n","import { Provider } from '@ethersproject/abstract-provider';\nimport assert from 'assert';\nimport BigNumber from 'bignumber.js';\nimport { BigNumber as BN, utils } from 'ethers';\nimport { getQuery as getAuroraAPIQuery } from './aurora-api-helpers';\nimport { decimalRecords } from './decimals';\nimport { Address } from './types';\n\nexport function formatObject(object: Object) {\n return JSON.stringify(object, null, ' ');\n}\n\nexport function decimalFactor(decimal: number) {\n return BN.from(10).pow(decimal).toString();\n}\n\nexport const isSameAddress = (\n address1: Address,\n address2: Address\n): boolean => {\n return address1.toLowerCase() == address2.toLowerCase();\n};\n\nexport const getCurrentTimestamp = (): number => {\n return Math.trunc(Date.now() / 1000);\n};\n\nexport function validateAndParseAddress(address: Address): Address {\n try {\n return utils.getAddress(address);\n } catch (error) {\n throw new Error('Invalid address: ' + address);\n }\n}\n\nexport function getDecimal(address: Address): number {\n let addressLowercase = address.toLowerCase();\n assert(\n decimalRecords[addressLowercase] != undefined,\n 'Decimal not found for ' + address\n );\n return decimalRecords[addressLowercase];\n}\n\nexport function calcLMRewardApr(\n rewardsValue: BigNumber,\n totalStakeValue: BigNumber,\n frequencyPerYear: number\n): BigNumber {\n if (totalStakeValue.lte(0)) {\n // avoid division by zero when there is no stake\n return new BigNumber('999999999');\n }\n return rewardsValue.multipliedBy(frequencyPerYear).dividedBy(totalStakeValue);\n}\n\nexport async function getBlockTimestamp(\n provider: Provider,\n blockNumber: number\n): Promise<number> {\n const block = await provider.getBlock(blockNumber);\n return block.timestamp;\n}\n\n/**\n * Get the block number of the last block that has a timestamp before the given timestamp\n * @param timestamp input timestamp\n * @returns return the last block that its timestamp <= the give timestamp\n * @note Check this API for more information: https://aurorascan.dev/apis#blocks\n *\n * This function is much faster than using binary search.\n */\nexport async function getBlockBeforeTimestamp(\n provider: Provider,\n timestamp: number\n) {\n let result = await getAuroraAPIQuery('block', 'getblocknobytime', {\n timestamp: timestamp,\n closest: 'before',\n });\n\n // In case the API return `Block timestamp too far in the future`\n // use the last block number\n return parseInt(result) || (await provider.getBlockNumber());\n}\n","import type { BigNumber, providers, Signer } from 'ethers';\nimport { TokenAmount } from './tokenAmount';\n\nexport enum ComptrollerRewardType {\n PLY = 0,\n AURORA,\n}\nexport type NetworkConnection = {\n provider: providers.Provider;\n signer?: Signer;\n};\n\nexport type Address = string;\n\nexport type CurrencyAmount = {\n currency: string;\n amount: string;\n};\n\nexport type TokenValuation = {\n tokenAmount: TokenAmount;\n currencyAmount: CurrencyAmount;\n};\n\nexport type MoneyMarketDetails = {\n auTokenAddress: string;\n totalTokenDeposited: TokenAmount;\n totalTokenBorrowed: TokenAmount;\n depositApy: number;\n depositPlyApy: number;\n borrowApy: number;\n borrowPlyApy: number;\n collateralRatio: number;\n depositPlyPerWeek: TokenAmount;\n borrowPlyPerWeek: TokenAmount;\n depositMETAApy: number;\n depositNEARApy: number;\n borrowNEARApy: number;\n};\n\nexport type UserDetails = {\n markets: UserMarketDetails[];\n borrowLimit: CurrencyAmount;\n userLockingDetails: UserLockingDetails;\n borrowableAmount: CurrencyAmount;\n};\n\nexport type UserLockingDetails = {\n vestingStart: number;\n /** % of reward they will receive in PLY, if they claim this week */\n currentUnlockPortion: number;\n //** Amount of PLY rewards that a user has. Equal to currentPly + currentPulp */\n accruedPly: TokenAmount;\n /** Amount of PLY they will receive, if they claim this week */\n currentPly: TokenAmount;\n /** Amount of PULP they will receive, if they claim this week */\n currentPulp: TokenAmount;\n /** % of reward they will receive in PLY, if they claim next week */\n nextUnlockPortion: number;\n /**\n * Amount of PLY they will receive, if they claim next week.\n * This doesn't include the additional reward that they will earn\n * in the next week.\n */\n nextPly: TokenAmount;\n /**\n * Amount of PULP they will receive, if they claim next week.\n * This doesn't include the additional reward that they will earn\n * in the next week.\n */\n nextPulp: TokenAmount;\n};\n\nexport type UserMarketDetails = {\n market: string;\n depositBalance: TokenAmount;\n borrowBalance: TokenAmount;\n isCollateral: boolean;\n maxWithdrawableAmount: TokenAmount;\n collateralRatio: number;\n underlyingPrice: string;\n};\n\nexport type TokenAPY = {\n address: string;\n apy: string;\n};\n\nexport type PLYWNEARPoolDetails = {\n totalStakedLiquidity: TokenValuation;\n APYs: TokenAPY[];\n};\n\nexport enum MarketAction {\n Deposit = 0,\n Borrow,\n Withdraw,\n Repay,\n EnableCollateral,\n DisableCollateral,\n}\n\nexport type HypotheticalStats = {\n newBorrowLimit: CurrencyAmount;\n newBorrowUtilization: number;\n};\n","import { getDecimal } from './helpers';\nimport { networkAddresses } from './constants';\n\nexport class Token {\n public readonly address: string;\n public readonly decimals: number;\n public constructor(address: string, decimals: number) {\n this.address = address.toLowerCase();\n this.decimals = decimals;\n }\n}\n\nexport const PLYToken = new Token(\n networkAddresses.tokens.PLY,\n getDecimal(networkAddresses.tokens.PLY)\n);\n\nexport const PLYWNEARToken = new Token(\n networkAddresses.tokens.PLYWNEAR,\n getDecimal(networkAddresses.tokens.PLYWNEAR)\n);\n","import { Token } from './token';\nimport BigNumber from 'bignumber.js';\nimport { decimalFactor, getDecimal } from './helpers';\nimport { Address } from './types';\n\nexport class TokenAmount {\n public readonly token: Token;\n private rawAmnt: string;\n\n public constructor(token: Token, amount: string, isRaw: boolean = true) {\n if (isRaw) {\n this.rawAmnt = amount;\n } else {\n this.rawAmnt = new BigNumber(amount)\n .times(decimalFactor(token.decimals))\n .toFixed(0);\n }\n this.token = token;\n }\n\n public formattedAmount(): string {\n return new BigNumber(this.rawAmnt)\n .div(decimalFactor(this.token.decimals))\n .toString();\n }\n\n public rawAmount(): string {\n return this.rawAmnt;\n }\n\n public static fromAddressAndAmount(\n tokenAddress: Address,\n amount: string,\n isRaw: boolean = true\n ): TokenAmount {\n return new TokenAmount(\n new Token(tokenAddress, getDecimal(tokenAddress)),\n amount,\n isRaw\n );\n }\n}\n","import BigNumber from 'bignumber.js';\nimport { Contract, providers, BigNumber as BN, ethers } from 'ethers';\nimport {\n DECIMAL_PRECISION,\n networkAddresses,\n PRICE_WHITELISTED,\n} from './constants';\nimport OracleABI from './abis/Oracle.json';\nimport { isSameAddress, decimalFactor, getDecimal } from './helpers';\nimport { IUniswapV2Pair, PriceOracle } from '@aurigami/contracts/typechain';\nimport { TokenAmount } from './tokenAmount';\nimport { Address, TokenValuation } from './types';\nimport IUniswapV2PairABI from './abis/IUniswapV2Pair.json';\nimport AuriLensABI from '@aurigami/contracts/artifacts/contracts/AuriLens.sol/AuriLens.json';\nimport axios from 'axios';\nimport assert from 'assert';\n\nconst hardcodePLYPrice = true;\nexport async function fetchPriceFromCoingeckoAPI(\n id: string\n): Promise<BigNumber> {\n const price = await axios\n .get(\n `https://api.coingecko.com/api/v3/simple/price?ids=${id}&vs_currencies=usd`\n )\n .then((res: any) => {\n return res.data;\n });\n\n return new BigNumber(price[id].usd);\n}\n\nexport async function fetchPriceFromCoingecko(id: Address): Promise<BigNumber> {\n switch (id.toLowerCase()) {\n case networkAddresses.tokens.AURORA:\n return fetchPriceFromCoingeckoAPI('aurora-near');\n\n case networkAddresses.tokens.TRI:\n return fetchPriceFromCoingeckoAPI('trisolaris');\n\n case networkAddresses.tokens.META:\n return fetchPriceFromCoingeckoAPI('meta-pool');\n\n default:\n throw Error(`Unknown token ${id} in fetchPriceFromCoingecko`);\n }\n}\n\nexport async function fetchLPPositions(\n LPAddress: Address,\n provider: providers.Provider\n): Promise<{\n token0: Address;\n token1: Address;\n reserve0: BN;\n reserve1: BN;\n totalSupply: BN;\n}> {\n const LPContract = new Contract(\n LPAddress,\n IUniswapV2PairABI.abi,\n provider\n ) as IUniswapV2Pair;\n var promises: any[] = [];\n promises.push(LPContract.token0());\n promises.push(LPContract.token1());\n promises.push(LPContract.getReserves());\n promises.push(LPContract.totalSupply());\n const values: any[] = await Promise.all(promises);\n\n return {\n token0: values[0] as string,\n token1: values[1] as string,\n reserve0: (values[2] as { reserve0: BN; reserve1: BN }).reserve0,\n reserve1: (values[2] as { reserve0: BN; reserve1: BN }).reserve1,\n totalSupply: values[3] as BN,\n };\n}\n\nexport async function fetchLPPrice(\n address: Address,\n provider: providers.Provider\n): Promise<BigNumber> {\n var LPInfo = await fetchLPPositions(address, provider);\n const LPDecimal = getDecimal(address);\n\n async function fetchLPPriceBy(tokenReverse: {\n address: string;\n reserve: BN;\n }): Promise<BigNumber> {\n if (tokenReverse.reserve.isZero()) return new BigNumber(0);\n\n // Should NOT call `fetchPrice`, it will cause an infinite loop\n // because the token can be PLY. To calculate PLY price, we need to\n // call `fetchPrice` again...\n const tokenPrice: BigNumber = await _fetchPrice(\n tokenReverse.address,\n provider\n );\n const tokenDecimal = getDecimal(tokenReverse.address);\n\n // reserveUSD will be divided by 10^tokenDecimal later for more precision\n const reserveUSD: BigNumber = tokenPrice\n .multipliedBy(tokenReverse.reserve.toString())\n .multipliedBy(2);\n return reserveUSD\n .multipliedBy(decimalFactor(LPDecimal))\n .dividedBy(new BigNumber(LPInfo.totalSupply.toString()))\n .dividedBy(decimalFactor(tokenDecimal));\n }\n\n try {\n // MUST await here\n return await fetchLPPriceBy({\n address: LPInfo.token0,\n reserve: LPInfo.reserve0,\n });\n } catch {\n try {\n // MUST await here\n return await fetchLPPriceBy({\n address: LPInfo.token1,\n reserve: LPInfo.reserve1,\n });\n } catch {\n throw Error(`Unable to fetch price for both tokens of LP ${address}`);\n }\n }\n}\n\nfunction processPriceFromOracle(rawPrice: BN, underlyingDecimal: number) {\n return new BigNumber(rawPrice.toString()).div(\n decimalFactor(36 - underlyingDecimal)\n );\n}\nexport async function fetchPriceFromOracle(\n auTokenAddress: Address,\n underlyingDecimal: number,\n provider: providers.Provider\n): Promise<BigNumber> {\n const oracleContract: PriceOracle = new Contract(\n networkAddresses.misc.oracle,\n OracleABI.abi,\n provider\n ) as PriceOracle;\n const rawPrice = await oracleContract.getUnderlyingPrice(auTokenAddress);\n return processPriceFromOracle(rawPrice, underlyingDecimal);\n}\n\nexport async function fetchUnderlyingTokensPrices(\n provider: providers.Provider\n): Promise<\n {\n auToken: string;\n underlyingPrice: BigNumber;\n }[]\n> {\n const auriLens: Contract = new Contract(\n networkAddresses.misc.AURILENS,\n AuriLensABI.abi,\n provider\n );\n const auTokenAddresses = networkAddresses.auTokens.map(\n (auToken) => auToken.address\n );\n const underlyingDecimals = networkAddresses.auTokens.map((auToken) =>\n getDecimal(auToken.underlying)\n );\n const rawPrices = await auriLens.auTokenUnderlyingPriceAll(auTokenAddresses);\n return rawPrices.map((res: any, ind: number) => {\n return {\n auToken: res.auToken,\n underlyingPrice: processPriceFromOracle(\n res.underlyingPrice,\n underlyingDecimals[ind]\n ),\n };\n });\n}\n\nexport async function fetchStNEARPrice(): Promise<BigNumber> {\n const ratioPromise = axios\n .get('https://validators.narwallets.com/metrics_json')\n .then((res) => res.data);\n const nearPricePromise = fetchPriceFromCoingeckoAPI('near');\n const [ratioRes, nearPrice]: [any, BigNumber] = await Promise.all([\n ratioPromise,\n nearPricePromise,\n ]);\n const ratio = new BigNumber(ratioRes.st_near_price);\n return ratio.multipliedBy(nearPrice);\n}\n\nfunction shouldFetchFromCoingecko(address: string) {\n address = address.toLowerCase();\n return (\n address == networkAddresses.tokens.AURORA ||\n address == networkAddresses.tokens.TRI ||\n address == networkAddresses.tokens.META\n );\n}\n\n/**\n * Fetch price from Oracle or Coingecko\n */\nasync function _fetchPrice(\n address: Address,\n provider: providers.Provider\n): Promise<BigNumber> {\n assert(PRICE_WHITELISTED.has(address.toLocaleLowerCase()));\n\n if (isSameAddress(address, networkAddresses.tokens.stNEAR))\n return fetchStNEARPrice();\n if (shouldFetchFromCoingecko(address))\n return fetchPriceFromCoingecko(address);\n\n const matchingAuToken = networkAddresses.auTokens.find((auToken) => {\n return isSameAddress(auToken.underlying, address);\n });\n\n if (matchingAuToken !== undefined) {\n return fetchPriceFromOracle(\n matchingAuToken.address,\n getDecimal(address),\n provider\n );\n } else {\n throw Error(`Unable to fetch price for ${address}`);\n }\n}\n\nexport async function fetchPrice(\n address: Address,\n provider: providers.Provider\n): Promise<BigNumber> {\n if (isSameAddress(address, networkAddresses.tokens.PLYWNEAR)) {\n return fetchLPPrice(address, provider);\n } else if (isSameAddress(address, networkAddresses.tokens.PLY)) {\n return fetchPLYPrice(provider);\n }\n return _fetchPrice(address, provider);\n}\n\nexport async function fetchPLYPrice(\n provider: providers.Provider\n): Promise<BigNumber> {\n //TODO: Fetch PLY price from CEX?\n return fetchToken0PriceByLP(networkAddresses.tokens.PLYWNEAR, provider);\n}\n\nexport async function fetchToken0PriceByLP(\n LP: Address,\n provider: providers.Provider\n): Promise<BigNumber> {\n const LPInfo = await fetchLPPositions(LP, provider);\n\n if (LPInfo.reserve1.isZero()) {\n return new BigNumber(0);\n }\n\n const token0Decimal = getDecimal(LPInfo.token0);\n const token1Decimal = getDecimal(LPInfo.token1);\n\n // (token0Price * reserve0) / 10^decimal0 = (token1Price * reserve1) / 10^decimal1\n // token0Price = (token1Price * reserve1) * 10^decimal0 / 10^decimal1 / reserve0\n return (await fetchPrice(LPInfo.token1, provider))\n .multipliedBy(LPInfo.reserve1.toString())\n .multipliedBy(decimalFactor(token0Decimal))\n .dividedBy(decimalFactor(token1Decimal))\n .dividedBy(LPInfo.reserve0.toString());\n}\n\nexport async function fetchValuation(\n tokenAmount: TokenAmount,\n provider: providers.Provider\n): Promise<BigNumber> {\n if (tokenAmount.rawAmount() == '0') return new BigNumber(0);\n var price = await fetchPrice(tokenAmount.token.address, provider);\n return calcValuation(tokenAmount, price);\n}\n\nexport function calcValuation(tokenAmount: TokenAmount, price: BigNumber) {\n return new BigNumber(tokenAmount.formattedAmount()).multipliedBy(price);\n}\n\nexport async function valuateToken(\n tokenAmount: TokenAmount,\n provider: providers.Provider\n): Promise<TokenValuation> {\n let tokenValuation = await fetchValuation(tokenAmount, provider);\n return {\n tokenAmount: tokenAmount,\n currencyAmount: {\n currency: 'USD',\n amount: tokenValuation.toFixed(DECIMAL_PRECISION),\n },\n };\n}\n","import { BlockchainEntity, BlockchainEntityRead } from './BlockchainEntity';\nimport {\n MoneyMarketDetails,\n NetworkConnection,\n Address,\n ComptrollerRewardType,\n} from './types';\nimport { Contract, BigNumber as BN } from 'ethers';\nimport AuErc20ABI from '@aurigami/contracts/artifacts/contracts/AuErc20.sol/AuErc20.json';\nimport AuETHABI from '@aurigami/contracts/artifacts/contracts/AuETH.sol/AuETH.json';\nimport ComptrollerABI from '@aurigami/contracts/artifacts/contracts/Comptroller.sol/Comptroller.json';\nimport AuriLensABI from '@aurigami/contracts/artifacts/contracts/AuriLens.sol/AuriLens.json';\nimport EthRepayHelperABI from '@aurigami/contracts/artifacts/contracts/EthRepayHelper.sol/EthRepayHelper.json';\nimport {\n AuErc20,\n AuETH,\n AuriLens,\n Comptroller,\n EthRepayHelper,\n} from '@aurigami/contracts/typechain';\nimport { TransactionResponse } from '@ethersproject/abstract-provider';\nimport {\n networkAddresses,\n ETHAddress,\n ONE_YEAR,\n INF,\n ONE_DAY,\n DEPOSIT_NEAR_REWARDS_PER_WEEK,\n BORROW_NEAR_REWARDS_PER_WEEK,\n} from './constants';\nimport BigNumber from 'bignumber.js';\nimport {\n decimalFactor,\n isSameAddress,\n calcLMRewardApr,\n getCurrentTimestamp,\n} from './helpers';\nimport { Token, PLYToken } from './token';\nimport { TokenAmount } from './tokenAmount';\nimport { getDecimal, validateAndParseAddress } from './helpers';\nimport { fetchPrice, calcValuation, fetchValuation } from './priceFetcher';\n\ntype RewardSpeeds = {\n plyRewardSupplySpeed: BN;\n plyRewardBorrowSpeed: BN;\n auroraRewardSupplySpeed: BN;\n auroraRewardBorrowSpeed: BN;\n};\n\nexport class MoneyMarketRead extends BlockchainEntityRead {\n public underlying: Token;\n public auToken: AuErc20 | AuETH;\n protected _comptroller: Comptroller;\n\n protected _auriLens: AuriLens;\n constructor(\n networkConnection: NetworkConnection,\n auToken: Address,\n underlyingAsset: Address\n ) {\n super(networkConnection);\n if (isSameAddress(underlyingAsset, ETHAddress)) {\n this.auToken = new Contract(\n auToken,\n AuETHABI.abi,\n networkConnection.provider\n ) as AuETH;\n } else {\n this.auToken = new Contract(\n auToken,\n AuErc20ABI.abi,\n networkConnection.provider\n ) as AuErc20;\n }\n this.underlying = new Token(underlyingAsset, getDecimal(underlyingAsset));\n this._comptroller = new Contract(\n networkAddresses.misc.COMPTROLLER,\n ComptrollerABI.abi,\n networkConnection.provider\n ) as Comptroller;\n this._auriLens = new Contract(\n networkAddresses.misc.AURILENS,\n AuriLensABI.abi,\n networkConnection.provider\n ) as AuriLens;\n }\n\n protected async getRewardSpeeds(): Promise<RewardSpeeds> {\n var speeds = await this._auriLens.getRewardSpeeds(\n this._comptroller.address,\n this.auToken.address\n );\n return speeds;\n }\n public async getTotalTokenBorrowed(): Promise<TokenAmount> {\n return new TokenAmount(\n this.underlying,\n (await this.auToken.totalBorrows()).toString()\n );\n }\n public async getTotalTokenDeposited(): Promise<TokenAmount> {\n var promises = [];\n var totalBorrow: TokenAmount, totalCash: TokenAmount;\n promises.push(\n this.getTotalTokenBorrowed().then((res: TokenAmount) => {\n totalBorrow = res;\n })\n );\n promises.push(\n this.auToken.getCash().then((res: BN) => {\n totalCash = new TokenAmount(this.underlying, res.toString());\n })\n );\n await Promise.all(promises);\n return new TokenAmount(\n this.underlying,\n BN.from(totalCash!.rawAmount()).add(totalBorrow!.rawAmount()).toString()\n );\n }\n\n public async getDepositAPY(): Promise<BigNumber> {\n const supplyRatePerTimestamp = await this.auToken.supplyRatePerTimestamp();\n return new BigNumber(supplyRatePerTimestamp.toString())\n .multipliedBy(60 * 60 * 24 * 365)\n .div(decimalFactor(18));\n }\n\n public async getBorrowAPY(): Promise<BigNumber> {\n const borrowRatePerTimestamp = await this.auToken.borrowRatePerTimestamp();\n return new BigNumber(borrowRatePerTimestamp.toString())\n .multipliedBy(60 * 60 * 24 * 365)\n .div(decimalFactor(18));\n }\n\n public async getCollateralRatio(): Promise<BigNumber> {\n return this._comptroller.markets(this.auToken.address).then((res: any) => {\n return new BigNumber(res.collateralFactorMantissa.toString()).div(\n decimalFactor(18)\n );\n });\n }\n\n public async getBorrowPlyAPY(): Promise<BigNumber> {\n var promises = [];\n var totalBorrowed: TokenAmount,\n rewardSpeed: TokenAmount,\n plyPrice: BigNumber,\n underlyingPrice: BigNumber;\n promises.push(\n this.getTotalTokenBorrowed().then((res: TokenAmount) => {\n totalBorrowed = res;\n })\n );\n promises.push(\n this._comptroller\n .rewardSpeeds(ComptrollerRewardType.PLY, this.auToken.address, false)\n .then((res) => {\n rewardSpeed = new TokenAmount(PLYToken, res.toString());\n })\n );\n promises.push(\n fetchPrice(\n networkAddresses.tokens.PLY,\n this._networkConnection.provider\n ).then((res) => {\n plyPrice = res;\n })\n );\n promises.push(\n fetchPrice(\n this.underlying.address,\n this._networkConnection.provider\n ).then((res) => {\n underlyingPrice = res;\n })\n );\n await Promise.all(promises);\n return calcLMRewardApr(\n plyPrice!.multipliedBy(rewardSpeed!.formattedAmount()),\n underlyingPrice!.multipliedBy(totalBorrowed!.formattedAmount()),\n ONE_YEAR\n );\n }\n\n public async getDepositPlyAPY(): Promise<BigNumber> {\n var promises = [];\n var totalDeposited: TokenAmount,\n rewardSpeed: TokenAmount,\n plyPrice: BigNumber,\n underlyingPrice: BigNumber;\n promises.push(\n this.getTotalTokenDeposited().then((res: TokenAmount) => {\n totalDeposited = res;\n })\n );\n promises.push(\n this._comptroller\n .rewardSpeeds(ComptrollerRewardType.PLY, this.auToken.address, true)\n .then((res) => {\n rewardSpeed = new TokenAmount(PLYToken, res.toString());\n })\n );\n promises.push(\n fetchPrice(\n networkAddresses.tokens.PLY,\n this._networkConnection.provider\n ).then((res) => {\n plyPrice = res;\n })\n );\n promises.push(\n fetchPrice(\n this.underlying.address,\n this._networkConnection.provider\n ).then((res) => {\n underlyingPrice = res;\n })\n );\n await Promise.all(promises);\n return calcLMRewardApr(\n plyPrice!.multipliedBy(rewardSpeed!.formattedAmount()),\n underlyingPrice!.multipliedBy(totalDeposited!.formattedAmount()),\n ONE_YEAR\n );\n }\n public async getDetails(): Promise<MoneyMarketDetails> {\n var promises = [],\n totalDeposited: TokenAmount,\n totalBorrowed: TokenAmount,\n depositAPY: number,\n borrowAPY: number,\n collateralRatio: number;\n promises.push(\n this.getTotalTokenDeposited().then((res: TokenAmount) => {\n totalDeposited = res;\n })\n );\n promises.push(\n this.getTotalTokenBorrowed().then((res: TokenAmount) => {\n totalBorrowed = res;\n })\n );\n promises.push(\n this.getDepositAPY().then((res: BigNumber) => {\n depositAPY = res.toNumber();\n })\n );\n promises.push(\n this.getBorrowAPY().then((res: BigNumber) => {\n borrowAPY = res.toNumber();\n })\n );\n promises.push(\n this.getCollateralRatio().then((res: BigNumber) => {\n collateralRatio = res.toNumber();\n })\n );\n\n var plyPrice: BigNumber,\n underlyingPrice: BigNumber,\n rewardSpeeds: RewardSpeeds;\n promises.push(\n this.getRewardSpeeds().then((res) => {\n rewardSpeeds = res;\n })\n );\n promises.push(\n fetchPrice(\n networkAddresses.tokens.PLY,\n this._networkConnection.provider\n ).then((res) => {\n plyPrice = res;\n })\n );\n promises.push(\n fetchPrice(\n this.underlying.address,\n this._networkConnection.provider\n ).then((res) => {\n underlyingPrice = res;\n })\n );\n\n await Promise.all(promises);\n\n var borrowPlyApy = calcLMRewardApr(\n calcValuation(\n new TokenAmount(\n PLYToken,\n rewardSpeeds!.plyRewardBorrowSpeed.toString()\n ),\n plyPrice!\n ),\n underlyingPrice!.multipliedBy(totalBorrowed!.formattedAmount()),\n ONE_YEAR\n );\n var depositPlyApy = calcLMRewardApr(\n calcValuation(\n new TokenAmount(\n PLYToken,\n rewardSpeeds!.plyRewardSupplySpeed.toString()\n ),\n plyPrice!\n ),\n underlyingPrice!.multipliedBy(totalDeposited!.formattedAmount()),\n ONE_YEAR\n );\n\n var depositNEARApy = calcLMRewardApr(\n await fetchValuation(\n this.getDepositNEARRewardPerWeek(),\n this._networkConnection.provider\n ),\n underlyingPrice!.multipliedBy(totalDeposited!.formattedAmount()),\n 52\n );\n var borrowNEARApy = calcLMRewardApr(\n await fetchValuation(\n this.getBorrowNEARRewardPerWeek(),\n this._networkConnection.provider\n ),\n underlyingPrice!.multipliedBy(totalBorrowed!.formattedAmount()),\n 52\n );\n var depositMETAApy;\n if (\n isSameAddress(this.underlying.address, networkAddresses.tokens.stNEAR)\n ) {\n depositMETAApy = calcLMRewardApr(\n new BigNumber(50000),\n underlyingPrice!.multipliedBy(totalDeposited!.formattedAmount()),\n 12\n );\n } else {\n depositMETAApy = new BigNumber(0);\n }\n\n return {\n auTokenAddress: this.auToken.address,\n totalTokenDeposited: totalDeposited!,\n totalTokenBorrowed: totalBorrowed!,\n depositApy: depositAPY!,\n depositPlyApy: depositPlyApy.toNumber(),\n borrowApy: borrowAPY!,\n borrowPlyApy: borrowPlyApy.toNumber() * -1,\n collateralRatio: collateralRatio!,\n depositPlyPerWeek: new TokenAmount(\n PLYToken,\n rewardSpeeds!.plyRewardSupplySpeed.mul(ONE_DAY).mul(7).toString()\n ),\n borrowPlyPerWeek: new TokenAmount(\n PLYToken,\n rewardSpeeds!.plyRewardBorrowSpeed.mul(ONE_DAY).mul(7).toString()\n ),\n depositNEARApy: depositNEARApy.toNumber(),\n borrowNEARApy: borrowNEARApy.toNumber() * -1,\n depositMETAApy: depositMETAApy.toNumber(),\n };\n }\n\n public async getUserBorrowBalance(userAddress: string): Promise<TokenAmount> {\n const totalBorrow: BN = await this.auToken.callStatic.borrowBalanceCurrent(\n userAddress\n );\n return new TokenAmount(this.underlying, totalBorrow.toString());\n }\n\n public async getUserDepositBalance(\n userAddress: string\n ): Promise<TokenAmount> {\n const totalDeposit: BN = await this.auToken.callStatic.balanceOfUnderlying(\n userAddress\n );\n return new TokenAmount(this.underlying, totalDeposit.toString());\n }\n\n private getDepositNEARRewardPerWeek(): TokenAmount {\n const NEARToken = new Token(\n networkAddresses.tokens.WNEAR,\n getDecimal(networkAddresses.tokens.WNEAR)\n );\n const rewardStartTime = 1650636000;\n const rewardStopTime = 1651845600; // May 06, 2022 2 PM GMT\n const currentTime = getCurrentTimestamp();\n if (currentTime <= rewardStopTime && currentTime > rewardStartTime) {\n const reward =\n DEPOSIT_NEAR_REWARDS_PER_WEEK[\n this.underlying.address.toLocaleLowerCase()\n ] ?? '0';\n return new TokenAmount(NEARToken, reward, false);\n } else {\n return new TokenAmount(NEARToken, '0');\n }\n }\n\n private getBorrowNEARRewardPerWeek(): TokenAmount {\n const NEARToken = new Token(\n networkAddresses.tokens.WNEAR,\n getDecimal(networkAddresses.tokens.WNEAR)\n );\n const rewardStartTime = 1650636000;\n const rewardStopTime = 1651845600; // May 06, 2022 2 PM GMT\n const currentTime = getCurrentTimestamp();\n if (currentTime <= rewardStopTime && currentTime > rewardStartTime) {\n const reward =\n BORROW_NEAR_REWARDS_PER_WEEK[\n this.underlying.address.toLocaleLowerCase()\n ] ?? '0';\n return new TokenAmount(NEARToken, reward, false);\n } else {\n return new TokenAmount(NEARToken, '0');\n }\n }\n}\n\nexport class MoneyMarketReadWrite extends MoneyMarketRead {\n protected _EthRepayHelper: EthRepayHelper;\n constructor(\n networkConnection: NetworkConnection,\n auToken: Address,\n underlyingAsset: Address\n ) {\n super(networkConnection, auToken, underlyingAsset);\n this._EthRepayHelper = new Contract(\n networkAddresses.misc.ETHREPAYHELPER,\n EthRepayHelperABI.abi,\n networkConnection.provider\n ) as EthRepayHelper;\n }\n\n public async deposit(amount: TokenAmount): Promise<TransactionResponse> {\n if (isSameAddress(amount.token.address, ETHAddress)) {\n return (this.auToken as AuETH)\n .connect(this._networkConnection.signer!)\n .mint({ value: amount.rawAmount() });\n } else {\n return (this.auToken as AuErc20)\n .connect(this._networkConnection.signer!)\n .mint(amount.rawAmount());\n }\n }\n public async borrow(amount: TokenAmount): Promise<TransactionResponse> {\n return this.auToken\n .connect(this._networkConnection.signer!)\n .borrow(amount.rawAmount());\n }\n public async withdraw(amount: TokenAmount): Promise<TransactionResponse> {\n if (new BigNumber(amount.rawAmount()).lt(0)) {\n return this.auToken\n .connect(this._networkConnection.signer!)\n .redeemUnderlying(INF);\n }\n return this.auToken\n .connect(this._networkConnection.signer!)\n .redeemUnderlying(amount.rawAmount());\n }\n public async repay(amount: TokenAmount): Promise<TransactionResponse> {\n if (isSameAddress(amount.token.address, ETHAddress)) {\n return this._EthRepayHelper\n .connect(this._networkConnection.signer!)\n .repayBorrow({ value: amount.rawAmount() });\n } else {\n if (new BigNumber(amount.rawAmount()).lt(0)) {\n return this.auToken\n .connect(this._networkConnection.signer!)\n .repayBorrow(INF);\n } else {\n return this.auToken\n .connect(this._networkConnection.signer!)\n .repayBorrow(amount.rawAmount());\n }\n }\n }\n public async enableCollateral(): Promise<TransactionResponse> {\n return this._comptroller\n .connect(this._networkConnection.signer!)\n .enterMarkets([this.auToken.address]);\n }\n public async disableCollateral(): Promise<TransactionResponse> {\n return this._comptroller\n .connect(this._networkConnection.signer!)\n .exitMarket(this.auToken.address);\n }\n}\n\nexport class MoneyMarket extends BlockchainEntity {\n protected address: Address;\n\n protected underlying: Address;\n constructor(address: string, underlying: string) {\n super();\n this.address = validateAndParseAddress(address);\n this.underlying = validateAndParseAddress(underlying);\n }\n public read(networkConnection: NetworkConnection): MoneyMarketRead {\n return new MoneyMarketRead(\n networkConnection,\n this.address,\n this.underlying\n );\n }\n\n public readWrite(networkConnection: NetworkConnection): MoneyMarketReadWrite {\n return new MoneyMarketReadWrite(\n networkConnection,\n this.address,\n this.underlying\n );\n }\n}\n","import { BlockchainEntity, BlockchainEntityRead } from './BlockchainEntity';\nimport { NetworkConnection, Address, UserLockingDetails } from './types';\nimport { Contract, BigNumber as BN } from 'ethers';\nimport AuriFairLaunchABI from '@aurigami/contracts/artifacts/contracts/AuriFairLaunch.sol/AuriFairLaunch.json';\nimport PulpABI from '@aurigami/contracts/artifacts/contracts/PULP.sol/PULP.json';\nimport EIP20InterfaceABI from '@aurigami/contracts/artifacts/contracts/interfaces/EIP20Interface.sol/EIP20Interface.json';\nimport ComptrollerABI from '@aurigami/contracts/artifacts/contracts/Comptroller.sol/Comptroller.json';\nimport AuriLensABI from '@aurigami/contracts/artifacts/contracts/AuriLens.sol/AuriLens.json';\nimport {\n AuriFairLaunch,\n AuriLens,\n Comptroller,\n IERC20,\n PULP,\n} from '@aurigami/contracts/typechain';\nimport { TransactionResponse } from '@ethersproject/abstract-provider';\nimport {\n networkAddresses,\n ONE_DAY,\n ALL_STAKING_POOLS,\n REWARD_CLAIM_START,\n ONE_WEEK,\n} from './constants';\nimport { getCurrentTimestamp } from './helpers';\nimport { Token } from './token';\nimport { TokenAmount } from './tokenAmount';\nimport { getDecimal } from './helpers';\nimport BigNumber from 'bignumber.js';\n\nconst LOCKING_DENOMINATOR = BN.from(10000);\nexport class PapermillRead extends BlockchainEntityRead {\n public plyToken: Token;\n public pulpToken: Token;\n\n protected _ply: IERC20;\n protected _pulp: PULP;\n protected _comptroller: Comptroller;\n protected _auriFairLaunch: AuriFairLaunch;\n protected _auriLens: AuriLens;\n\n constructor(networkConnection: NetworkConnection) {\n super(networkConnection);\n\n let plyAddress = networkAddresses.tokens.PLY;\n let pulpAddress = networkAddresses.tokens.PULP;\n\n this.plyToken = new Token(plyAddress, getDecimal(plyAddress));\n this.pulpToken = new Token(pulpAddress, getDecimal(pulpAddress));\n\n this._comptroller = new Contract(\n networkAddresses.misc.COMPTROLLER,\n ComptrollerABI.abi,\n networkConnection.provider\n ) as Comptroller;\n this._auriFairLaunch = new Contract(\n networkAddresses.misc.AURIFAIRLAUNCH,\n AuriFairLaunchABI.abi,\n networkConnection.provider\n ) as AuriFairLaunch;\n this._auriLens = new Contract(\n networkAddresses.misc.AURILENS,\n AuriLensABI.abi,\n networkConnection.provider\n ) as AuriLens;\n this._ply = new Contract(\n plyAddress,\n EIP20InterfaceABI.abi,\n networkConnection.provider\n ) as IERC20;\n this._pulp = new Contract(\n pulpAddress,\n PulpABI.abi,\n networkConnection.provider\n ) as PULP;\n }\n\n public async getPlyBalance(userAddress: Address): Promise<TokenAmount> {\n const plyBalance = await this._ply.balanceOf(userAddress);\n return new TokenAmount(this.plyToken, plyBalance.toString());\n }\n\n public async getPulpBalance(userAddress: Address): Promise<TokenAmount> {\n const pulpBalance = await this._pulp.balanceOf(userAddress);\n return new TokenAmount(this.pulpToken, pulpBalance.toString());\n }\n\n /**\n * Get all unclaimed PLY reward of the user in all markets + all staking pools\n */\n public async getUnclaimedPlyReward(\n userAddress: Address\n ): Promise<TokenAmount> {\n let rewardBalancesMetadata = await this._auriLens.callStatic.claimRewards(\n this._comptroller.address,\n this._auriFairLaunch.address,\n ALL_STAKING_POOLS,\n { from: userAddress }\n );\n\n return new TokenAmount(\n this.plyToken,\n rewardBalancesMetadata.plyAccrured.toString()\n );\n }\n\n private getWeek(timestamp: number): number {\n return BN.from(timestamp - REWARD_CLAIM_START)\n .div(ONE_WEEK)\n .toNumber();\n }\n /**\n * Get all locking details of the user in all markets + all staking pools\n */\n public async getLockingDetails(\n userAddress: Address\n ): Promise<UserLockingDetails> {\n const currentWeek = this.getWeek(getCurrentTimestamp());\n var promises: any[] = [];\n\n promises.push(\n this._auriLens.getPercentLock(\n this._pulp.address,\n userAddress,\n currentWeek\n )\n );\n promises.push(\n this._auriLens.getPercentLock(\n this._pulp.address,\n userAddress,\n currentWeek + 1\n )\n );\n promises.push(this.getUnclaimedPlyReward(userAddress));\n\n var values: any[] = await Promise.all(promises);\n\n let percentLockCurrentWeek = BN.from(values[0]);\n let percentLockNextWeek = BN.from(values[1]);\n let totalRewards = values[2] as TokenAmount;\n\n let [pulpAmountCurrentWeek, plyAmountCurrentWeek] =\n await this._pulp.calcLockAmount(userAddress, totalRewards.rawAmount());\n\n // Predict next week lock amount = totalRewards * percentLock next week\n // This doesn't take (the reward that user might earn in the next week) into account\n let plyAmountNextWeek = percentLockNextWeek\n .mul(totalRewards.rawAmount())\n .div(LOCKING_DENOMINATOR);\n let pulpAmountNextWeek = BN.from(totalRewards.rawAmount()).sub(\n plyAmountNextWeek\n );\n\n // we need to divide these two number by 10000 and multiple by 100 to get the percentage\n // I need to use BigNumber to do this because BN of ethers.js doesn't support floating point\n let currentUnlockPortion = LOCKING_DENOMINATOR.sub(\n percentLockCurrentWeek\n ).toString();\n let nextUnlockPortion =\n LOCKING_DENOMINATOR.sub(percentLockNextWeek).toString();\n\n return {\n vestingStart: REWARD_CLAIM_START,\n currentUnlockPortion: new BigNumber(currentUnlockPortion)\n .dividedBy(100)\n .toNumber(),\n accruedPly: totalRewards,\n currentPly: new TokenAmount(\n this.plyToken,\n plyAmountCurrentWeek.toString()\n ),\n currentPulp: new TokenAmount(\n this.pulpToken,\n pulpAmountCurrentWeek.toString()\n ),\n //\n nextUnlockPortion: new BigNumber(nextUnlockPortion)\n .dividedBy(100)\n .toNumber(),\n nextPly: new TokenAmount(this.plyToken, plyAmountNextWeek.toString()),\n nextPulp: new TokenAmount(this.pulpToken, pulpAmountNextWeek.toString()),\n };\n }\n\n /**\n * Get the first timestamp that the unlockPortion reach the target\n *\n * @param userAddress currently doesn't matter\n * @param targetUnlockPortion unlockPortion target\n */\n public async getTimestampToUnlock(\n userAddress: Address,\n targetUnlockPortion: number\n ): Promise<number> {\n let weekId = await this._auriLens.getWeekToUnlock(\n this._pulp.address,\n userAddress,\n targetUnlockPortion * 100\n );\n\n return REWARD_CLAIM_START + ONE_WEEK * weekId.toNumber();\n }\n\n public async getUnlockPortionAt(\n userAddress: Address,\n timestamp: number\n ): Promise<number> {\n let lockPortion = await this._auriLens.getPercentLock(\n this._pulp.address,\n userAddress,\n this.getWeek(timestamp)\n );\n\n let unlockPortion = LOCKING_DENOMINATOR.sub(lockPortion);\n\n return unlockPortion.toNumber() / 100;\n }\n}\n\nexport class PapermillReadWrite extends PapermillRead {\n constructor(networkConnection: NetworkConnection) {\n super(networkConnection);\n }\n\n /**\n * Redeem PLY from PULP and transfer PLY to another address\n * @param recipient Address that will receive the PLY.\n * @param amount Amount of PULP to be converted to PLY.\n * Set to ethers.constants.MaxUint256 for max redeem.\n */\n public async redeem(\n recipient: Address,\n amount: TokenAmount\n ): Promise<TransactionResponse> {\n return this._pulp\n .connect(this._networkConnection.signer!)\n .redeem(recipient, amount.rawAmount());\n }\n\n /**\n * Redeem PLY from PULP and transfer PLY to msg.sender\n * @param amount Amount of PULP to be converted to PLY.\n * Set to ethers.constants.MaxUint256 for max redeem.\n */\n public async selfRedeem(amount: TokenAmount): Promise<TransactionResponse> {\n let msgSender: string = await this._networkConnection.signer!.getAddress();\n return this.redeem(msgSender, amount);\n }\n}\n\nexport class Papermill extends BlockchainEntity {\n constructor() {\n super();\n }\n public read(networkConnection: NetworkConnection): PapermillRead {\n return new PapermillRead(networkConnection);\n }\n\n public readWrite(networkConnection: NetworkConnection): PapermillReadWrite {\n return new PapermillReadWrite(networkConnection);\n }\n}\n","import AuriFairLaunchABI from '@aurigami/contracts/artifacts/contracts/AuriFairLaunch.sol/AuriFairLaunch.json';\nimport AuriLensABI from '@aurigami/contracts/artifacts/contracts/AuriLens.sol/AuriLens.json';\nimport ComptrollerABI from '@aurigami/contracts/artifacts/contracts/Comptroller.sol/Comptroller.json';\nimport EIP20InterfaceABI from '@aurigami/contracts/artifacts/contracts/interfaces/EIP20Interface.sol/EIP20Interface.json';\nimport {\n AuriFairLaunch,\n AuriLens,\n Comptroller,\n IERC20,\n} from '@aurigami/contracts/typechain';\nimport { TransactionResponse } from '@ethersproject/abstract-provider';\nimport BigNumber from 'bignumber.js';\nimport { BigNumber as BN, Contract } from 'ethers';\nimport { BlockchainEntity, BlockchainEntityRead } from './BlockchainEntity';\nimport {\n DECIMAL_PRECISION,\n networkAddresses,\n ONE_DAY,\n PLYWNEAR_POOL_ID,\n PLYWNEAR_REWARD_TOKENS,\n} from './constants';\nimport { calcLMRewardApr, getDecimal } from './helpers';\nimport { fetchValuation, valuateToken } from './priceFetcher';\nimport { PLYWNEARToken, Token } from './token';\nimport { TokenAmount } from './tokenAmount';\nimport {\n NetworkConnection,\n PLYWNEARPoolDetails,\n TokenAPY,\n TokenValuation,\n} from './types';\n\nexport class StakingRead extends BlockchainEntityRead {\n protected _comptroller: Comptroller;\n protected _auriFairLaunch: AuriFairLaunch;\n protected _auriLens: AuriLens;\n constructor(networkConnection: NetworkConnection) {\n super(networkConnection);\n this._comptroller = new Contract(\n networkAddresses.misc.COMPTROLLER,\n ComptrollerABI.abi,\n networkConnection.provider\n ) as Comptroller;\n this._auriFairLaunch = new Contract(\n networkAddresses.misc.AURIFAIRLAUNCH,\n AuriFairLaunchABI.abi,\n networkConnection.provider\n ) as AuriFairLaunch;\n this._auriLens = new Contract(\n networkAddresses.misc.AURILENS,\n AuriLensABI.abi,\n networkConnection.provider\n ) as AuriLens;\n }\n\n public async getPLYWNEARPoolDetails(): Promise<PLYWNEARPoolDetails> {\n var stakedLiquidity: BN, rewardPerSeconds: BN[];\n await this._auriFairLaunch.getPoolInfo(PLYWNEAR_POOL_ID).then((res) => {\n stakedLiquidity = res.totalStake;\n rewardPerSeconds = res.rewardPerSeconds;\n });\n\n let stakedLiquidityAmount = new TokenAmount(\n PLYWNEARToken,\n stakedLiquidity!.toString()\n );\n\n var totalStakeValuation: BigNumber = await fetchValuation(\n stakedLiquidityAmount,\n this._networkConnection.provider\n );\n\n var promises = [];\n\n // Calculate the reward per second in USD\n for (let i = 0; i < rewardPerSeconds!.length; i++) {\n let rewardTokenAddress = PLYWNEAR_REWARD_TOKENS[i];\n let rewardToken = new Token(\n rewardTokenAddress,\n getDecimal(rewardTokenAddress)\n );\n let rewardPerSecond = rewardPerSeconds![i];\n promises.push(\n fetchValuation(\n new TokenAmount(rewardToken, rewardPerSecond!.toString()),\n this._networkConnection.provider\n )\n );\n }\n\n let APYs: TokenAPY[] = [];\n (await Promise.all(promises)).forEach((rewardPerSecondValuation, i) => {\n let rewardTokenAddress = PLYWNEAR_REWARD_TOKENS[i];\n let apy = calcLMRewardApr(\n rewardPerSecondValuation,\n totalStakeValuation,\n ONE_DAY * 365\n ).toFixed(DECIMAL_PRECISION);\n\n APYs.push({\n address: rewardTokenAddress,\n apy: apy,\n });\n });\n\n return {\n totalStakedLiquidity: {\n tokenAmount: stakedLiquidityAmount,\n currencyAmount: {\n currency: 'USD',\n amount: totalStakeValuation!.toFixed(DECIMAL_PRECISION),\n },\n },\n APYs: APYs,\n };\n }\n\n /**\n * Get amount and value in $ of staked LP tokens\n */\n public async stakeBalanceOf(user: string): Promise<TokenValuation> {\n const userInfo = await this._auriFairLaunch.getUserInfo(\n PLYWNEAR_POOL_ID,\n user\n );\n let stakeAmount = new TokenAmount(\n PLYWNEARToken,\n userInfo.amount.toString()\n );\n\n return valuateToken(stakeAmount, this._networkConnection.provider);\n }\n\n /**\n * Get amount and value in $ of LP token in user wallet\n */\n public async LpBalanceOf(user: string): Promise<TokenValuation> {\n let lpContract = new Contract(\n networkAddresses.tokens.PLYWNEAR,\n EIP20InterfaceABI.abi,\n this._networkConnection.provider\n ) as IERC20;\n let balance = await lpContract.balanceOf(user);\n\n return valuateToken(\n new TokenAmount(PLYWNEARToken, balance.toString()),\n this._networkConnection.provider\n );\n }\n\n public async unclaimedRewardsOf(user: string): Promise<TokenAmount[]> {\n let userInfo = await this._auriFairLaunch.callStatic.updateAndGetUserInfo(\n PLYWNEAR_POOL_ID,\n user,\n { from: user }\n );\n\n let rewards = userInfo.unclaimedRewards;\n return rewards.map((reward, i) =>\n TokenAmount.fromAddressAndAmount(\n PLYWNEAR_REWARD_TOKENS[i],\n reward.toString()\n )\n );\n }\n}\n\nexport class StakingReadWrite extends StakingRead {\n public async stake(amount: TokenAmount): Promise<TransactionResponse> {\n return this._auriFairLaunch\n .connect(this._networkConnection.signer!)\n .deposit(PLYWNEAR_POOL_ID, amount.rawAmount());\n }\n\n public async unstake(amount: TokenAmount): Promise<TransactionResponse> {\n return this._auriFairLaunch\n .connect(this._networkConnection.signer!)\n .withdraw(PLYWNEAR_POOL_ID, amount.rawAmount());\n }\n}\n\nexport class Staking extends BlockchainEntity {\n constructor() {\n super();\n }\n public read(networkConnection: NetworkConnection): StakingRead {\n return new StakingRead(networkConnection);\n }\n\n public readWrite(networkConnection: NetworkConnection): StakingReadWrite {\n return new StakingReadWrite(networkConnection);\n }\n}\n","import AuriFairLaunchABI from '@aurigami/contracts/artifacts/contracts/AuriFairLaunch.sol/AuriFairLaunch.json';\nimport AuriLensABI from '@aurigami/contracts/artifacts/contracts/AuriLens.sol/AuriLens.json';\nimport ComptrollerABI from '@aurigami/contracts/artifacts/contracts/Comptroller.sol/Comptroller.json';\nimport FaucetABI from '@aurigami/contracts/artifacts/contracts/mock/Faucet.sol/Faucet.json';\nimport {\n AuriFairLaunch,\n AuriLens,\n Comptroller,\n} from '@aurigami/contracts/typechain';\nimport { TransactionResponse } from '@ethersproject/abstract-provider';\nimport BigNumber from 'bignumber.js';\nimport { BigNumber as BN, Contract } from 'ethers';\nimport { BlockchainEntity, BlockchainEntityRead } from './BlockchainEntity';\nimport {\n ALL_STAKING_POOLS,\n BORROW_LIMIT_BUFFER,\n DECIMAL_PRECISION,\n networkAddresses,\n} from './constants';\nimport { decimalFactor, isSameAddress } from './helpers';\nimport { MoneyMarketRead } from './MoneyMarket';\nimport { PapermillRead } from './Papermill';\nimport { calcValuation, fetchPrice } from './priceFetcher';\nimport { StakingRead, StakingReadWrite } from './Staking';\nimport { Token } from './token';\nimport { TokenAmount } from './tokenAmount';\nimport {\n Address,\n CurrencyAmount,\n HypotheticalStats,\n MarketAction,\n NetworkConnection,\n PLYWNEARPoolDetails,\n TokenValuation,\n UserDetails,\n UserMarketDetails,\n} from './types';\n\nexport class SdkRead extends BlockchainEntityRead {\n protected _comptroller: Comptroller;\n protected _auriFairLaunch: AuriFairLaunch;\n protected _auriLens: AuriLens;\n constructor(networkConnection: NetworkConnection) {\n super(networkConnection);\n this._comptroller = new Contract(\n networkAddresses.misc.COMPTROLLER,\n ComptrollerABI.abi,\n networkConnection.provider\n ) as Comptroller;\n this._auriFairLaunch = new Contract(\n networkAddresses.misc.AURIFAIRLAUNCH,\n AuriFairLaunchABI.abi,\n networkConnection.provider\n ) as AuriFairLaunch;\n this._auriLens = new Contract(\n networkAddresses.misc.AURILENS,\n AuriLensABI.abi,\n networkConnection.provider\n ) as AuriLens;\n }\n\n public async getUserDetails(userAddress: string): Promise<UserDetails> {\n const marketCount = networkAddresses.auTokens.length;\n var userMarketDetails: UserMarketDetails[] = [],\n assetsIn: string[];\n var promises = [];\n var totalBorrowLimit = new BigNumber(0);\n var pricePromises = [];\n for (const auToken of networkAddresses.auTokens) {\n const userMarketDetail: UserMarketDetails = {} as UserMarketDetails;\n userMarketDetails.push(userMarketDetail);\n userMarketDetail.market = auToken.underlying;\n const moneyMarket: MoneyMarketRead = new MoneyMarketRead(\n this._networkConnection,\n auToken.address,\n auToken.underlying\n );\n promises.push(\n moneyMarket\n .getUserDepositBalance(userAddress)\n .then((res: TokenAmount) => {\n userMarketDetail.depositBalance = res;\n })\n );\n promises.push(\n moneyMarket\n .getUserBorrowBalance(userAddress)\n .then((res: TokenAmount) => {\n userMarketDetail.borrowBalance = res;\n })\n );\n promises.push(\n moneyMarket.getCollateralRatio().then((res: BigNumber) => {\n userMarketDetail.collateralRatio = res.toNumber();\n })\n );\n pricePromises.push(\n fetchPrice(\n moneyMarket.underlying.address,\n this._networkConnection.provider\n ).then((res) => {\n userMarketDetail.underlyingPrice = res.toString();\n return res;\n })\n );\n }\n\n promises.push(\n this._comptroller.getAssetsIn(userAddress).then((res: string[]) => {\n assetsIn = res;\n })\n );\n\n await Promise.all(promises);\n var underlyingPrices = await Promise.all(pricePromises);\n var depositValues = [];\n for (var i = 0; i < marketCount; i++) {\n const auToken = networkAddresses.auTokens[i];\n if (\n assetsIn!.find((auAddress: Address) =>\n isSameAddress(auToken.address, auAddress)\n ) !== undefined\n ) {\n userMarketDetails[i].isCollateral = true;\n } else {\n userMarketDetails[i].isCollateral = false;\n }\n depositValues.push(\n calcValuation(userMarketDetails[i].depositBalance, underlyingPrices[i])\n );\n }\n\n totalBorrowLimit = depositValues.reduce(\n (p: BigNumber, v: BigNumber, index: number) => {\n if (userMarketDetails[index].isCollateral)\n return p.plus(\n v.multipliedBy(userMarketDetails[index].collateralRatio)\n );\n return p;\n },\n new BigNumber(0)\n );\n\n var accountLiquidity: [BN, BN] =\n await this._comptroller.getAccountLiquidity(userAddress);\n\n var borrowedvaluation: BigNumber = totalBorrowLimit.minus(\n new BigNumber(accountLiquidity[0].toString()).div(decimalFactor(18))\n );\n\n if (borrowedvaluation.lt('0.00001')) {\n // Igore dust, dust could be the result of network delay causing collateral valuation calc to be different on vs off chain\n borrowedvaluation = new BigNumber(0);\n }\n\n const bufferedBorrowLimit: BigNumber =\n totalBorrowLimit.multipliedBy(BORROW_LIMIT_BUFFER);\n const minimumBorrowLimitAllowed =\n borrowedvaluation.div(BORROW_LIMIT_BUFFER);\n\n var borrowableAmount: BigNumber;\n if (bufferedBorrowLimit.lte(borrowedvaluation)) {\n borrowableAmount = new BigNumber(0);\n } else {\n borrowableAmount = bufferedBorrowLimit.minus(borrowedvaluation);\n }\n\n for (var i = 0; i < marketCount; i++) {\n const auToken = networkAddresses.auTokens[i];\n const moneyMarket: MoneyMarketRead = new MoneyMarketRead(\n this._networkConnection,\n auToken.address,\n auToken.underlying\n );\n const borrowLimitMargin = totalBorrowLimit\n .minus(minimumBorrowLimitAllowed)\n .gt(0)\n ? totalBorrowLimit.minus(minimumBorrowLimitAllowed)\n : new BigNumber(0);\n const maxWithdrawCap: BigNumber = borrowLimitMargin\n .div(userMarketDetails[i].collateralRatio)\n .div(underlyingPrices[i]);\n userMarketDetails[i].maxWithdrawableAmount =\n userMarketDetails[i].isCollateral &&\n maxWithdrawCap.lt(userMarketDetails[i].depositBalance.formattedAmount())\n ? new TokenAmount(\n moneyMarket.underlying,\n maxWithdrawCap.toFixed(24),\n false\n )\n : new TokenAmount(\n moneyMarket.underlying,\n userMarketDetails[i].depositBalance.rawAmount()\n );\n }\n\n return {\n markets: userMarketDetails,\n borrowLimit: {\n currency: 'USD',\n amount: bufferedBorrowLimit.toFixed(DECIMAL_PRECISION),\n },\n userLockingDetails: await new PapermillRead(\n this._networkConnection\n ).getLockingDetails(userAddress),\n borrowableAmount: {\n currency: 'USD',\n amount: borrowableAmount.toFixed(DECIMAL_PRECISION),\n },\n };\n }\n\n public async getPLYWNEARPoolDetails(): Promise<PLYWNEARPoolDetails> {\n return new StakingRead(this._networkConnection).getPLYWNEARPoolDetails();\n }\n\n public async getTokenPrice(token: Token): Promise<CurrencyAmount> {\n const price = await fetchPrice(\n token.address,\n this._networkConnection.provider\n );\n return {\n currency: 'USD',\n amount: price.toFixed(DECIMAL_PRECISION),\n };\n }\n\n /**\n * Get amount and value in $ of staked LP tokens\n */\n public async stakeBalanceOf(user: string): Promise<TokenValuation> {\n return new StakingRead(this._networkConnection).stakeBalanceOf(user);\n }\n\n /**\n * Get amount and value in $ of LP token in user wallet\n */\n public async LpBalanceOf(user: string): Promise<TokenValuation> {\n return new StakingRead(this._networkConnection).LpBalanceOf(user);\n }\n\n public async unclaimedRewardsOf(user: string): Promise<TokenAmount[]> {\n return new StakingRead(this._networkConnection).unclaimedRewardsOf(user);\n }\n\n public calcHypotheticalStats({\n userMarketDetail,\n currentBorrowLimit,\n currentBorrowValuation,\n action,\n tokenAmount,\n }: {\n userMarketDetail: UserMarketDetails;\n currentBorrowLimit: CurrencyAmount;\n currentBorrowValuation: CurrencyAmount;\n action: MarketAction;\n tokenAmount?: TokenAmount;\n }): HypotheticalStats {\n var newBorrowLimit = new BigNumber(currentBorrowLimit.amount),\n newBorrowValuation = new BigNumber(currentBorrowValuation.amount);\n switch (action) {\n case MarketAction.EnableCollateral:\n case MarketAction.DisableCollateral:\n var deltaBorrowLimit = calcValuation(\n userMarketDetail.depositBalance,\n new BigNumber(userMarketDetail.underlyingPrice)\n )\n .multipliedBy(userMarketDetail.collateralRatio)\n .multipliedBy(BORROW_LIMIT_BUFFER);\n newBorrowLimit =\n action == MarketAction.EnableCollateral\n ? newBorrowLimit.plus(deltaBorrowLimit)\n : newBorrowLimit.minus(deltaBorrowLimit);\n break;\n\n case MarketAction.Deposit:\n case MarketAction.Withdraw:\n deltaBorrowLimit = calcValuation(\n tokenAmount!,\n new BigNumber(userMarketDetail.underlyingPrice)\n )\n .multipliedBy(userMarketDetail.collateralRatio)\n .multipliedBy(BORROW_LIMIT_BUFFER);\n newBorrowLimit =\n action == MarketAction.Deposit\n ? newBorrowLimit.plus(deltaBorrowLimit)\n : newBorrowLimit.minus(deltaBorrowLimit);\n break;\n\n case MarketAction.Borrow:\n case MarketAction.Repay:\n var deltaBorrowValuation = calcValuation(\n tokenAmount!,\n new BigNumber(userMarketDetail.underlyingPrice)\n );\n newBorrowValuation =\n action == MarketAction.Borrow\n ? newBorrowValuation.plus(deltaBorrowValuation)\n : newBorrowValuation.minus(deltaBorrowValuation);\n break;\n }\n return {\n newBorrowLimit: {\n amount: newBorrowLimit!.toFixed(DECIMAL_PRECISION),\n currency: 'USD',\n },\n newBorrowUtilization: newBorrowLimit.eq(0)\n ? newBorrowValuation.eq(0)\n ? 0\n : 9999.99\n : newBorrowValuation!.div(newBorrowLimit!).toNumber(),\n };\n }\n}\n\nexport class SdkReadWrite extends SdkRead {\n /**\n * Claim PLY reward in all markets + staking pools\n */\n public async claim(): Promise<TransactionResponse> {\n return this._auriLens\n .connect(this._networkConnection.signer!)\n .claimRewards(\n this._comptroller.address,\n this._auriFairLaunch.address,\n ALL_STAKING_POOLS\n );\n }\n\n public async stake(amount: TokenAmount): Promise<TransactionResponse> {\n return new StakingReadWrite(this._networkConnection).stake(amount);\n }\n\n public async unstake(amount: TokenAmount): Promise<TransactionResponse> {\n return new StakingReadWrite(this._networkConnection).unstake(amount);\n }\n\n public async faucetDrip(): Promise<TransactionResponse> {\n const faucet = new Contract(\n networkAddresses.misc.FAUCET,\n FaucetABI.abi,\n this._networkConnection.provider\n );\n return faucet.connect(this._networkConnection.signer!).drip();\n }\n}\n\nexport class SDK extends BlockchainEntity {\n constructor() {\n super();\n }\n public read(networkConnection: NetworkConnection): SdkRead {\n return new SdkRead(networkConnection);\n }\n\n public readWrite(networkConnection: NetworkConnection): SdkReadWrite {\n return new SdkReadWrite(networkConnection);\n }\n}\n","import { Token } from './token';\nimport { TokenAmount } from './tokenAmount';\nimport { UserMarketDetails } from './types';\n\nexport const dummyToken = new Token(\n '0xb97ef9ef8734c71904d8002f8b6bc66dd9c48a6e',\n 6\n);\n\nexport const dummyPly = new Token(\n '0x8729438eb15e2c8b576fcc6aecda6a148776c0f5',\n 18\n);\n\nexport const dummyPlyAurora = new Token(\n '0xE530dC2095Ef5653205CF5ea79F8979a7028065c',\n 18\n);\n\nexport const dummyTokenAmount = new TokenAmount(dummyToken, '123.456', false);\n\nexport const dummyZeroTokenAmount = new TokenAmount(dummyToken, '0');\n\nexport const dummyTokenAmount2 = new TokenAmount(dummyToken, '456.123', false);\n\nexport const dummyTokenAmount3 = new TokenAmount(dummyToken, '1000.123', false);\n\nexport const dummyMarketAddress = '0xbeb5d47a3f720ec0a390d04b4d41ed7d9688bc7f'; // qiUSDC\n\nexport const dummyUserMarketDetails: UserMarketDetails = {\n market: dummyMarketAddress,\n depositBalance: dummyTokenAmount2,\n borrowBalance: dummyZeroTokenAmount,\n isCollateral: true,\n maxWithdrawableAmount: dummyTokenAmount,\n collateralRatio: 0.5,\n underlyingPrice: '1',\n};\n","import { BlockchainEntityRead } from './BlockchainEntity';\nimport { NetworkConnection } from './types';\nimport { AuToken } from '@aurigami/contracts/typechain';\nimport AuTokenABI from '@aurigami/contracts/artifacts/contracts/AuToken.sol/AuToken.json';\nimport { BigNumber as BN, Contract } from 'ethers';\n\ntype SimpleTransfer = {\n from: string;\n to: string;\n amount: BN;\n blockNumber: number;\n};\n\nexport class TransferEventQuery extends BlockchainEntityRead {\n auToken: AuToken;\n\n constructor(tokenAddr: string, networkConnection: NetworkConnection) {\n super(networkConnection);\n this.auToken = new Contract(\n tokenAddr,\n AuTokenABI.abi,\n this._networkConnection.provider\n ) as AuToken;\n }\n\n /**\n * query ERC20 transfers from/to an address & auto convert them into SimpleTransfer.\n * The result will be sorted by blocknumber.\n */\n async queryERC20TransfersOf(\n address: string,\n fromBlock: number,\n toBlock: number\n ): Promise<SimpleTransfer[]> {\n const filters = [\n this.auToken.filters.Transfer(address, null),\n this.auToken.filters.Transfer(null, address),\n ];\n\n const events = (\n await Promise.all(\n filters.map((filter) =>\n this.auToken.queryFilter(filter, fromBlock, toBlock)\n )\n )\n ).flat();\n\n let results: SimpleTransfer[] = events.map((event) => {\n return {\n from: event.args![0],\n to: event.args![1],\n amount: event.args![2],\n blockNumber: event.blockNumber,\n };\n });\n\n results.sort((a, b) => a.blockNumber - b.blockNumber);\n\n return results;\n }\n\n /**\n * Get the balance of an address at a given block number.\n *\n * Note that this will return the balance after the block get mined.\n */\n async queryERC20BalanceAt(address: string, endBlock: number): Promise<BN> {\n return this.auToken.balanceOf(address, { blockTag: endBlock + 1 });\n }\n}\n","import { Provider } from '@ethersproject/abstract-provider';\nimport { TransactionResponse } from '@ethersproject/abstract-provider';\nimport { BlockchainEntity, BlockchainEntityRead } from './BlockchainEntity';\nimport { Address, NetworkConnection } from './types';\nimport { BigNumber as BN, Contract, utils } from 'ethers';\nimport { TransferEventQuery } from './transfer-event-query';\nimport {\n AIRDROP_START_TIMESTAMP,\n AIRDROP_KEEP_THRESHOLD,\n AIRDROP_END_TIMESTAMP,\n networkAddresses,\n} from './constants';\nimport AuriAirdropABI from '@aurigami/contracts/artifacts/contracts/AuriAirdrop.sol/AuriAirdrop.json';\nimport {\n getBlockBeforeTimestamp,\n getCurrentTimestamp,\n getDecimal,\n isSameAddress,\n} from './helpers';\nimport AIRDROP_AUTOKEN_INFO from './airdrop_misc/auTokensInfo.json';\nimport AIRDROP_WHITELIST_ADDRESSES from './airdrop_misc/whitelist.json';\nimport { AuriAirdrop } from '@aurigami/contracts/typechain';\nimport assert from 'assert';\nimport { TokenAmount } from './tokenAmount';\nimport { Token } from './token';\n\ntype AirdropUnderlyingInfo = {\n minDeposit: BN;\n};\n\ntype AirdropAuTokenInfo = {\n address: string;\n exchangeRate: BN;\n deploymentBlock: number;\n underlying: AirdropUnderlyingInfo;\n};\n\nclass AirdropSettings {\n private static _instance: AirdropSettings;\n\n airdropStartBlock: number = 0;\n airdropEndBlock: number = 0;\n airdropStartTimestamp: number = AIRDROP_START_TIMESTAMP;\n airdropEndTimestamp: number = AIRDROP_END_TIMESTAMP;\n airdropThreshold: number = AIRDROP_KEEP_THRESHOLD;\n private constructor() {}\n\n public static async getSettings(\n provider: Provider\n ): Promise<AirdropSettings> {\n if (this._instance) return this._instance;\n\n let settings: AirdropSettings = new AirdropSettings();\n\n settings.airdropStartBlock = await getBlockBeforeTimestamp(\n provider,\n settings.airdropStartTimestamp\n );\n\n settings.airdropEndBlock = await getBlockBeforeTimestamp(\n provider,\n settings.airdropEndTimestamp\n );\n\n this._instance = settings;\n return settings;\n }\n}\n\nclass AirdropAuTokenKeepTracker extends BlockchainEntityRead {\n private _transferQuery: TransferEventQuery;\n private _airdropAuTokenInfo: AirdropAuTokenInfo;\n public constructor(\n networkConnection: NetworkConnection,\n airdropAuTokenInfo: AirdropAuTokenInfo\n ) {\n super(networkConnection);\n this._transferQuery = new TransferEventQuery(\n airdropAuTokenInfo.address,\n networkConnection\n );\n this._airdropAuTokenInfo = airdropAuTokenInfo;\n\n // exchangeRate = 102% * exchangeRate, see why in the comment of _toUnderlyingValue\n this._airdropAuTokenInfo.exchangeRate =\n this._airdropAuTokenInfo.exchangeRate.add(\n this._airdropAuTokenInfo.exchangeRate.div(50)\n );\n }\n\n /**\n * Convert the given amount of auToken to the underlying value with the stored exchange rate\n *\n * Why we need to do this?\n *\n * By transfer event, we cannot know the exact underlying, the only\n * info that we can keep track of via transfer is event is the auToken amount. So we need to\n * convert it to the underlying value with the stored exchange rate.\n *\n * However, we cannot just simply use auTokenAmount * exchangeRate, because the exchange rate\n * is changing over time. As advice of the contract team, use fixed exchangeRate * 102% is good enough.\n *\n */\n private _toUnderlyingValue(auTokenAmount: BN): BN {\n return auTokenAmount\n .mul(this._airdropAuTokenInfo.exchangeRate)\n .div(BN.from(10).pow(18));\n }\n\n /**\n * Check if the user has been deposit at least (minDeposit) and keep it for\n * more than AIRDROP_KEEP_THRESHOLD milliseconds\n *\n * How it works:\n * Whenever the user balance is exceed minDeposit, we will record the timestamp,\n * and when the balance is below minDeposit, we will compare with the saved timestamp to see\n * whether it has been keep for more than AIRDROP_KEEP_THRESHOLD milliseconds.\n *\n */\n public async isEligible(address: string): Promise<boolean> {\n const settings = await AirdropSettings.getSettings(\n this._networkConnection.provider\n );\n const minDeposit = this._airdropAuTokenInfo.underlying.minDeposit;\n\n // Get user balance at the time of Airdrop start\n let balance = await this._transferQuery.queryERC20BalanceAt(\n address,\n settings.airdropStartBlock - 1\n );\n\n const [BELOW, ABOVE] = [false, true];\n let flag = BELOW;\n // variable to store the last timestamp that, from it to \"current\" timestamp,\n // the balance is always above minDeposit\n let lastEligibleBalanceTimestamp = 0;\n\n if (this._toUnderlyingValue(balance).gte(minDeposit)) {\n lastEligibleBalanceTimestamp = settings.airdropStartTimestamp;\n flag = ABOVE;\n }\n\n let events = await this._transferQuery.queryERC20TransfersOf(\n address,\n settings.airdropStartBlock,\n settings.airdropEndBlock\n );\n\n for (let { from, to, amount, blockNumber } of events) {\n if (isSameAddress(from, address)) {\n balance = balance.sub(amount);\n }\n if (isSameAddress(to, address)) {\n balance = balance.add(amount);\n }\n\n // if it is different from the flag, that means the balance is changing\n if (this._toUnderlyingValue(balance).gte(minDeposit) != flag) {\n flag = !flag;\n const timestamp = (\n await this._networkConnection.provider.getBlock(blockNumber)\n ).timestamp;\n\n // if this txn make the balance below the minDeposit,\n // check whether it has been keep for more than AIRDROP_KEEP_THRESHOLD\n if (flag == BELOW) {\n if (\n timestamp - lastEligibleBalanceTimestamp >=\n settings.airdropThreshold\n ) {\n return true;\n }\n lastEligibleBalanceTimestamp = 0;\n } else {\n // record the timestamp when the balance is above minDeposit\n lastEligibleBalanceTimestamp = timestamp;\n }\n }\n }\n\n // if after the last txn, the balance is still above minDeposit,\n // we should check from the last timestamp to \"now\"\n if (flag == ABOVE) {\n const timestamp = Math.min(\n settings.airdropEndTimestamp,\n getCurrentTimestamp()\n );\n return (\n timestamp - lastEligibleBalanceTimestamp >= settings.airdropThreshold\n );\n }\n\n return false;\n }\n}\n\nexport class AirdropRead extends BlockchainEntityRead {\n protected _airDrop: AuriAirdrop;\n private _whitelistedAddresses: Set<string>;\n private keepTrackers: AirdropAuTokenKeepTracker[] = [];\n public constructor(networkConnection: NetworkConnection) {\n super(networkConnection);\n this._airDrop = new Contract(\n networkAddresses.misc.AURI_AIRDROP,\n AuriAirdropABI.abi,\n networkConnection.provider\n ) as AuriAirdrop;\n\n this._whitelistedAddresses = new Set(\n (AIRDROP_WHITELIST_ADDRESSES as string[]).map((e) =>\n e.toLocaleLowerCase()\n )\n );\n\n let auTokens: any = AIRDROP_AUTOKEN_INFO;\n\n for (let auToken in auTokens) {\n let { address, exchangeRate, deploymentBlock, underlying } =\n auTokens[auToken];\n\n let airdropInfo: AirdropAuTokenInfo = {\n address: address,\n exchangeRate: BN.from(exchangeRate),\n deploymentBlock: parseInt(deploymentBlock),\n underlying: {\n minDeposit: BN.from(underlying.minDeposit),\n },\n };\n\n this.keepTrackers.push(\n new AirdropAuTokenKeepTracker(networkConnection, airdropInfo)\n );\n }\n }\n\n public countWhitelistedAddresses(): number {\n return this._whitelistedAddresses.size;\n }\n\n public isWhitelisted(user: string): boolean {\n return this._whitelistedAddresses.has(user.toLocaleLowerCase());\n }\n\n public async hasCompletedChallenge(user: string): Promise<boolean> {\n const settings = await AirdropSettings.getSettings(\n this._networkConnection.provider\n );\n\n if (getCurrentTimestamp() < settings.airdropStartTimestamp) {\n return false;\n }\n\n if (!this.isWhitelisted(user)) {\n return false;\n }\n\n // iterate for all the market and check if the user has completed the challenge\n return (\n await Promise.all(\n this.keepTrackers.map(async (keepTracker) => {\n return keepTracker.isEligible(user);\n })\n )\n ).includes(true);\n }\n\n /**\n * Get redeemable rewards amount of user\n */\n public async getRedeemableReward(\n campaign: string,\n token: Address,\n user: Address\n ): Promise<TokenAmount> {\n let tokenInstance: Token = new Token(token, getDecimal(token));\n\n let rewards: BN = await this._airDrop.getRedeemableReward(\n utils.formatBytes32String(campaign),\n token,\n user\n );\n\n return new TokenAmount(tokenInstance, rewards.toString());\n }\n}\n\nexport class AirdropReadWrite extends AirdropRead {\n /**\n * Transfer rewards from multiple campaigns to msg.sender\n */\n public async redeemMultiple(\n campaigns: string[],\n tokens: Address[]\n ): Promise<TransactionResponse> {\n assert(\n campaigns.length == tokens.length,\n 'campaigns and tokens must have the same length'\n );\n return this._airDrop.connect(this._networkConnection.signer!).redeem(\n campaigns.map((e) => utils.formatBytes32String(e)),\n tokens,\n await this._networkConnection.signer!.getAddress()\n );\n }\n\n /**\n * Redeem reward from a single campaign\n */\n public async redeemSingle(\n campaign: string,\n token: Address\n ): Promise<TransactionResponse> {\n return this.redeemMultiple([campaign], [token]);\n }\n}\n\nexport class Airdrop extends BlockchainEntity {\n constructor() {\n super();\n }\n public read(networkConnection: NetworkConnection): AirdropRead {\n return new AirdropRead(networkConnection);\n }\n public readWrite(networkConnection: NetworkConnection): AirdropReadWrite {\n return new AirdropReadWrite(networkConnection);\n }\n}\n","import BigNumber from 'bignumber.js';\nimport { ethers } from 'ethers';\nimport { Logger } from 'ethers/lib/utils';\n\nethers.utils.Logger.setLogLevel(Logger.levels.ERROR);\nBigNumber.config({ DECIMAL_PLACES: 50 });\n\nexport * from './SDK';\nexport * from './MoneyMarket';\nexport * from './BlockchainEntity';\nexport * from './helpers';\nexport * from './constants';\nexport * from './dummy';\nexport * from './priceFetcher';\nexport * from './token';\nexport * from './tokenAmount';\nexport * from './types';\nexport * from './airdrop-lottery';\nexport * from './transfer-event-query';\nexport * from './Papermill';\n"],"names":["undefined","BlockchainEntityRead","networkConnection","_networkConnection","BlockchainEntityReadWrite","signer","Signer","Error","BlockchainEntity","read","readWrite","dummyAddress","ETHAddress","AURORA_CHAINID","DECIMAL_PRECISION","networkAddresses","auTokens","name","address","toLowerCase","underlying","misc","COMPTROLLER","oracle","AURIFAIRLAUNCH","AURILENS","TOKENLOCK","ETHREPAYHELPER","AURI_AIRDROP","tokens","AURORA","PLY","stNEAR","USDC","WNEAR","TRI","META","toLocaleLowerCase","PULP","PLYWNEAR","PRICE_WHITELISTED","Set","map","t","REWARD_CLAIM_START","BORROW_LIMIT_BUFFER","BigNumber","ONE_DAY","ONE_WEEK","ONE_YEAR","PLYWNEAR_POOL_ID","PLYWNEAR_REWARD_TOKENS","ALL_STAKING_POOLS","INF","BN","from","pow","sub","AIRDROP_START_TIMESTAMP","AIRDROP_END_TIMESTAMP","AIRDROP_KEEP_THRESHOLD","DEPOSIT_NEAR_REWARDS_PER_WEEK","Object","fromEntries","entries","k","v","BORROW_NEAR_REWARDS_PER_WEEK","AURORA_API_BASE_URL","getQuery","module","action","params","axios","get","URLSearchParams","headers","resp","data","result","decimalRecords","formatObject","object","JSON","stringify","decimalFactor","decimal","toString","isSameAddress","address1","address2","getCurrentTimestamp","Math","trunc","Date","now","validateAndParseAddress","utils","getAddress","error","getDecimal","addressLowercase","assert","calcLMRewardApr","rewardsValue","totalStakeValue","frequencyPerYear","lte","multipliedBy","dividedBy","getBlockTimestamp","provider","blockNumber","getBlock","block","timestamp","getBlockBeforeTimestamp","getAuroraAPIQuery","closest","parseInt","getBlockNumber","ComptrollerRewardType","MarketAction","Token","decimals","PLYToken","PLYWNEARToken","TokenAmount","token","amount","isRaw","rawAmnt","times","toFixed","formattedAmount","div","rawAmount","fromAddressAndAmount","tokenAddress","fetchPriceFromCoingeckoAPI","id","then","res","price","usd","fetchPriceFromCoingecko","fetchLPPositions","LPAddress","LPContract","Contract","IUniswapV2PairABI","abi","promises","push","token0","token1","getReserves","totalSupply","Promise","all","values","reserve0","reserve1","fetchLPPrice","fetchLPPriceBy","tokenReverse","reserve","isZero","_fetchPrice","tokenPrice","tokenDecimal","reserveUSD","LPDecimal","LPInfo","processPriceFromOracle","rawPrice","underlyingDecimal","fetchPriceFromOracle","auTokenAddress","oracleContract","OracleABI","getUnderlyingPrice","fetchUnderlyingTokensPrices","auriLens","AuriLensABI","auTokenAddresses","auToken","underlyingDecimals","auTokenUnderlyingPriceAll","rawPrices","ind","underlyingPrice","fetchStNEARPrice","ratioPromise","nearPricePromise","ratioRes","nearPrice","ratio","st_near_price","shouldFetchFromCoingecko","has","matchingAuToken","find","fetchPrice","fetchPLYPrice","fetchToken0PriceByLP","LP","token0Decimal","token1Decimal","fetchValuation","tokenAmount","calcValuation","valuateToken","tokenValuation","currencyAmount","currency","MoneyMarketRead","underlyingAsset","AuETHABI","AuErc20ABI","_comptroller","ComptrollerABI","_auriLens","getRewardSpeeds","speeds","getTotalTokenBorrowed","totalBorrows","getTotalTokenDeposited","totalBorrow","getCash","totalCash","add","getDepositAPY","supplyRatePerTimestamp","getBorrowAPY","borrowRatePerTimestamp","getCollateralRatio","markets","collateralFactorMantissa","getBorrowPlyAPY","totalBorrowed","rewardSpeeds","rewardSpeed","plyPrice","getDepositPlyAPY","totalDeposited","getDetails","depositAPY","toNumber","borrowAPY","collateralRatio","borrowPlyApy","plyRewardBorrowSpeed","depositPlyApy","plyRewardSupplySpeed","getDepositNEARRewardPerWeek","depositNEARApy","getBorrowNEARRewardPerWeek","borrowNEARApy","depositMETAApy","totalTokenDeposited","totalTokenBorrowed","depositApy","borrowApy","depositPlyPerWeek","mul","borrowPlyPerWeek","getUserBorrowBalance","userAddress","callStatic","borrowBalanceCurrent","getUserDepositBalance","balanceOfUnderlying","totalDeposit","NEARToken","rewardStartTime","rewardStopTime","currentTime","reward","MoneyMarketReadWrite","_EthRepayHelper","EthRepayHelperABI","deposit","connect","mint","value","borrow","withdraw","lt","redeemUnderlying","repay","repayBorrow","enableCollateral","enterMarkets","disableCollateral","exitMarket","MoneyMarket","LOCKING_DENOMINATOR","PapermillRead","plyAddress","pulpAddress","plyToken","pulpToken","_auriFairLaunch","AuriFairLaunchABI","_ply","EIP20InterfaceABI","_pulp","PulpABI","getPlyBalance","balanceOf","plyBalance","getPulpBalance","pulpBalance","getUnclaimedPlyReward","claimRewards","rewardBalancesMetadata","plyAccrured","getWeek","getLockingDetails","currentWeek","getPercentLock","percentLockCurrentWeek","percentLockNextWeek","totalRewards","calcLockAmount","pulpAmountCurrentWeek","plyAmountCurrentWeek","plyAmountNextWeek","pulpAmountNextWeek","currentUnlockPortion","nextUnlockPortion","vestingStart","accruedPly","currentPly","currentPulp","nextPly","nextPulp","getTimestampToUnlock","targetUnlockPortion","getWeekToUnlock","weekId","getUnlockPortionAt","lockPortion","unlockPortion","PapermillReadWrite","redeem","recipient","selfRedeem","msgSender","Papermill","StakingRead","getPLYWNEARPoolDetails","getPoolInfo","stakedLiquidity","totalStake","rewardPerSeconds","stakedLiquidityAmount","totalStakeValuation","i","length","rewardTokenAddress","rewardToken","rewardPerSecond","APYs","forEach","rewardPerSecondValuation","apy","totalStakedLiquidity","stakeBalanceOf","user","getUserInfo","userInfo","stakeAmount","LpBalanceOf","lpContract","balance","unclaimedRewardsOf","updateAndGetUserInfo","rewards","unclaimedRewards","StakingReadWrite","stake","unstake","SdkRead","getUserDetails","marketCount","userMarketDetails","totalBorrowLimit","pricePromises","userMarketDetail","market","moneyMarket","depositBalance","borrowBalance","getAssetsIn","assetsIn","underlyingPrices","depositValues","auAddress","isCollateral","reduce","p","index","plus","getAccountLiquidity","accountLiquidity","borrowedvaluation","minus","bufferedBorrowLimit","minimumBorrowLimitAllowed","borrowableAmount","borrowLimitMargin","gt","maxWithdrawCap","maxWithdrawableAmount","borrowLimit","userLockingDetails","getTokenPrice","calcHypotheticalStats","currentBorrowLimit","currentBorrowValuation","newBorrowLimit","newBorrowValuation","EnableCollateral","DisableCollateral","deltaBorrowLimit","Deposit","Withdraw","Borrow","Repay","deltaBorrowValuation","newBorrowUtilization","eq","SdkReadWrite","claim","faucetDrip","faucet","FAUCET","FaucetABI","drip","SDK","dummyToken","dummyPly","dummyPlyAurora","dummyTokenAmount","dummyZeroTokenAmount","dummyTokenAmount2","dummyTokenAmount3","dummyMarketAddress","dummyUserMarketDetails","TransferEventQuery","tokenAddr","AuTokenABI","queryERC20TransfersOf","fromBlock","toBlock","filters","Transfer","filter","queryFilter","events","flat","results","event","args","to","sort","a","b","queryERC20BalanceAt","endBlock","blockTag","AirdropSettings","getSettings","_instance","settings","airdropStartTimestamp","airdropStartBlock","airdropEndTimestamp","airdropEndBlock","AirdropAuTokenKeepTracker","airdropAuTokenInfo","_transferQuery","_airdropAuTokenInfo","exchangeRate","_toUnderlyingValue","auTokenAmount","isEligible","minDeposit","BELOW","ABOVE","flag","lastEligibleBalanceTimestamp","gte","airdropThreshold","min","AirdropRead","_airDrop","AuriAirdropABI","_whitelistedAddresses","AIRDROP_WHITELIST_ADDRESSES","e","AIRDROP_AUTOKEN_INFO","deploymentBlock","airdropInfo","keepTrackers","countWhitelistedAddresses","size","isWhitelisted","hasCompletedChallenge","keepTracker","includes","getRedeemableReward","campaign","tokenInstance","formatBytes32String","AirdropReadWrite","redeemMultiple","campaigns","redeemSingle","Airdrop","ethers","Logger","setLogLevel","levels","ERROR","config","DECIMAL_PLACES"],"mappings":"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;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;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"}
|
|
1
|
+
{"version":3,"file":"sdk.cjs.development.js","sources":["../node_modules/regenerator-runtime/runtime.js","../src/BlockchainEntity.ts","../src/constants.ts","../src/aurora-api-helpers.ts","../src/decimals.ts","../src/helpers.ts","../src/types.ts","../src/token.ts","../src/tokenAmount.ts","../src/priceFetcher.ts","../src/MoneyMarket.ts","../src/Papermill.ts","../src/Staking.ts","../src/SDK.ts","../src/dummy.ts","../src/transfer-event-query.ts","../src/airdrop-lottery.ts","../src/index.ts"],"sourcesContent":["/**\n * Copyright (c) 2014-present, Facebook, Inc.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\nvar runtime = (function (exports) {\n \"use strict\";\n\n var Op = Object.prototype;\n var hasOwn = Op.hasOwnProperty;\n var undefined; // More compressible than void 0.\n var $Symbol = typeof Symbol === \"function\" ? Symbol : {};\n var iteratorSymbol = $Symbol.iterator || \"@@iterator\";\n var asyncIteratorSymbol = $Symbol.asyncIterator || \"@@asyncIterator\";\n var toStringTagSymbol = $Symbol.toStringTag || \"@@toStringTag\";\n\n function define(obj, key, value) {\n Object.defineProperty(obj, key, {\n value: value,\n enumerable: true,\n configurable: true,\n writable: true\n });\n return obj[key];\n }\n try {\n // IE 8 has a broken Object.defineProperty that only works on DOM objects.\n define({}, \"\");\n } catch (err) {\n define = function(obj, key, value) {\n return obj[key] = value;\n };\n }\n\n function wrap(innerFn, outerFn, self, tryLocsList) {\n // If outerFn provided and outerFn.prototype is a Generator, then outerFn.prototype instanceof Generator.\n var protoGenerator = outerFn && outerFn.prototype instanceof Generator ? outerFn : Generator;\n var generator = Object.create(protoGenerator.prototype);\n var context = new Context(tryLocsList || []);\n\n // The ._invoke method unifies the implementations of the .next,\n // .throw, and .return methods.\n generator._invoke = makeInvokeMethod(innerFn, self, context);\n\n return generator;\n }\n exports.wrap = wrap;\n\n // Try/catch helper to minimize deoptimizations. Returns a completion\n // record like context.tryEntries[i].completion. This interface could\n // have been (and was previously) designed to take a closure to be\n // invoked without arguments, but in all the cases we care about we\n // already have an existing method we want to call, so there's no need\n // to create a new function object. We can even get away with assuming\n // the method takes exactly one argument, since that happens to be true\n // in every case, so we don't have to touch the arguments object. The\n // only additional allocation required is the completion record, which\n // has a stable shape and so hopefully should be cheap to allocate.\n function tryCatch(fn, obj, arg) {\n try {\n return { type: \"normal\", arg: fn.call(obj, arg) };\n } catch (err) {\n return { type: \"throw\", arg: err };\n }\n }\n\n var GenStateSuspendedStart = \"suspendedStart\";\n var GenStateSuspendedYield = \"suspendedYield\";\n var GenStateExecuting = \"executing\";\n var GenStateCompleted = \"completed\";\n\n // Returning this object from the innerFn has the same effect as\n // breaking out of the dispatch switch statement.\n var ContinueSentinel = {};\n\n // Dummy constructor functions that we use as the .constructor and\n // .constructor.prototype properties for functions that return Generator\n // objects. For full spec compliance, you may wish to configure your\n // minifier not to mangle the names of these two functions.\n function Generator() {}\n function GeneratorFunction() {}\n function GeneratorFunctionPrototype() {}\n\n // This is a polyfill for %IteratorPrototype% for environments that\n // don't natively support it.\n var IteratorPrototype = {};\n define(IteratorPrototype, iteratorSymbol, function () {\n return this;\n });\n\n var getProto = Object.getPrototypeOf;\n var NativeIteratorPrototype = getProto && getProto(getProto(values([])));\n if (NativeIteratorPrototype &&\n NativeIteratorPrototype !== Op &&\n hasOwn.call(NativeIteratorPrototype, iteratorSymbol)) {\n // This environment has a native %IteratorPrototype%; use it instead\n // of the polyfill.\n IteratorPrototype = NativeIteratorPrototype;\n }\n\n var Gp = GeneratorFunctionPrototype.prototype =\n Generator.prototype = Object.create(IteratorPrototype);\n GeneratorFunction.prototype = GeneratorFunctionPrototype;\n define(Gp, \"constructor\", GeneratorFunctionPrototype);\n define(GeneratorFunctionPrototype, \"constructor\", GeneratorFunction);\n GeneratorFunction.displayName = define(\n GeneratorFunctionPrototype,\n toStringTagSymbol,\n \"GeneratorFunction\"\n );\n\n // Helper for defining the .next, .throw, and .return methods of the\n // Iterator interface in terms of a single ._invoke method.\n function defineIteratorMethods(prototype) {\n [\"next\", \"throw\", \"return\"].forEach(function(method) {\n define(prototype, method, function(arg) {\n return this._invoke(method, arg);\n });\n });\n }\n\n exports.isGeneratorFunction = function(genFun) {\n var ctor = typeof genFun === \"function\" && genFun.constructor;\n return ctor\n ? ctor === GeneratorFunction ||\n // For the native GeneratorFunction constructor, the best we can\n // do is to check its .name property.\n (ctor.displayName || ctor.name) === \"GeneratorFunction\"\n : false;\n };\n\n exports.mark = function(genFun) {\n if (Object.setPrototypeOf) {\n Object.setPrototypeOf(genFun, GeneratorFunctionPrototype);\n } else {\n genFun.__proto__ = GeneratorFunctionPrototype;\n define(genFun, toStringTagSymbol, \"GeneratorFunction\");\n }\n genFun.prototype = Object.create(Gp);\n return genFun;\n };\n\n // Within the body of any async function, `await x` is transformed to\n // `yield regeneratorRuntime.awrap(x)`, so that the runtime can test\n // `hasOwn.call(value, \"__await\")` to determine if the yielded value is\n // meant to be awaited.\n exports.awrap = function(arg) {\n return { __await: arg };\n };\n\n function AsyncIterator(generator, PromiseImpl) {\n function invoke(method, arg, resolve, reject) {\n var record = tryCatch(generator[method], generator, arg);\n if (record.type === \"throw\") {\n reject(record.arg);\n } else {\n var result = record.arg;\n var value = result.value;\n if (value &&\n typeof value === \"object\" &&\n hasOwn.call(value, \"__await\")) {\n return PromiseImpl.resolve(value.__await).then(function(value) {\n invoke(\"next\", value, resolve, reject);\n }, function(err) {\n invoke(\"throw\", err, resolve, reject);\n });\n }\n\n return PromiseImpl.resolve(value).then(function(unwrapped) {\n // When a yielded Promise is resolved, its final value becomes\n // the .value of the Promise<{value,done}> result for the\n // current iteration.\n result.value = unwrapped;\n resolve(result);\n }, function(error) {\n // If a rejected Promise was yielded, throw the rejection back\n // into the async generator function so it can be handled there.\n return invoke(\"throw\", error, resolve, reject);\n });\n }\n }\n\n var previousPromise;\n\n function enqueue(method, arg) {\n function callInvokeWithMethodAndArg() {\n return new PromiseImpl(function(resolve, reject) {\n invoke(method, arg, resolve, reject);\n });\n }\n\n return previousPromise =\n // If enqueue has been called before, then we want to wait until\n // all previous Promises have been resolved before calling invoke,\n // so that results are always delivered in the correct order. If\n // enqueue has not been called before, then it is important to\n // call invoke immediately, without waiting on a callback to fire,\n // so that the async generator function has the opportunity to do\n // any necessary setup in a predictable way. This predictability\n // is why the Promise constructor synchronously invokes its\n // executor callback, and why async functions synchronously\n // execute code before the first await. Since we implement simple\n // async functions in terms of async generators, it is especially\n // important to get this right, even though it requires care.\n previousPromise ? previousPromise.then(\n callInvokeWithMethodAndArg,\n // Avoid propagating failures to Promises returned by later\n // invocations of the iterator.\n callInvokeWithMethodAndArg\n ) : callInvokeWithMethodAndArg();\n }\n\n // Define the unified helper method that is used to implement .next,\n // .throw, and .return (see defineIteratorMethods).\n this._invoke = enqueue;\n }\n\n defineIteratorMethods(AsyncIterator.prototype);\n define(AsyncIterator.prototype, asyncIteratorSymbol, function () {\n return this;\n });\n exports.AsyncIterator = AsyncIterator;\n\n // Note that simple async functions are implemented on top of\n // AsyncIterator objects; they just return a Promise for the value of\n // the final result produced by the iterator.\n exports.async = function(innerFn, outerFn, self, tryLocsList, PromiseImpl) {\n if (PromiseImpl === void 0) PromiseImpl = Promise;\n\n var iter = new AsyncIterator(\n wrap(innerFn, outerFn, self, tryLocsList),\n PromiseImpl\n );\n\n return exports.isGeneratorFunction(outerFn)\n ? iter // If outerFn is a generator, return the full iterator.\n : iter.next().then(function(result) {\n return result.done ? result.value : iter.next();\n });\n };\n\n function makeInvokeMethod(innerFn, self, context) {\n var state = GenStateSuspendedStart;\n\n return function invoke(method, arg) {\n if (state === GenStateExecuting) {\n throw new Error(\"Generator is already running\");\n }\n\n if (state === GenStateCompleted) {\n if (method === \"throw\") {\n throw arg;\n }\n\n // Be forgiving, per 25.3.3.3.3 of the spec:\n // https://people.mozilla.org/~jorendorff/es6-draft.html#sec-generatorresume\n return doneResult();\n }\n\n context.method = method;\n context.arg = arg;\n\n while (true) {\n var delegate = context.delegate;\n if (delegate) {\n var delegateResult = maybeInvokeDelegate(delegate, context);\n if (delegateResult) {\n if (delegateResult === ContinueSentinel) continue;\n return delegateResult;\n }\n }\n\n if (context.method === \"next\") {\n // Setting context._sent for legacy support of Babel's\n // function.sent implementation.\n context.sent = context._sent = context.arg;\n\n } else if (context.method === \"throw\") {\n if (state === GenStateSuspendedStart) {\n state = GenStateCompleted;\n throw context.arg;\n }\n\n context.dispatchException(context.arg);\n\n } else if (context.method === \"return\") {\n context.abrupt(\"return\", context.arg);\n }\n\n state = GenStateExecuting;\n\n var record = tryCatch(innerFn, self, context);\n if (record.type === \"normal\") {\n // If an exception is thrown from innerFn, we leave state ===\n // GenStateExecuting and loop back for another invocation.\n state = context.done\n ? GenStateCompleted\n : GenStateSuspendedYield;\n\n if (record.arg === ContinueSentinel) {\n continue;\n }\n\n return {\n value: record.arg,\n done: context.done\n };\n\n } else if (record.type === \"throw\") {\n state = GenStateCompleted;\n // Dispatch the exception by looping back around to the\n // context.dispatchException(context.arg) call above.\n context.method = \"throw\";\n context.arg = record.arg;\n }\n }\n };\n }\n\n // Call delegate.iterator[context.method](context.arg) and handle the\n // result, either by returning a { value, done } result from the\n // delegate iterator, or by modifying context.method and context.arg,\n // setting context.delegate to null, and returning the ContinueSentinel.\n function maybeInvokeDelegate(delegate, context) {\n var method = delegate.iterator[context.method];\n if (method === undefined) {\n // A .throw or .return when the delegate iterator has no .throw\n // method always terminates the yield* loop.\n context.delegate = null;\n\n if (context.method === \"throw\") {\n // Note: [\"return\"] must be used for ES3 parsing compatibility.\n if (delegate.iterator[\"return\"]) {\n // If the delegate iterator has a return method, give it a\n // chance to clean up.\n context.method = \"return\";\n context.arg = undefined;\n maybeInvokeDelegate(delegate, context);\n\n if (context.method === \"throw\") {\n // If maybeInvokeDelegate(context) changed context.method from\n // \"return\" to \"throw\", let that override the TypeError below.\n return ContinueSentinel;\n }\n }\n\n context.method = \"throw\";\n context.arg = new TypeError(\n \"The iterator does not provide a 'throw' method\");\n }\n\n return ContinueSentinel;\n }\n\n var record = tryCatch(method, delegate.iterator, context.arg);\n\n if (record.type === \"throw\") {\n context.method = \"throw\";\n context.arg = record.arg;\n context.delegate = null;\n return ContinueSentinel;\n }\n\n var info = record.arg;\n\n if (! info) {\n context.method = \"throw\";\n context.arg = new TypeError(\"iterator result is not an object\");\n context.delegate = null;\n return ContinueSentinel;\n }\n\n if (info.done) {\n // Assign the result of the finished delegate to the temporary\n // variable specified by delegate.resultName (see delegateYield).\n context[delegate.resultName] = info.value;\n\n // Resume execution at the desired location (see delegateYield).\n context.next = delegate.nextLoc;\n\n // If context.method was \"throw\" but the delegate handled the\n // exception, let the outer generator proceed normally. If\n // context.method was \"next\", forget context.arg since it has been\n // \"consumed\" by the delegate iterator. If context.method was\n // \"return\", allow the original .return call to continue in the\n // outer generator.\n if (context.method !== \"return\") {\n context.method = \"next\";\n context.arg = undefined;\n }\n\n } else {\n // Re-yield the result returned by the delegate method.\n return info;\n }\n\n // The delegate iterator is finished, so forget it and continue with\n // the outer generator.\n context.delegate = null;\n return ContinueSentinel;\n }\n\n // Define Generator.prototype.{next,throw,return} in terms of the\n // unified ._invoke helper method.\n defineIteratorMethods(Gp);\n\n define(Gp, toStringTagSymbol, \"Generator\");\n\n // A Generator should always return itself as the iterator object when the\n // @@iterator function is called on it. Some browsers' implementations of the\n // iterator prototype chain incorrectly implement this, causing the Generator\n // object to not be returned from this call. This ensures that doesn't happen.\n // See https://github.com/facebook/regenerator/issues/274 for more details.\n define(Gp, iteratorSymbol, function() {\n return this;\n });\n\n define(Gp, \"toString\", function() {\n return \"[object Generator]\";\n });\n\n function pushTryEntry(locs) {\n var entry = { tryLoc: locs[0] };\n\n if (1 in locs) {\n entry.catchLoc = locs[1];\n }\n\n if (2 in locs) {\n entry.finallyLoc = locs[2];\n entry.afterLoc = locs[3];\n }\n\n this.tryEntries.push(entry);\n }\n\n function resetTryEntry(entry) {\n var record = entry.completion || {};\n record.type = \"normal\";\n delete record.arg;\n entry.completion = record;\n }\n\n function Context(tryLocsList) {\n // The root entry object (effectively a try statement without a catch\n // or a finally block) gives us a place to store values thrown from\n // locations where there is no enclosing try statement.\n this.tryEntries = [{ tryLoc: \"root\" }];\n tryLocsList.forEach(pushTryEntry, this);\n this.reset(true);\n }\n\n exports.keys = function(object) {\n var keys = [];\n for (var key in object) {\n keys.push(key);\n }\n keys.reverse();\n\n // Rather than returning an object with a next method, we keep\n // things simple and return the next function itself.\n return function next() {\n while (keys.length) {\n var key = keys.pop();\n if (key in object) {\n next.value = key;\n next.done = false;\n return next;\n }\n }\n\n // To avoid creating an additional object, we just hang the .value\n // and .done properties off the next function object itself. This\n // also ensures that the minifier will not anonymize the function.\n next.done = true;\n return next;\n };\n };\n\n function values(iterable) {\n if (iterable) {\n var iteratorMethod = iterable[iteratorSymbol];\n if (iteratorMethod) {\n return iteratorMethod.call(iterable);\n }\n\n if (typeof iterable.next === \"function\") {\n return iterable;\n }\n\n if (!isNaN(iterable.length)) {\n var i = -1, next = function next() {\n while (++i < iterable.length) {\n if (hasOwn.call(iterable, i)) {\n next.value = iterable[i];\n next.done = false;\n return next;\n }\n }\n\n next.value = undefined;\n next.done = true;\n\n return next;\n };\n\n return next.next = next;\n }\n }\n\n // Return an iterator with no values.\n return { next: doneResult };\n }\n exports.values = values;\n\n function doneResult() {\n return { value: undefined, done: true };\n }\n\n Context.prototype = {\n constructor: Context,\n\n reset: function(skipTempReset) {\n this.prev = 0;\n this.next = 0;\n // Resetting context._sent for legacy support of Babel's\n // function.sent implementation.\n this.sent = this._sent = undefined;\n this.done = false;\n this.delegate = null;\n\n this.method = \"next\";\n this.arg = undefined;\n\n this.tryEntries.forEach(resetTryEntry);\n\n if (!skipTempReset) {\n for (var name in this) {\n // Not sure about the optimal order of these conditions:\n if (name.charAt(0) === \"t\" &&\n hasOwn.call(this, name) &&\n !isNaN(+name.slice(1))) {\n this[name] = undefined;\n }\n }\n }\n },\n\n stop: function() {\n this.done = true;\n\n var rootEntry = this.tryEntries[0];\n var rootRecord = rootEntry.completion;\n if (rootRecord.type === \"throw\") {\n throw rootRecord.arg;\n }\n\n return this.rval;\n },\n\n dispatchException: function(exception) {\n if (this.done) {\n throw exception;\n }\n\n var context = this;\n function handle(loc, caught) {\n record.type = \"throw\";\n record.arg = exception;\n context.next = loc;\n\n if (caught) {\n // If the dispatched exception was caught by a catch block,\n // then let that catch block handle the exception normally.\n context.method = \"next\";\n context.arg = undefined;\n }\n\n return !! caught;\n }\n\n for (var i = this.tryEntries.length - 1; i >= 0; --i) {\n var entry = this.tryEntries[i];\n var record = entry.completion;\n\n if (entry.tryLoc === \"root\") {\n // Exception thrown outside of any try block that could handle\n // it, so set the completion value of the entire function to\n // throw the exception.\n return handle(\"end\");\n }\n\n if (entry.tryLoc <= this.prev) {\n var hasCatch = hasOwn.call(entry, \"catchLoc\");\n var hasFinally = hasOwn.call(entry, \"finallyLoc\");\n\n if (hasCatch && hasFinally) {\n if (this.prev < entry.catchLoc) {\n return handle(entry.catchLoc, true);\n } else if (this.prev < entry.finallyLoc) {\n return handle(entry.finallyLoc);\n }\n\n } else if (hasCatch) {\n if (this.prev < entry.catchLoc) {\n return handle(entry.catchLoc, true);\n }\n\n } else if (hasFinally) {\n if (this.prev < entry.finallyLoc) {\n return handle(entry.finallyLoc);\n }\n\n } else {\n throw new Error(\"try statement without catch or finally\");\n }\n }\n }\n },\n\n abrupt: function(type, arg) {\n for (var i = this.tryEntries.length - 1; i >= 0; --i) {\n var entry = this.tryEntries[i];\n if (entry.tryLoc <= this.prev &&\n hasOwn.call(entry, \"finallyLoc\") &&\n this.prev < entry.finallyLoc) {\n var finallyEntry = entry;\n break;\n }\n }\n\n if (finallyEntry &&\n (type === \"break\" ||\n type === \"continue\") &&\n finallyEntry.tryLoc <= arg &&\n arg <= finallyEntry.finallyLoc) {\n // Ignore the finally entry if control is not jumping to a\n // location outside the try/catch block.\n finallyEntry = null;\n }\n\n var record = finallyEntry ? finallyEntry.completion : {};\n record.type = type;\n record.arg = arg;\n\n if (finallyEntry) {\n this.method = \"next\";\n this.next = finallyEntry.finallyLoc;\n return ContinueSentinel;\n }\n\n return this.complete(record);\n },\n\n complete: function(record, afterLoc) {\n if (record.type === \"throw\") {\n throw record.arg;\n }\n\n if (record.type === \"break\" ||\n record.type === \"continue\") {\n this.next = record.arg;\n } else if (record.type === \"return\") {\n this.rval = this.arg = record.arg;\n this.method = \"return\";\n this.next = \"end\";\n } else if (record.type === \"normal\" && afterLoc) {\n this.next = afterLoc;\n }\n\n return ContinueSentinel;\n },\n\n finish: function(finallyLoc) {\n for (var i = this.tryEntries.length - 1; i >= 0; --i) {\n var entry = this.tryEntries[i];\n if (entry.finallyLoc === finallyLoc) {\n this.complete(entry.completion, entry.afterLoc);\n resetTryEntry(entry);\n return ContinueSentinel;\n }\n }\n },\n\n \"catch\": function(tryLoc) {\n for (var i = this.tryEntries.length - 1; i >= 0; --i) {\n var entry = this.tryEntries[i];\n if (entry.tryLoc === tryLoc) {\n var record = entry.completion;\n if (record.type === \"throw\") {\n var thrown = record.arg;\n resetTryEntry(entry);\n }\n return thrown;\n }\n }\n\n // The context.catch method must only be called with a location\n // argument that corresponds to a known catch block.\n throw new Error(\"illegal catch attempt\");\n },\n\n delegateYield: function(iterable, resultName, nextLoc) {\n this.delegate = {\n iterator: values(iterable),\n resultName: resultName,\n nextLoc: nextLoc\n };\n\n if (this.method === \"next\") {\n // Deliberately forget the last sent value so that we don't\n // accidentally pass it on to the delegate.\n this.arg = undefined;\n }\n\n return ContinueSentinel;\n }\n };\n\n // Regardless of whether this script is executing as a CommonJS module\n // or not, return the runtime object so that we can declare the variable\n // regeneratorRuntime in the outer scope, which allows this module to be\n // injected easily by `bin/regenerator --include-runtime script.js`.\n return exports;\n\n}(\n // If this script is executing as a CommonJS module, use module.exports\n // as the regeneratorRuntime namespace. Otherwise create a new empty\n // object. Either way, the resulting object will be used to initialize\n // the regeneratorRuntime variable at the top of this file.\n typeof module === \"object\" ? module.exports : {}\n));\n\ntry {\n regeneratorRuntime = runtime;\n} catch (accidentalStrictMode) {\n // This module should not be running in strict mode, so the above\n // assignment should always work unless something is misconfigured. Just\n // in case runtime.js accidentally runs in strict mode, in modern engines\n // we can explicitly access globalThis. In older engines we can escape\n // strict mode using a global Function call. This could conceivably fail\n // if a Content Security Policy forbids using Function, but in that case\n // the proper solution is to fix the accidental strict mode problem. If\n // you've misconfigured your bundler to force strict mode and applied a\n // CSP to forbid Function, and you're not willing to fix either of those\n // problems, please detail your unique predicament in a GitHub issue.\n if (typeof globalThis === \"object\") {\n globalThis.regeneratorRuntime = runtime;\n } else {\n Function(\"r\", \"regeneratorRuntime = r\")(runtime);\n }\n}\n","import { Signer } from '@ethersproject/abstract-signer';\nimport { NetworkConnection } from './types';\n\nexport class BlockchainEntityRead {\n protected _networkConnection: NetworkConnection;\n public constructor(networkConnection: NetworkConnection) {\n this._networkConnection = networkConnection;\n }\n}\n\nexport class BlockchainEntityReadWrite extends BlockchainEntityRead {\n public constructor(networkConnection: NetworkConnection) {\n if (!(networkConnection.signer instanceof Signer)) {\n throw Error(\n 'Signer is not provided when constructing BlockchainEntityReadWrite'\n );\n }\n super(networkConnection);\n }\n}\n\nexport class BlockchainEntity {\n constructor() {}\n public read(networkConnection: NetworkConnection): BlockchainEntityRead {\n return new BlockchainEntityRead(networkConnection);\n }\n\n public readWrite(\n networkConnection: NetworkConnection\n ): BlockchainEntityReadWrite {\n return new BlockchainEntityReadWrite(networkConnection);\n }\n}\n","import BigNumber from 'bignumber.js';\nimport { ethers, Signer, BigNumber as BN } from 'ethers';\nexport const dummyAddress: string =\n '0xDEADbeEfEEeEEEeEEEeEEeeeeeEeEEeeeeEEEEeE';\nexport const ETHAddress: string = '0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE';\n\nexport const AURORA_CHAINID = 1313161554;\n\nexport const DECIMAL_PRECISION = 10;\n\nexport type NetworkAddresses = {\n auTokens: {\n name: string;\n address: string;\n underlying: string;\n }[];\n misc: Record<string, string>;\n tokens: Record<string, string>;\n};\nexport const networkAddresses: NetworkAddresses = {\n auTokens: [\n {\n name: 'auUSDC',\n address: '0x4f0d864b1ABf4B701799a0b30b57A22dFEB5917b'.toLowerCase(),\n underlying: '0xb12bfca5a55806aaf64e99521918a4bf0fc40802'.toLowerCase(),\n },\n {\n name: 'auETH',\n address: '0xca9511B610bA5fc7E311FDeF9cE16050eE4449E9'.toLowerCase(),\n underlying: ETHAddress.toLowerCase(),\n },\n {\n name: 'auWBTC',\n address: '0xCFb6b0498cb7555e7e21502E0F449bf28760Adbb'.toLowerCase(),\n underlying: '0xf4eb217ba2454613b15dbdea6e5f22276410e89e'.toLowerCase(),\n },\n {\n name: 'auUSDT',\n address: '0xaD5A2437Ff55ed7A8Cad3b797b3eC7c5a19B1c54'.toLowerCase(),\n underlying: '0x4988a896b1227218e4a686fde5eabdcabd91571f'.toLowerCase(),\n },\n {\n name: 'auDAI',\n address: '0xCE4166363E3a584DAc84A47bCD3414B43EfCDd1c'.toLowerCase(),\n underlying: '0xe3520349f477a5f6eb06107066048508498a291b'.toLowerCase(),\n },\n {\n name: 'auWNEAR',\n address: '0xaE4fac24dCdAE0132C6d04f564dCf059616E9423'.toLowerCase(),\n underlying: '0xC42C30aC6Cc15faC9bD938618BcaA1a1FaE8501d'.toLowerCase(),\n },\n {\n name: 'auSTNEAR',\n address: '0x3195949f267702723bc614cAE037cdc8D1E94786'.toLowerCase(),\n underlying: '0x07F9F7f963C5cD2BBFFd30CcfB964Be114332E30'.toLowerCase(),\n },\n {\n name: 'auAURORA',\n address: '0x8888682E24dd4Df7B7Ff2B91fccB575737E433bf'.toLowerCase(),\n underlying: '0x8bec47865ade3b172a928df8f990bc7f2a3b9f79'.toLowerCase(),\n },\n {\n name: 'auTRI',\n address: '0x6Ea6C03061bDdCE23d4Ec60B6E6e880c33d24dca'.toLowerCase(),\n underlying: '0xFa94348467f64D5A457F75F8bc40495D33c65aBB'.toLowerCase(),\n },\n ],\n misc: {\n COMPTROLLER: '0x817af6cfAF35BdC1A634d6cC94eE9e4c68369Aeb'.toLowerCase(),\n oracle: '0xC6e5185438e1730959c1eF3551059A3feC744E90'.toLowerCase(),\n AURIFAIRLAUNCH: '0x6f068608573c840bB27b39458d7d87eB865e19Cc'.toLowerCase(),\n AURILENS: '0xFfdFfBDB966Cb84B50e62d70105f2Dbf2e0A1e70'.toLowerCase(),\n TOKENLOCK: '0xDACC02a4Ff16Ea3c1515AdbfdCeb7B1F448B79c8'.toLowerCase(),\n ETHREPAYHELPER: '0xa308A5003fA1A25BFdD9418FcEE51d48Dbe441e6'.toLowerCase(),\n AURI_AIRDROP: '0x6C42aA5b128B62D6CCf357726D7d13F3888335EC'.toLowerCase(),\n },\n tokens: {\n AURORA: '0x8bec47865ade3b172a928df8f990bc7f2a3b9f79'.toLowerCase(),\n PLY: '0x09c9d464b58d96837f8d8b6f4d9fe4ad408d3a4f'.toLowerCase(),\n stNEAR: '0x07f9f7f963c5cd2bbffd30ccfb964be114332e30'.toLowerCase(),\n USDC: '0xb12bfca5a55806aaf64e99521918a4bf0fc40802'.toLowerCase(),\n WNEAR: '0xC42C30aC6Cc15faC9bD938618BcaA1a1FaE8501d'.toLowerCase(),\n TRI: '0xFa94348467f64D5A457F75F8bc40495D33c65aBB'.toLowerCase(),\n META: '0xc21ff01229e982d7c8b8691163b0a3cb8f357453'.toLocaleLowerCase(),\n PULP: '0x04Ac48711BCdc45b4d223fb021E09DA73c71095e'.toLowerCase(),\n PLYWNEAR: '0x044b6B0CD3Bb13D2b9057781Df4459C66781dCe7'.toLowerCase(), //TODO: changes this\n },\n};\n\n// All token that we can calculate the price via oracle + coingecko\nexport const PRICE_WHITELISTED = new Set([\n ...networkAddresses.auTokens.map((t) => t.underlying),\n networkAddresses.tokens.AURORA,\n networkAddresses.tokens.TRI,\n networkAddresses.tokens.META,\n networkAddresses.tokens.stNEAR,\n]);\n\nexport const REWARD_CLAIM_START = 1651748400; // 5 May 2022 11:00:00 UTC\n\nexport const BORROW_LIMIT_BUFFER = new BigNumber(1);\n\nexport const ONE_DAY = 86400;\nexport const ONE_WEEK = ONE_DAY * 7;\nexport const ONE_YEAR = ONE_DAY * 365;\n\nexport const PLYWNEAR_POOL_ID = 0;\nexport const PLYWNEAR_REWARD_TOKENS = [\n '0x09C9D464b58d96837f8d8b6f4d9fE4aD408d3A4f', // PLY\n '0xC42C30aC6Cc15faC9bD938618BcaA1a1FaE8501d', // WNEAR\n '0x8BEc47865aDe3B172A928df8f990Bc7f2A3b9f79', // AURORA\n '0xFa94348467f64D5A457F75F8bc40495D33c65aBB', // TRI\n];\n// could call RPC to get all the staking pools but it's not necessary for now\n// export const ALL_STAKING_POOLS = [PLYWNEAR_POOL_ID];\n// TODO: fix this\nexport const ALL_STAKING_POOLS: number[] = [];\nexport const INF = BN.from(2).pow(256).sub(1);\n\nexport const AIRDROP_START_TIMESTAMP = 1649858400;\nexport const AIRDROP_END_TIMESTAMP = 1651068000;\nexport const AIRDROP_KEEP_THRESHOLD = 7 * 86400;\n\nexport const DEPOSIT_NEAR_REWARDS_PER_WEEK: { [k: string]: string } =\n Object.fromEntries(\n // lower case all addresses\n Object.entries({\n '0xb12bfca5a55806aaf64e99521918a4bf0fc40802': '36375', // USDC\n '0x4988a896b1227218e4a686fde5eabdcabd91571f': '14550', // USDT\n '0xf4eb217ba2454613b15dbdea6e5f22276410e89e': '3638', // WBTC\n '0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE': '14550', // ETH\n '0xc42c30ac6cc15fac9bd938618bcaa1a1fae8501d': '3638', // WNEAR\n }).map(([k, v]) => [k.toLowerCase(), v])\n );\n\nexport const BORROW_NEAR_REWARDS_PER_WEEK: { [k: string]: string } = {\n // currently 0 for all markets\n};\n","import axios from 'axios';\n\nconst AURORA_API_BASE_URL = 'https://api.aurorascan.dev/api';\n\nexport async function getQuery(\n module: string,\n action: string,\n params: Record<string, any> = {}\n): Promise<any> {\n params = { ...params, module: module, action: action };\n\n let resp = await axios.get(\n AURORA_API_BASE_URL + '?' + new URLSearchParams(params),\n {\n headers: { 'Content-Type': 'application/json' },\n }\n );\n\n return resp.data.result!;\n}\n","export const decimalRecords: Record<string, number> = {\n '0xeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee': 18,\n '0x09c9d464b58d96837f8d8b6f4d9fe4ad408d3a4f': 18,\n '0x3195949f267702723bc614cae037cdc8d1e94786': 8,\n '0xfa94348467f64d5a457f75f8bc40495d33c65abb': 18,\n '0x07f9f7f963c5cd2bbffd30ccfb964be114332e30': 24,\n '0xc42c30ac6cc15fac9bd938618bcaa1a1fae8501d': 24,\n '0x6ea6c03061bddce23d4ec60b6e6e880c33d24dca': 8,\n '0xca9511b610ba5fc7e311fdef9ce16050ee4449e9': 8,\n '0x8bec47865ade3b172a928df8f990bc7f2a3b9f79': 18,\n '0xcfb6b0498cb7555e7e21502e0f449bf28760adbb': 8,\n '0x4f0d864b1abf4b701799a0b30b57a22dfeb5917b': 8,\n '0xad5a2437ff55ed7a8cad3b797b3ec7c5a19b1c54': 8,\n '0x4988a896b1227218e4a686fde5eabdcabd91571f': 6,\n '0xb12bfca5a55806aaf64e99521918a4bf0fc40802': 6,\n '0xe3520349f477a5f6eb06107066048508498a291b': 18,\n '0x8888682e24dd4df7b7ff2b91fccb575737e433bf': 8,\n '0xae4fac24dcdae0132c6d04f564dcf059616e9423': 8,\n '0xce4166363e3a584dac84a47bcd3414b43efcdd1c': 8,\n '0xf4eb217ba2454613b15dbdea6e5f22276410e89e': 8,\n '0xc21ff01229e982d7c8b8691163b0a3cb8f357453': 24,\n '0x04ac48711bcdc45b4d223fb021e09da73c71095e': 18, // PULP\n '0x044b6b0cd3bb13d2b9057781df4459c66781dce7': 18, // PLYWNEAR\n};\n","import { Provider } from '@ethersproject/abstract-provider';\nimport assert from 'assert';\nimport BigNumber from 'bignumber.js';\nimport { BigNumber as BN, utils } from 'ethers';\nimport { getQuery as getAuroraAPIQuery } from './aurora-api-helpers';\nimport { decimalRecords } from './decimals';\nimport { Address } from './types';\n\nexport function formatObject(object: Object) {\n return JSON.stringify(object, null, ' ');\n}\n\nexport function decimalFactor(decimal: number) {\n return BN.from(10).pow(decimal).toString();\n}\n\nexport const isSameAddress = (\n address1: Address,\n address2: Address\n): boolean => {\n return address1.toLowerCase() == address2.toLowerCase();\n};\n\nexport const getCurrentTimestamp = (): number => {\n return Math.trunc(Date.now() / 1000);\n};\n\nexport function validateAndParseAddress(address: Address): Address {\n try {\n return utils.getAddress(address);\n } catch (error) {\n throw new Error('Invalid address: ' + address);\n }\n}\n\nexport function getDecimal(address: Address): number {\n let addressLowercase = address.toLowerCase();\n assert(\n decimalRecords[addressLowercase] != undefined,\n 'Decimal not found for ' + address\n );\n return decimalRecords[addressLowercase];\n}\n\nexport function calcLMRewardApr(\n rewardsValue: BigNumber,\n totalStakeValue: BigNumber,\n frequencyPerYear: number\n): BigNumber {\n if (totalStakeValue.lte(0)) {\n // avoid division by zero when there is no stake\n return new BigNumber('999999999');\n }\n return rewardsValue.multipliedBy(frequencyPerYear).dividedBy(totalStakeValue);\n}\n\nexport async function getBlockTimestamp(\n provider: Provider,\n blockNumber: number\n): Promise<number> {\n const block = await provider.getBlock(blockNumber);\n return block.timestamp;\n}\n\n/**\n * Get the block number of the last block that has a timestamp before the given timestamp\n * @param timestamp input timestamp\n * @returns return the last block that its timestamp <= the give timestamp\n * @note Check this API for more information: https://aurorascan.dev/apis#blocks\n *\n * This function is much faster than using binary search.\n */\nexport async function getBlockBeforeTimestamp(\n provider: Provider,\n timestamp: number\n) {\n let result = await getAuroraAPIQuery('block', 'getblocknobytime', {\n timestamp: timestamp,\n closest: 'before',\n });\n\n // In case the API return `Block timestamp too far in the future`\n // use the last block number\n return parseInt(result) || (await provider.getBlockNumber());\n}\n","import type { BigNumber, providers, Signer } from 'ethers';\nimport { TokenAmount } from './tokenAmount';\n\nexport enum ComptrollerRewardType {\n PLY = 0,\n AURORA,\n}\nexport type NetworkConnection = {\n provider: providers.Provider;\n signer?: Signer;\n};\n\nexport type Address = string;\n\nexport type CurrencyAmount = {\n currency: string;\n amount: string;\n};\n\nexport type TokenValuation = {\n tokenAmount: TokenAmount;\n currencyAmount: CurrencyAmount;\n};\n\nexport type MoneyMarketDetails = {\n auTokenAddress: string;\n totalTokenDeposited: TokenAmount;\n totalTokenBorrowed: TokenAmount;\n depositApy: number;\n depositPlyApy: number;\n borrowApy: number;\n borrowPlyApy: number;\n collateralRatio: number;\n depositPlyPerWeek: TokenAmount;\n borrowPlyPerWeek: TokenAmount;\n depositMETAApy: number;\n depositNEARApy: number;\n borrowNEARApy: number;\n};\n\nexport type UserDetails = {\n markets: UserMarketDetails[];\n borrowLimit: CurrencyAmount;\n userLockingDetails: UserLockingDetails;\n borrowableAmount: CurrencyAmount;\n};\n\nexport type UserLockingDetails = {\n vestingStart: number;\n /** % of reward they will receive in PLY, if they claim this week */\n currentUnlockPortion: number;\n //** Amount of PLY rewards that a user has. Equal to currentPly + currentPulp */\n accruedPly: TokenAmount;\n /** Amount of PLY they will receive, if they claim this week */\n currentPly: TokenAmount;\n /** Amount of PULP they will receive, if they claim this week */\n currentPulp: TokenAmount;\n /** % of reward they will receive in PLY, if they claim next week */\n nextUnlockPortion: number;\n /**\n * Amount of PLY they will receive, if they claim next week.\n * This doesn't include the additional reward that they will earn\n * in the next week.\n */\n nextPly: TokenAmount;\n /**\n * Amount of PULP they will receive, if they claim next week.\n * This doesn't include the additional reward that they will earn\n * in the next week.\n */\n nextPulp: TokenAmount;\n};\n\nexport type UserMarketDetails = {\n market: string;\n depositBalance: TokenAmount;\n borrowBalance: TokenAmount;\n isCollateral: boolean;\n maxWithdrawableAmount: TokenAmount;\n collateralRatio: number;\n underlyingPrice: string;\n};\n\nexport type TokenAPY = {\n address: string;\n apy: string;\n};\n\nexport type PLYWNEARPoolDetails = {\n totalStakedLiquidity: TokenValuation;\n APYs: TokenAPY[];\n};\n\nexport enum MarketAction {\n Deposit = 0,\n Borrow,\n Withdraw,\n Repay,\n EnableCollateral,\n DisableCollateral,\n}\n\nexport type HypotheticalStats = {\n newBorrowLimit: CurrencyAmount;\n newBorrowUtilization: number;\n};\n","import { getDecimal } from './helpers';\nimport { networkAddresses } from './constants';\n\nexport class Token {\n public readonly address: string;\n public readonly decimals: number;\n public constructor(address: string, decimals: number) {\n this.address = address.toLowerCase();\n this.decimals = decimals;\n }\n}\n\nexport const PLYToken = new Token(\n networkAddresses.tokens.PLY,\n getDecimal(networkAddresses.tokens.PLY)\n);\n\nexport const PLYWNEARToken = new Token(\n networkAddresses.tokens.PLYWNEAR,\n getDecimal(networkAddresses.tokens.PLYWNEAR)\n);\n","import { Token } from './token';\nimport BigNumber from 'bignumber.js';\nimport { decimalFactor, getDecimal } from './helpers';\nimport { Address } from './types';\n\nexport class TokenAmount {\n public readonly token: Token;\n private rawAmnt: string;\n\n public constructor(token: Token, amount: string, isRaw: boolean = true) {\n if (isRaw) {\n this.rawAmnt = amount;\n } else {\n this.rawAmnt = new BigNumber(amount)\n .times(decimalFactor(token.decimals))\n .toFixed(0);\n }\n this.token = token;\n }\n\n public formattedAmount(): string {\n return new BigNumber(this.rawAmnt)\n .div(decimalFactor(this.token.decimals))\n .toString();\n }\n\n public rawAmount(): string {\n return this.rawAmnt;\n }\n\n public static fromAddressAndAmount(\n tokenAddress: Address,\n amount: string,\n isRaw: boolean = true\n ): TokenAmount {\n return new TokenAmount(\n new Token(tokenAddress, getDecimal(tokenAddress)),\n amount,\n isRaw\n );\n }\n}\n","import BigNumber from 'bignumber.js';\nimport { Contract, providers, BigNumber as BN, ethers } from 'ethers';\nimport {\n DECIMAL_PRECISION,\n networkAddresses,\n PRICE_WHITELISTED,\n} from './constants';\nimport OracleABI from './abis/Oracle.json';\nimport { isSameAddress, decimalFactor, getDecimal } from './helpers';\nimport { IUniswapV2Pair, PriceOracle } from '@aurigami/contracts/typechain';\nimport { TokenAmount } from './tokenAmount';\nimport { Address, TokenValuation } from './types';\nimport IUniswapV2PairABI from './abis/IUniswapV2Pair.json';\nimport AuriLensABI from '@aurigami/contracts/artifacts/contracts/AuriLens.sol/AuriLens.json';\nimport axios from 'axios';\nimport assert from 'assert';\n\nconst hardcodePLYPrice = true;\nexport async function fetchPriceFromCoingeckoAPI(\n id: string\n): Promise<BigNumber> {\n const price = await axios\n .get(\n `https://api.coingecko.com/api/v3/simple/price?ids=${id}&vs_currencies=usd`\n )\n .then((res: any) => {\n return res.data;\n });\n\n return new BigNumber(price[id].usd);\n}\n\nexport async function fetchPriceFromCoingecko(id: Address): Promise<BigNumber> {\n switch (id.toLowerCase()) {\n case networkAddresses.tokens.AURORA:\n return fetchPriceFromCoingeckoAPI('aurora-near');\n\n case networkAddresses.tokens.TRI:\n return fetchPriceFromCoingeckoAPI('trisolaris');\n\n case networkAddresses.tokens.META:\n return fetchPriceFromCoingeckoAPI('meta-pool');\n\n default:\n throw Error(`Unknown token ${id} in fetchPriceFromCoingecko`);\n }\n}\n\nexport async function fetchLPPositions(\n LPAddress: Address,\n provider: providers.Provider\n): Promise<{\n token0: Address;\n token1: Address;\n reserve0: BN;\n reserve1: BN;\n totalSupply: BN;\n}> {\n const LPContract = new Contract(\n LPAddress,\n IUniswapV2PairABI.abi,\n provider\n ) as IUniswapV2Pair;\n var promises: any[] = [];\n promises.push(LPContract.token0());\n promises.push(LPContract.token1());\n promises.push(LPContract.getReserves());\n promises.push(LPContract.totalSupply());\n const values: any[] = await Promise.all(promises);\n\n return {\n token0: values[0] as string,\n token1: values[1] as string,\n reserve0: (values[2] as { reserve0: BN; reserve1: BN }).reserve0,\n reserve1: (values[2] as { reserve0: BN; reserve1: BN }).reserve1,\n totalSupply: values[3] as BN,\n };\n}\n\nexport async function fetchLPPrice(\n address: Address,\n provider: providers.Provider\n): Promise<BigNumber> {\n var LPInfo = await fetchLPPositions(address, provider);\n const LPDecimal = getDecimal(address);\n\n async function fetchLPPriceBy(tokenReverse: {\n address: string;\n reserve: BN;\n }): Promise<BigNumber> {\n if (tokenReverse.reserve.isZero()) return new BigNumber(0);\n\n // Should NOT call `fetchPrice`, it will cause an infinite loop\n // because the token can be PLY. To calculate PLY price, we need to\n // call `fetchPrice` again...\n const tokenPrice: BigNumber = await _fetchPrice(\n tokenReverse.address,\n provider\n );\n const tokenDecimal = getDecimal(tokenReverse.address);\n\n // reserveUSD will be divided by 10^tokenDecimal later for more precision\n const reserveUSD: BigNumber = tokenPrice\n .multipliedBy(tokenReverse.reserve.toString())\n .multipliedBy(2);\n return reserveUSD\n .multipliedBy(decimalFactor(LPDecimal))\n .dividedBy(new BigNumber(LPInfo.totalSupply.toString()))\n .dividedBy(decimalFactor(tokenDecimal));\n }\n\n try {\n // MUST await here\n return await fetchLPPriceBy({\n address: LPInfo.token0,\n reserve: LPInfo.reserve0,\n });\n } catch {\n try {\n // MUST await here\n return await fetchLPPriceBy({\n address: LPInfo.token1,\n reserve: LPInfo.reserve1,\n });\n } catch {\n throw Error(`Unable to fetch price for both tokens of LP ${address}`);\n }\n }\n}\n\nfunction processPriceFromOracle(rawPrice: BN, underlyingDecimal: number) {\n return new BigNumber(rawPrice.toString()).div(\n decimalFactor(36 - underlyingDecimal)\n );\n}\nexport async function fetchPriceFromOracle(\n auTokenAddress: Address,\n underlyingDecimal: number,\n provider: providers.Provider\n): Promise<BigNumber> {\n const oracleContract: PriceOracle = new Contract(\n networkAddresses.misc.oracle,\n OracleABI.abi,\n provider\n ) as PriceOracle;\n const rawPrice = await oracleContract.getUnderlyingPrice(auTokenAddress);\n return processPriceFromOracle(rawPrice, underlyingDecimal);\n}\n\nexport async function fetchUnderlyingTokensPrices(\n provider: providers.Provider\n): Promise<\n {\n auToken: string;\n underlyingPrice: BigNumber;\n }[]\n> {\n const auriLens: Contract = new Contract(\n networkAddresses.misc.AURILENS,\n AuriLensABI.abi,\n provider\n );\n const auTokenAddresses = networkAddresses.auTokens.map(\n (auToken) => auToken.address\n );\n const underlyingDecimals = networkAddresses.auTokens.map((auToken) =>\n getDecimal(auToken.underlying)\n );\n const rawPrices = await auriLens.auTokenUnderlyingPriceAll(auTokenAddresses);\n return rawPrices.map((res: any, ind: number) => {\n return {\n auToken: res.auToken,\n underlyingPrice: processPriceFromOracle(\n res.underlyingPrice,\n underlyingDecimals[ind]\n ),\n };\n });\n}\n\nexport async function fetchStNEARPrice(): Promise<BigNumber> {\n const ratioPromise = axios\n .get('https://validators.narwallets.com/metrics_json')\n .then((res) => res.data);\n const nearPricePromise = fetchPriceFromCoingeckoAPI('near');\n const [ratioRes, nearPrice]: [any, BigNumber] = await Promise.all([\n ratioPromise,\n nearPricePromise,\n ]);\n const ratio = new BigNumber(ratioRes.st_near_price);\n return ratio.multipliedBy(nearPrice);\n}\n\nfunction shouldFetchFromCoingecko(address: string) {\n address = address.toLowerCase();\n return (\n address == networkAddresses.tokens.AURORA ||\n address == networkAddresses.tokens.TRI ||\n address == networkAddresses.tokens.META\n );\n}\n\n/**\n * Fetch price from Oracle or Coingecko\n */\nasync function _fetchPrice(\n address: Address,\n provider: providers.Provider\n): Promise<BigNumber> {\n assert(PRICE_WHITELISTED.has(address.toLocaleLowerCase()));\n\n if (isSameAddress(address, networkAddresses.tokens.stNEAR))\n return fetchStNEARPrice();\n if (shouldFetchFromCoingecko(address))\n return fetchPriceFromCoingecko(address);\n\n const matchingAuToken = networkAddresses.auTokens.find((auToken) => {\n return isSameAddress(auToken.underlying, address);\n });\n\n if (matchingAuToken !== undefined) {\n return fetchPriceFromOracle(\n matchingAuToken.address,\n getDecimal(address),\n provider\n );\n } else {\n throw Error(`Unable to fetch price for ${address}`);\n }\n}\n\nexport async function fetchPrice(\n address: Address,\n provider: providers.Provider\n): Promise<BigNumber> {\n if (isSameAddress(address, networkAddresses.tokens.PLYWNEAR)) {\n return fetchLPPrice(address, provider);\n } else if (isSameAddress(address, networkAddresses.tokens.PLY)) {\n return fetchPLYPrice(provider);\n }\n return _fetchPrice(address, provider);\n}\n\nexport async function fetchPLYPrice(\n provider: providers.Provider\n): Promise<BigNumber> {\n //TODO: Fetch PLY price from CEX?\n return fetchToken0PriceByLP(networkAddresses.tokens.PLYWNEAR, provider);\n}\n\nexport async function fetchToken0PriceByLP(\n LP: Address,\n provider: providers.Provider\n): Promise<BigNumber> {\n const LPInfo = await fetchLPPositions(LP, provider);\n\n if (LPInfo.reserve1.isZero()) {\n return new BigNumber(0);\n }\n\n const token0Decimal = getDecimal(LPInfo.token0);\n const token1Decimal = getDecimal(LPInfo.token1);\n\n // (token0Price * reserve0) / 10^decimal0 = (token1Price * reserve1) / 10^decimal1\n // token0Price = (token1Price * reserve1) * 10^decimal0 / 10^decimal1 / reserve0\n return (await fetchPrice(LPInfo.token1, provider))\n .multipliedBy(LPInfo.reserve1.toString())\n .multipliedBy(decimalFactor(token0Decimal))\n .dividedBy(decimalFactor(token1Decimal))\n .dividedBy(LPInfo.reserve0.toString());\n}\n\nexport async function fetchValuation(\n tokenAmount: TokenAmount,\n provider: providers.Provider\n): Promise<BigNumber> {\n if (tokenAmount.rawAmount() == '0') return new BigNumber(0);\n var price = await fetchPrice(tokenAmount.token.address, provider);\n return calcValuation(tokenAmount, price);\n}\n\nexport function calcValuation(tokenAmount: TokenAmount, price: BigNumber) {\n return new BigNumber(tokenAmount.formattedAmount()).multipliedBy(price);\n}\n\nexport async function valuateToken(\n tokenAmount: TokenAmount,\n provider: providers.Provider\n): Promise<TokenValuation> {\n let tokenValuation = await fetchValuation(tokenAmount, provider);\n return {\n tokenAmount: tokenAmount,\n currencyAmount: {\n currency: 'USD',\n amount: tokenValuation.toFixed(DECIMAL_PRECISION),\n },\n };\n}\n","import { BlockchainEntity, BlockchainEntityRead } from './BlockchainEntity';\nimport {\n MoneyMarketDetails,\n NetworkConnection,\n Address,\n ComptrollerRewardType,\n} from './types';\nimport { Contract, BigNumber as BN } from 'ethers';\nimport AuErc20ABI from '@aurigami/contracts/artifacts/contracts/AuErc20.sol/AuErc20.json';\nimport AuETHABI from '@aurigami/contracts/artifacts/contracts/AuETH.sol/AuETH.json';\nimport ComptrollerABI from '@aurigami/contracts/artifacts/contracts/Comptroller.sol/Comptroller.json';\nimport AuriLensABI from '@aurigami/contracts/artifacts/contracts/AuriLens.sol/AuriLens.json';\nimport EthRepayHelperABI from '@aurigami/contracts/artifacts/contracts/EthRepayHelper.sol/EthRepayHelper.json';\nimport {\n AuErc20,\n AuETH,\n AuriLens,\n Comptroller,\n EthRepayHelper,\n} from '@aurigami/contracts/typechain';\nimport { TransactionResponse } from '@ethersproject/abstract-provider';\nimport {\n networkAddresses,\n ETHAddress,\n ONE_YEAR,\n INF,\n ONE_DAY,\n DEPOSIT_NEAR_REWARDS_PER_WEEK,\n BORROW_NEAR_REWARDS_PER_WEEK,\n} from './constants';\nimport BigNumber from 'bignumber.js';\nimport {\n decimalFactor,\n isSameAddress,\n calcLMRewardApr,\n getCurrentTimestamp,\n} from './helpers';\nimport { Token, PLYToken } from './token';\nimport { TokenAmount } from './tokenAmount';\nimport { getDecimal, validateAndParseAddress } from './helpers';\nimport { fetchPrice, calcValuation, fetchValuation } from './priceFetcher';\n\ntype RewardSpeeds = {\n plyRewardSupplySpeed: BN;\n plyRewardBorrowSpeed: BN;\n auroraRewardSupplySpeed: BN;\n auroraRewardBorrowSpeed: BN;\n};\n\nexport class MoneyMarketRead extends BlockchainEntityRead {\n public underlying: Token;\n public auToken: AuErc20 | AuETH;\n protected _comptroller: Comptroller;\n\n protected _auriLens: AuriLens;\n constructor(\n networkConnection: NetworkConnection,\n auToken: Address,\n underlyingAsset: Address\n ) {\n super(networkConnection);\n if (isSameAddress(underlyingAsset, ETHAddress)) {\n this.auToken = new Contract(\n auToken,\n AuETHABI.abi,\n networkConnection.provider\n ) as AuETH;\n } else {\n this.auToken = new Contract(\n auToken,\n AuErc20ABI.abi,\n networkConnection.provider\n ) as AuErc20;\n }\n this.underlying = new Token(underlyingAsset, getDecimal(underlyingAsset));\n this._comptroller = new Contract(\n networkAddresses.misc.COMPTROLLER,\n ComptrollerABI.abi,\n networkConnection.provider\n ) as Comptroller;\n this._auriLens = new Contract(\n networkAddresses.misc.AURILENS,\n AuriLensABI.abi,\n networkConnection.provider\n ) as AuriLens;\n }\n\n protected async getRewardSpeeds(): Promise<RewardSpeeds> {\n var speeds = await this._auriLens.getRewardSpeeds(\n this._comptroller.address,\n this.auToken.address\n );\n return speeds;\n }\n public async getTotalTokenBorrowed(): Promise<TokenAmount> {\n return new TokenAmount(\n this.underlying,\n (await this.auToken.totalBorrows()).toString()\n );\n }\n public async getTotalTokenDeposited(): Promise<TokenAmount> {\n var promises = [];\n var totalBorrow: TokenAmount, totalCash: TokenAmount;\n promises.push(\n this.getTotalTokenBorrowed().then((res: TokenAmount) => {\n totalBorrow = res;\n })\n );\n promises.push(\n this.auToken.getCash().then((res: BN) => {\n totalCash = new TokenAmount(this.underlying, res.toString());\n })\n );\n await Promise.all(promises);\n return new TokenAmount(\n this.underlying,\n BN.from(totalCash!.rawAmount()).add(totalBorrow!.rawAmount()).toString()\n );\n }\n\n public async getDepositAPY(): Promise<BigNumber> {\n const supplyRatePerTimestamp = await this.auToken.supplyRatePerTimestamp();\n return new BigNumber(supplyRatePerTimestamp.toString())\n .multipliedBy(60 * 60 * 24 * 365)\n .div(decimalFactor(18));\n }\n\n public async getBorrowAPY(): Promise<BigNumber> {\n const borrowRatePerTimestamp = await this.auToken.borrowRatePerTimestamp();\n return new BigNumber(borrowRatePerTimestamp.toString())\n .multipliedBy(60 * 60 * 24 * 365)\n .div(decimalFactor(18));\n }\n\n public async getCollateralRatio(): Promise<BigNumber> {\n return this._comptroller.markets(this.auToken.address).then((res: any) => {\n return new BigNumber(res.collateralFactorMantissa.toString()).div(\n decimalFactor(18)\n );\n });\n }\n\n public async getBorrowPlyAPY(): Promise<BigNumber> {\n var promises = [];\n var totalBorrowed: TokenAmount,\n rewardSpeed: TokenAmount,\n plyPrice: BigNumber,\n underlyingPrice: BigNumber;\n promises.push(\n this.getTotalTokenBorrowed().then((res: TokenAmount) => {\n totalBorrowed = res;\n })\n );\n promises.push(\n this._comptroller\n .rewardSpeeds(ComptrollerRewardType.PLY, this.auToken.address, false)\n .then((res) => {\n rewardSpeed = new TokenAmount(PLYToken, res.toString());\n })\n );\n promises.push(\n fetchPrice(\n networkAddresses.tokens.PLY,\n this._networkConnection.provider\n ).then((res) => {\n plyPrice = res;\n })\n );\n promises.push(\n fetchPrice(\n this.underlying.address,\n this._networkConnection.provider\n ).then((res) => {\n underlyingPrice = res;\n })\n );\n await Promise.all(promises);\n return calcLMRewardApr(\n plyPrice!.multipliedBy(rewardSpeed!.formattedAmount()),\n underlyingPrice!.multipliedBy(totalBorrowed!.formattedAmount()),\n ONE_YEAR\n );\n }\n\n public async getDepositPlyAPY(): Promise<BigNumber> {\n var promises = [];\n var totalDeposited: TokenAmount,\n rewardSpeed: TokenAmount,\n plyPrice: BigNumber,\n underlyingPrice: BigNumber;\n promises.push(\n this.getTotalTokenDeposited().then((res: TokenAmount) => {\n totalDeposited = res;\n })\n );\n promises.push(\n this._comptroller\n .rewardSpeeds(ComptrollerRewardType.PLY, this.auToken.address, true)\n .then((res) => {\n rewardSpeed = new TokenAmount(PLYToken, res.toString());\n })\n );\n promises.push(\n fetchPrice(\n networkAddresses.tokens.PLY,\n this._networkConnection.provider\n ).then((res) => {\n plyPrice = res;\n })\n );\n promises.push(\n fetchPrice(\n this.underlying.address,\n this._networkConnection.provider\n ).then((res) => {\n underlyingPrice = res;\n })\n );\n await Promise.all(promises);\n return calcLMRewardApr(\n plyPrice!.multipliedBy(rewardSpeed!.formattedAmount()),\n underlyingPrice!.multipliedBy(totalDeposited!.formattedAmount()),\n ONE_YEAR\n );\n }\n public async getDetails(): Promise<MoneyMarketDetails> {\n var promises = [],\n totalDeposited: TokenAmount,\n totalBorrowed: TokenAmount,\n depositAPY: number,\n borrowAPY: number,\n collateralRatio: number;\n promises.push(\n this.getTotalTokenDeposited().then((res: TokenAmount) => {\n totalDeposited = res;\n })\n );\n promises.push(\n this.getTotalTokenBorrowed().then((res: TokenAmount) => {\n totalBorrowed = res;\n })\n );\n promises.push(\n this.getDepositAPY().then((res: BigNumber) => {\n depositAPY = res.toNumber();\n })\n );\n promises.push(\n this.getBorrowAPY().then((res: BigNumber) => {\n borrowAPY = res.toNumber();\n })\n );\n promises.push(\n this.getCollateralRatio().then((res: BigNumber) => {\n collateralRatio = res.toNumber();\n })\n );\n\n var plyPrice: BigNumber,\n underlyingPrice: BigNumber,\n rewardSpeeds: RewardSpeeds;\n promises.push(\n this.getRewardSpeeds().then((res) => {\n rewardSpeeds = res;\n })\n );\n promises.push(\n fetchPrice(\n networkAddresses.tokens.PLY,\n this._networkConnection.provider\n ).then((res) => {\n plyPrice = res;\n })\n );\n promises.push(\n fetchPrice(\n this.underlying.address,\n this._networkConnection.provider\n ).then((res) => {\n underlyingPrice = res;\n })\n );\n\n await Promise.all(promises);\n\n var borrowPlyApy = calcLMRewardApr(\n calcValuation(\n new TokenAmount(\n PLYToken,\n rewardSpeeds!.plyRewardBorrowSpeed.toString()\n ),\n plyPrice!\n ),\n underlyingPrice!.multipliedBy(totalBorrowed!.formattedAmount()),\n ONE_YEAR\n );\n var depositPlyApy = calcLMRewardApr(\n calcValuation(\n new TokenAmount(\n PLYToken,\n rewardSpeeds!.plyRewardSupplySpeed.toString()\n ),\n plyPrice!\n ),\n underlyingPrice!.multipliedBy(totalDeposited!.formattedAmount()),\n ONE_YEAR\n );\n\n var depositNEARApy = calcLMRewardApr(\n await fetchValuation(\n this.getDepositNEARRewardPerWeek(),\n this._networkConnection.provider\n ),\n underlyingPrice!.multipliedBy(totalDeposited!.formattedAmount()),\n 52\n );\n var borrowNEARApy = calcLMRewardApr(\n await fetchValuation(\n this.getBorrowNEARRewardPerWeek(),\n this._networkConnection.provider\n ),\n underlyingPrice!.multipliedBy(totalBorrowed!.formattedAmount()),\n 52\n );\n var depositMETAApy;\n if (\n isSameAddress(this.underlying.address, networkAddresses.tokens.stNEAR)\n ) {\n depositMETAApy = calcLMRewardApr(\n new BigNumber(50000),\n underlyingPrice!.multipliedBy(totalDeposited!.formattedAmount()),\n 12\n );\n } else {\n depositMETAApy = new BigNumber(0);\n }\n\n return {\n auTokenAddress: this.auToken.address,\n totalTokenDeposited: totalDeposited!,\n totalTokenBorrowed: totalBorrowed!,\n depositApy: depositAPY!,\n depositPlyApy: depositPlyApy.toNumber(),\n borrowApy: borrowAPY!,\n borrowPlyApy: borrowPlyApy.toNumber() * -1,\n collateralRatio: collateralRatio!,\n depositPlyPerWeek: new TokenAmount(\n PLYToken,\n rewardSpeeds!.plyRewardSupplySpeed.mul(ONE_DAY).mul(7).toString()\n ),\n borrowPlyPerWeek: new TokenAmount(\n PLYToken,\n rewardSpeeds!.plyRewardBorrowSpeed.mul(ONE_DAY).mul(7).toString()\n ),\n depositNEARApy: depositNEARApy.toNumber(),\n borrowNEARApy: borrowNEARApy.toNumber() * -1,\n depositMETAApy: depositMETAApy.toNumber(),\n };\n }\n\n public async getUserBorrowBalance(userAddress: string): Promise<TokenAmount> {\n const totalBorrow: BN = await this.auToken.callStatic.borrowBalanceCurrent(\n userAddress\n );\n return new TokenAmount(this.underlying, totalBorrow.toString());\n }\n\n public async getUserDepositBalance(\n userAddress: string\n ): Promise<TokenAmount> {\n const totalDeposit: BN = await this.auToken.callStatic.balanceOfUnderlying(\n userAddress\n );\n return new TokenAmount(this.underlying, totalDeposit.toString());\n }\n\n private getDepositNEARRewardPerWeek(): TokenAmount {\n const NEARToken = new Token(\n networkAddresses.tokens.WNEAR,\n getDecimal(networkAddresses.tokens.WNEAR)\n );\n const rewardStartTime = 1650636000;\n const rewardStopTime = 1651845600; // May 06, 2022 2 PM GMT\n const currentTime = getCurrentTimestamp();\n if (currentTime <= rewardStopTime && currentTime > rewardStartTime) {\n const reward =\n DEPOSIT_NEAR_REWARDS_PER_WEEK[\n this.underlying.address.toLocaleLowerCase()\n ] ?? '0';\n return new TokenAmount(NEARToken, reward, false);\n } else {\n return new TokenAmount(NEARToken, '0');\n }\n }\n\n private getBorrowNEARRewardPerWeek(): TokenAmount {\n const NEARToken = new Token(\n networkAddresses.tokens.WNEAR,\n getDecimal(networkAddresses.tokens.WNEAR)\n );\n const rewardStartTime = 1650636000;\n const rewardStopTime = 1651845600; // May 06, 2022 2 PM GMT\n const currentTime = getCurrentTimestamp();\n if (currentTime <= rewardStopTime && currentTime > rewardStartTime) {\n const reward =\n BORROW_NEAR_REWARDS_PER_WEEK[\n this.underlying.address.toLocaleLowerCase()\n ] ?? '0';\n return new TokenAmount(NEARToken, reward, false);\n } else {\n return new TokenAmount(NEARToken, '0');\n }\n }\n}\n\nexport class MoneyMarketReadWrite extends MoneyMarketRead {\n protected _EthRepayHelper: EthRepayHelper;\n constructor(\n networkConnection: NetworkConnection,\n auToken: Address,\n underlyingAsset: Address\n ) {\n super(networkConnection, auToken, underlyingAsset);\n this._EthRepayHelper = new Contract(\n networkAddresses.misc.ETHREPAYHELPER,\n EthRepayHelperABI.abi,\n networkConnection.provider\n ) as EthRepayHelper;\n }\n\n public async deposit(amount: TokenAmount): Promise<TransactionResponse> {\n if (isSameAddress(amount.token.address, ETHAddress)) {\n return (this.auToken as AuETH)\n .connect(this._networkConnection.signer!)\n .mint({ value: amount.rawAmount() });\n } else {\n return (this.auToken as AuErc20)\n .connect(this._networkConnection.signer!)\n .mint(amount.rawAmount());\n }\n }\n public async borrow(amount: TokenAmount): Promise<TransactionResponse> {\n return this.auToken\n .connect(this._networkConnection.signer!)\n .borrow(amount.rawAmount());\n }\n public async withdraw(amount: TokenAmount): Promise<TransactionResponse> {\n if (new BigNumber(amount.rawAmount()).lt(0)) {\n return this.auToken\n .connect(this._networkConnection.signer!)\n .redeemUnderlying(INF);\n }\n return this.auToken\n .connect(this._networkConnection.signer!)\n .redeemUnderlying(amount.rawAmount());\n }\n public async repay(amount: TokenAmount): Promise<TransactionResponse> {\n if (isSameAddress(amount.token.address, ETHAddress)) {\n return this._EthRepayHelper\n .connect(this._networkConnection.signer!)\n .repayBorrow({ value: amount.rawAmount() });\n } else {\n if (new BigNumber(amount.rawAmount()).lt(0)) {\n return this.auToken\n .connect(this._networkConnection.signer!)\n .repayBorrow(INF);\n } else {\n return this.auToken\n .connect(this._networkConnection.signer!)\n .repayBorrow(amount.rawAmount());\n }\n }\n }\n public async enableCollateral(): Promise<TransactionResponse> {\n return this._comptroller\n .connect(this._networkConnection.signer!)\n .enterMarkets([this.auToken.address]);\n }\n public async disableCollateral(): Promise<TransactionResponse> {\n return this._comptroller\n .connect(this._networkConnection.signer!)\n .exitMarket(this.auToken.address);\n }\n}\n\nexport class MoneyMarket extends BlockchainEntity {\n protected address: Address;\n\n protected underlying: Address;\n constructor(address: string, underlying: string) {\n super();\n this.address = validateAndParseAddress(address);\n this.underlying = validateAndParseAddress(underlying);\n }\n public read(networkConnection: NetworkConnection): MoneyMarketRead {\n return new MoneyMarketRead(\n networkConnection,\n this.address,\n this.underlying\n );\n }\n\n public readWrite(networkConnection: NetworkConnection): MoneyMarketReadWrite {\n return new MoneyMarketReadWrite(\n networkConnection,\n this.address,\n this.underlying\n );\n }\n}\n","import { BlockchainEntity, BlockchainEntityRead } from './BlockchainEntity';\nimport { NetworkConnection, Address, UserLockingDetails } from './types';\nimport { Contract, BigNumber as BN } from 'ethers';\nimport AuriFairLaunchABI from '@aurigami/contracts/artifacts/contracts/AuriFairLaunch.sol/AuriFairLaunch.json';\nimport PulpABI from '@aurigami/contracts/artifacts/contracts/PULP.sol/PULP.json';\nimport EIP20InterfaceABI from '@aurigami/contracts/artifacts/contracts/interfaces/EIP20Interface.sol/EIP20Interface.json';\nimport ComptrollerABI from '@aurigami/contracts/artifacts/contracts/Comptroller.sol/Comptroller.json';\nimport AuriLensABI from '@aurigami/contracts/artifacts/contracts/AuriLens.sol/AuriLens.json';\nimport {\n AuriFairLaunch,\n AuriLens,\n Comptroller,\n IERC20,\n PULP,\n} from '@aurigami/contracts/typechain';\nimport { TransactionResponse } from '@ethersproject/abstract-provider';\nimport {\n networkAddresses,\n ONE_DAY,\n ALL_STAKING_POOLS,\n REWARD_CLAIM_START,\n ONE_WEEK,\n} from './constants';\nimport { getCurrentTimestamp } from './helpers';\nimport { Token } from './token';\nimport { TokenAmount } from './tokenAmount';\nimport { getDecimal } from './helpers';\nimport BigNumber from 'bignumber.js';\n\nconst LOCKING_DENOMINATOR = BN.from(10000);\nexport class PapermillRead extends BlockchainEntityRead {\n public plyToken: Token;\n public pulpToken: Token;\n\n protected _ply: IERC20;\n protected _pulp: PULP;\n protected _comptroller: Comptroller;\n protected _auriFairLaunch: AuriFairLaunch;\n protected _auriLens: AuriLens;\n\n constructor(networkConnection: NetworkConnection) {\n super(networkConnection);\n\n let plyAddress = networkAddresses.tokens.PLY;\n let pulpAddress = networkAddresses.tokens.PULP;\n\n this.plyToken = new Token(plyAddress, getDecimal(plyAddress));\n this.pulpToken = new Token(pulpAddress, getDecimal(pulpAddress));\n\n this._comptroller = new Contract(\n networkAddresses.misc.COMPTROLLER,\n ComptrollerABI.abi,\n networkConnection.provider\n ) as Comptroller;\n this._auriFairLaunch = new Contract(\n networkAddresses.misc.AURIFAIRLAUNCH,\n AuriFairLaunchABI.abi,\n networkConnection.provider\n ) as AuriFairLaunch;\n this._auriLens = new Contract(\n networkAddresses.misc.AURILENS,\n AuriLensABI.abi,\n networkConnection.provider\n ) as AuriLens;\n this._ply = new Contract(\n plyAddress,\n EIP20InterfaceABI.abi,\n networkConnection.provider\n ) as IERC20;\n this._pulp = new Contract(\n pulpAddress,\n PulpABI.abi,\n networkConnection.provider\n ) as PULP;\n }\n\n public async getPlyBalance(userAddress: Address): Promise<TokenAmount> {\n const plyBalance = await this._ply.balanceOf(userAddress);\n return new TokenAmount(this.plyToken, plyBalance.toString());\n }\n\n public async getPulpBalance(userAddress: Address): Promise<TokenAmount> {\n const pulpBalance = await this._pulp.balanceOf(userAddress);\n return new TokenAmount(this.pulpToken, pulpBalance.toString());\n }\n\n /**\n * Get all unclaimed PLY reward of the user in all markets + all staking pools\n */\n public async getUnclaimedPlyReward(\n userAddress: Address\n ): Promise<TokenAmount> {\n let rewardBalancesMetadata = await this._auriLens.callStatic.claimRewards(\n this._comptroller.address,\n this._auriFairLaunch.address,\n ALL_STAKING_POOLS,\n { from: userAddress }\n );\n\n return new TokenAmount(\n this.plyToken,\n rewardBalancesMetadata.plyAccrured.toString()\n );\n }\n\n private getWeek(timestamp: number): number {\n return BN.from(timestamp - REWARD_CLAIM_START)\n .div(ONE_WEEK)\n .toNumber();\n }\n /**\n * Get all locking details of the user in all markets + all staking pools\n */\n public async getLockingDetails(\n userAddress: Address\n ): Promise<UserLockingDetails> {\n const currentWeek = this.getWeek(getCurrentTimestamp());\n var promises: any[] = [];\n\n promises.push(\n this._auriLens.getPercentLock(\n this._pulp.address,\n userAddress,\n currentWeek\n )\n );\n promises.push(\n this._auriLens.getPercentLock(\n this._pulp.address,\n userAddress,\n currentWeek + 1\n )\n );\n promises.push(this.getUnclaimedPlyReward(userAddress));\n\n var values: any[] = await Promise.all(promises);\n\n let percentLockCurrentWeek = BN.from(values[0]);\n let percentLockNextWeek = BN.from(values[1]);\n let totalRewards = values[2] as TokenAmount;\n\n let [pulpAmountCurrentWeek, plyAmountCurrentWeek] =\n await this._pulp.calcLockAmount(userAddress, totalRewards.rawAmount());\n\n // Predict next week lock amount = totalRewards * percentLock next week\n // This doesn't take (the reward that user might earn in the next week) into account\n let plyAmountNextWeek = percentLockNextWeek\n .mul(totalRewards.rawAmount())\n .div(LOCKING_DENOMINATOR);\n let pulpAmountNextWeek = BN.from(totalRewards.rawAmount()).sub(\n plyAmountNextWeek\n );\n\n // we need to divide these two number by 10000 and multiple by 100 to get the percentage\n // I need to use BigNumber to do this because BN of ethers.js doesn't support floating point\n let currentUnlockPortion = LOCKING_DENOMINATOR.sub(\n percentLockCurrentWeek\n ).toString();\n let nextUnlockPortion =\n LOCKING_DENOMINATOR.sub(percentLockNextWeek).toString();\n\n return {\n vestingStart: REWARD_CLAIM_START,\n currentUnlockPortion: new BigNumber(currentUnlockPortion)\n .dividedBy(100)\n .toNumber(),\n accruedPly: totalRewards,\n currentPly: new TokenAmount(\n this.plyToken,\n plyAmountCurrentWeek.toString()\n ),\n currentPulp: new TokenAmount(\n this.pulpToken,\n pulpAmountCurrentWeek.toString()\n ),\n //\n nextUnlockPortion: new BigNumber(nextUnlockPortion)\n .dividedBy(100)\n .toNumber(),\n nextPly: new TokenAmount(this.plyToken, plyAmountNextWeek.toString()),\n nextPulp: new TokenAmount(this.pulpToken, pulpAmountNextWeek.toString()),\n };\n }\n\n /**\n * Get the first timestamp that the unlockPortion reach the target\n *\n * @param userAddress currently doesn't matter\n * @param targetUnlockPortion unlockPortion target\n */\n public async getTimestampToUnlock(\n userAddress: Address,\n targetUnlockPortion: number\n ): Promise<number> {\n let weekId = await this._auriLens.getWeekToUnlock(\n this._pulp.address,\n userAddress,\n targetUnlockPortion * 100\n );\n\n return REWARD_CLAIM_START + ONE_WEEK * weekId.toNumber();\n }\n\n public async getUnlockPortionAt(\n userAddress: Address,\n timestamp: number\n ): Promise<number> {\n let lockPortion = await this._auriLens.getPercentLock(\n this._pulp.address,\n userAddress,\n this.getWeek(timestamp)\n );\n\n let unlockPortion = LOCKING_DENOMINATOR.sub(lockPortion);\n\n return unlockPortion.toNumber() / 100;\n }\n}\n\nexport class PapermillReadWrite extends PapermillRead {\n constructor(networkConnection: NetworkConnection) {\n super(networkConnection);\n }\n\n /**\n * Redeem PLY from PULP and transfer PLY to another address\n * @param recipient Address that will receive the PLY.\n * @param amount Amount of PULP to be converted to PLY.\n * Set to ethers.constants.MaxUint256 for max redeem.\n */\n public async redeem(\n recipient: Address,\n amount: TokenAmount\n ): Promise<TransactionResponse> {\n return this._pulp\n .connect(this._networkConnection.signer!)\n .redeem(recipient, amount.rawAmount());\n }\n\n /**\n * Redeem PLY from PULP and transfer PLY to msg.sender\n * @param amount Amount of PULP to be converted to PLY.\n * Set to ethers.constants.MaxUint256 for max redeem.\n */\n public async selfRedeem(amount: TokenAmount): Promise<TransactionResponse> {\n let msgSender: string = await this._networkConnection.signer!.getAddress();\n return this.redeem(msgSender, amount);\n }\n}\n\nexport class Papermill extends BlockchainEntity {\n constructor() {\n super();\n }\n public read(networkConnection: NetworkConnection): PapermillRead {\n return new PapermillRead(networkConnection);\n }\n\n public readWrite(networkConnection: NetworkConnection): PapermillReadWrite {\n return new PapermillReadWrite(networkConnection);\n }\n}\n","import AuriFairLaunchABI from '@aurigami/contracts/artifacts/contracts/AuriFairLaunch.sol/AuriFairLaunch.json';\nimport AuriLensABI from '@aurigami/contracts/artifacts/contracts/AuriLens.sol/AuriLens.json';\nimport ComptrollerABI from '@aurigami/contracts/artifacts/contracts/Comptroller.sol/Comptroller.json';\nimport EIP20InterfaceABI from '@aurigami/contracts/artifacts/contracts/interfaces/EIP20Interface.sol/EIP20Interface.json';\nimport {\n AuriFairLaunch,\n AuriLens,\n Comptroller,\n IERC20,\n} from '@aurigami/contracts/typechain';\nimport { TransactionResponse } from '@ethersproject/abstract-provider';\nimport BigNumber from 'bignumber.js';\nimport { BigNumber as BN, Contract } from 'ethers';\nimport { BlockchainEntity, BlockchainEntityRead } from './BlockchainEntity';\nimport {\n DECIMAL_PRECISION,\n networkAddresses,\n ONE_DAY,\n PLYWNEAR_POOL_ID,\n PLYWNEAR_REWARD_TOKENS,\n} from './constants';\nimport { calcLMRewardApr, getDecimal } from './helpers';\nimport { fetchValuation, valuateToken } from './priceFetcher';\nimport { PLYWNEARToken, Token } from './token';\nimport { TokenAmount } from './tokenAmount';\nimport {\n NetworkConnection,\n PLYWNEARPoolDetails,\n TokenAPY,\n TokenValuation,\n} from './types';\n\nexport class StakingRead extends BlockchainEntityRead {\n protected _comptroller: Comptroller;\n protected _auriFairLaunch: AuriFairLaunch;\n protected _auriLens: AuriLens;\n constructor(networkConnection: NetworkConnection) {\n super(networkConnection);\n this._comptroller = new Contract(\n networkAddresses.misc.COMPTROLLER,\n ComptrollerABI.abi,\n networkConnection.provider\n ) as Comptroller;\n this._auriFairLaunch = new Contract(\n networkAddresses.misc.AURIFAIRLAUNCH,\n AuriFairLaunchABI.abi,\n networkConnection.provider\n ) as AuriFairLaunch;\n this._auriLens = new Contract(\n networkAddresses.misc.AURILENS,\n AuriLensABI.abi,\n networkConnection.provider\n ) as AuriLens;\n }\n\n public async getPLYWNEARPoolDetails(): Promise<PLYWNEARPoolDetails> {\n var stakedLiquidity: BN, rewardPerSeconds: BN[];\n await this._auriFairLaunch.getPoolInfo(PLYWNEAR_POOL_ID).then((res) => {\n stakedLiquidity = res.totalStake;\n rewardPerSeconds = res.rewardPerSeconds;\n });\n\n let stakedLiquidityAmount = new TokenAmount(\n PLYWNEARToken,\n stakedLiquidity!.toString()\n );\n\n var totalStakeValuation: BigNumber = await fetchValuation(\n stakedLiquidityAmount,\n this._networkConnection.provider\n );\n\n var promises = [];\n\n // Calculate the reward per second in USD\n for (let i = 0; i < rewardPerSeconds!.length; i++) {\n let rewardTokenAddress = PLYWNEAR_REWARD_TOKENS[i];\n let rewardToken = new Token(\n rewardTokenAddress,\n getDecimal(rewardTokenAddress)\n );\n let rewardPerSecond = rewardPerSeconds![i];\n promises.push(\n fetchValuation(\n new TokenAmount(rewardToken, rewardPerSecond!.toString()),\n this._networkConnection.provider\n )\n );\n }\n\n let APYs: TokenAPY[] = [];\n (await Promise.all(promises)).forEach((rewardPerSecondValuation, i) => {\n let rewardTokenAddress = PLYWNEAR_REWARD_TOKENS[i];\n let apy = calcLMRewardApr(\n rewardPerSecondValuation,\n totalStakeValuation,\n ONE_DAY * 365\n ).toFixed(DECIMAL_PRECISION);\n\n APYs.push({\n address: rewardTokenAddress,\n apy: apy,\n });\n });\n\n return {\n totalStakedLiquidity: {\n tokenAmount: stakedLiquidityAmount,\n currencyAmount: {\n currency: 'USD',\n amount: totalStakeValuation!.toFixed(DECIMAL_PRECISION),\n },\n },\n APYs: APYs,\n };\n }\n\n /**\n * Get amount and value in $ of staked LP tokens\n */\n public async stakeBalanceOf(user: string): Promise<TokenValuation> {\n const userInfo = await this._auriFairLaunch.getUserInfo(\n PLYWNEAR_POOL_ID,\n user\n );\n let stakeAmount = new TokenAmount(\n PLYWNEARToken,\n userInfo.amount.toString()\n );\n\n return valuateToken(stakeAmount, this._networkConnection.provider);\n }\n\n /**\n * Get amount and value in $ of LP token in user wallet\n */\n public async LpBalanceOf(user: string): Promise<TokenValuation> {\n let lpContract = new Contract(\n networkAddresses.tokens.PLYWNEAR,\n EIP20InterfaceABI.abi,\n this._networkConnection.provider\n ) as IERC20;\n let balance = await lpContract.balanceOf(user);\n\n return valuateToken(\n new TokenAmount(PLYWNEARToken, balance.toString()),\n this._networkConnection.provider\n );\n }\n\n public async unclaimedRewardsOf(user: string): Promise<TokenAmount[]> {\n let userInfo = await this._auriFairLaunch.callStatic.updateAndGetUserInfo(\n PLYWNEAR_POOL_ID,\n user,\n { from: user }\n );\n\n let rewards = userInfo.unclaimedRewards;\n return rewards.map((reward, i) =>\n TokenAmount.fromAddressAndAmount(\n PLYWNEAR_REWARD_TOKENS[i],\n reward.toString()\n )\n );\n }\n}\n\nexport class StakingReadWrite extends StakingRead {\n public async stake(amount: TokenAmount): Promise<TransactionResponse> {\n return this._auriFairLaunch\n .connect(this._networkConnection.signer!)\n .deposit(PLYWNEAR_POOL_ID, amount.rawAmount());\n }\n\n public async unstake(amount: TokenAmount): Promise<TransactionResponse> {\n return this._auriFairLaunch\n .connect(this._networkConnection.signer!)\n .withdraw(PLYWNEAR_POOL_ID, amount.rawAmount());\n }\n}\n\nexport class Staking extends BlockchainEntity {\n constructor() {\n super();\n }\n public read(networkConnection: NetworkConnection): StakingRead {\n return new StakingRead(networkConnection);\n }\n\n public readWrite(networkConnection: NetworkConnection): StakingReadWrite {\n return new StakingReadWrite(networkConnection);\n }\n}\n","import AuriFairLaunchABI from '@aurigami/contracts/artifacts/contracts/AuriFairLaunch.sol/AuriFairLaunch.json';\nimport AuriLensABI from '@aurigami/contracts/artifacts/contracts/AuriLens.sol/AuriLens.json';\nimport ComptrollerABI from '@aurigami/contracts/artifacts/contracts/Comptroller.sol/Comptroller.json';\nimport FaucetABI from '@aurigami/contracts/artifacts/contracts/mock/Faucet.sol/Faucet.json';\nimport {\n AuriFairLaunch,\n AuriLens,\n Comptroller,\n} from '@aurigami/contracts/typechain';\nimport { TransactionResponse } from '@ethersproject/abstract-provider';\nimport BigNumber from 'bignumber.js';\nimport { BigNumber as BN, Contract } from 'ethers';\nimport { BlockchainEntity, BlockchainEntityRead } from './BlockchainEntity';\nimport {\n ALL_STAKING_POOLS,\n BORROW_LIMIT_BUFFER,\n DECIMAL_PRECISION,\n networkAddresses,\n} from './constants';\nimport { decimalFactor, isSameAddress } from './helpers';\nimport { MoneyMarketRead } from './MoneyMarket';\nimport { PapermillRead } from './Papermill';\nimport { calcValuation, fetchPrice } from './priceFetcher';\nimport { StakingRead, StakingReadWrite } from './Staking';\nimport { Token } from './token';\nimport { TokenAmount } from './tokenAmount';\nimport {\n Address,\n CurrencyAmount,\n HypotheticalStats,\n MarketAction,\n NetworkConnection,\n PLYWNEARPoolDetails,\n TokenValuation,\n UserDetails,\n UserMarketDetails,\n} from './types';\n\nexport class SdkRead extends BlockchainEntityRead {\n protected _comptroller: Comptroller;\n protected _auriFairLaunch: AuriFairLaunch;\n protected _auriLens: AuriLens;\n protected _stakingRead: StakingRead;\n constructor(networkConnection: NetworkConnection) {\n super(networkConnection);\n this._stakingRead = new StakingRead(networkConnection);\n this._comptroller = new Contract(\n networkAddresses.misc.COMPTROLLER,\n ComptrollerABI.abi,\n networkConnection.provider\n ) as Comptroller;\n this._auriFairLaunch = new Contract(\n networkAddresses.misc.AURIFAIRLAUNCH,\n AuriFairLaunchABI.abi,\n networkConnection.provider\n ) as AuriFairLaunch;\n this._auriLens = new Contract(\n networkAddresses.misc.AURILENS,\n AuriLensABI.abi,\n networkConnection.provider\n ) as AuriLens;\n }\n\n public async getUserDetails(userAddress: string): Promise<UserDetails> {\n const marketCount = networkAddresses.auTokens.length;\n var userMarketDetails: UserMarketDetails[] = [],\n assetsIn: string[];\n var promises = [];\n var totalBorrowLimit = new BigNumber(0);\n var pricePromises = [];\n for (const auToken of networkAddresses.auTokens) {\n const userMarketDetail: UserMarketDetails = {} as UserMarketDetails;\n userMarketDetails.push(userMarketDetail);\n userMarketDetail.market = auToken.underlying;\n const moneyMarket: MoneyMarketRead = new MoneyMarketRead(\n this._networkConnection,\n auToken.address,\n auToken.underlying\n );\n promises.push(\n moneyMarket\n .getUserDepositBalance(userAddress)\n .then((res: TokenAmount) => {\n userMarketDetail.depositBalance = res;\n })\n );\n promises.push(\n moneyMarket\n .getUserBorrowBalance(userAddress)\n .then((res: TokenAmount) => {\n userMarketDetail.borrowBalance = res;\n })\n );\n promises.push(\n moneyMarket.getCollateralRatio().then((res: BigNumber) => {\n userMarketDetail.collateralRatio = res.toNumber();\n })\n );\n pricePromises.push(\n fetchPrice(\n moneyMarket.underlying.address,\n this._networkConnection.provider\n ).then((res) => {\n userMarketDetail.underlyingPrice = res.toString();\n return res;\n })\n );\n }\n\n promises.push(\n this._comptroller.getAssetsIn(userAddress).then((res: string[]) => {\n assetsIn = res;\n })\n );\n\n await Promise.all(promises);\n var underlyingPrices = await Promise.all(pricePromises);\n var depositValues = [];\n for (var i = 0; i < marketCount; i++) {\n const auToken = networkAddresses.auTokens[i];\n if (\n assetsIn!.find((auAddress: Address) =>\n isSameAddress(auToken.address, auAddress)\n ) !== undefined\n ) {\n userMarketDetails[i].isCollateral = true;\n } else {\n userMarketDetails[i].isCollateral = false;\n }\n depositValues.push(\n calcValuation(userMarketDetails[i].depositBalance, underlyingPrices[i])\n );\n }\n\n totalBorrowLimit = depositValues.reduce(\n (p: BigNumber, v: BigNumber, index: number) => {\n if (userMarketDetails[index].isCollateral)\n return p.plus(\n v.multipliedBy(userMarketDetails[index].collateralRatio)\n );\n return p;\n },\n new BigNumber(0)\n );\n\n var accountLiquidity: [BN, BN] =\n await this._comptroller.getAccountLiquidity(userAddress);\n\n var borrowedvaluation: BigNumber = totalBorrowLimit.minus(\n new BigNumber(accountLiquidity[0].toString()).div(decimalFactor(18))\n );\n\n if (borrowedvaluation.lt('0.00001')) {\n // Igore dust, dust could be the result of network delay causing collateral valuation calc to be different on vs off chain\n borrowedvaluation = new BigNumber(0);\n }\n\n const bufferedBorrowLimit: BigNumber =\n totalBorrowLimit.multipliedBy(BORROW_LIMIT_BUFFER);\n const minimumBorrowLimitAllowed =\n borrowedvaluation.div(BORROW_LIMIT_BUFFER);\n\n var borrowableAmount: BigNumber;\n if (bufferedBorrowLimit.lte(borrowedvaluation)) {\n borrowableAmount = new BigNumber(0);\n } else {\n borrowableAmount = bufferedBorrowLimit.minus(borrowedvaluation);\n }\n\n for (var i = 0; i < marketCount; i++) {\n const auToken = networkAddresses.auTokens[i];\n const moneyMarket: MoneyMarketRead = new MoneyMarketRead(\n this._networkConnection,\n auToken.address,\n auToken.underlying\n );\n const borrowLimitMargin = totalBorrowLimit\n .minus(minimumBorrowLimitAllowed)\n .gt(0)\n ? totalBorrowLimit.minus(minimumBorrowLimitAllowed)\n : new BigNumber(0);\n const maxWithdrawCap: BigNumber = borrowLimitMargin\n .div(userMarketDetails[i].collateralRatio)\n .div(underlyingPrices[i]);\n userMarketDetails[i].maxWithdrawableAmount =\n userMarketDetails[i].isCollateral &&\n maxWithdrawCap.lt(userMarketDetails[i].depositBalance.formattedAmount())\n ? new TokenAmount(\n moneyMarket.underlying,\n maxWithdrawCap.toFixed(24),\n false\n )\n : new TokenAmount(\n moneyMarket.underlying,\n userMarketDetails[i].depositBalance.rawAmount()\n );\n }\n\n return {\n markets: userMarketDetails,\n borrowLimit: {\n currency: 'USD',\n amount: bufferedBorrowLimit.toFixed(DECIMAL_PRECISION),\n },\n userLockingDetails: await new PapermillRead(\n this._networkConnection\n ).getLockingDetails(userAddress),\n borrowableAmount: {\n currency: 'USD',\n amount: borrowableAmount.toFixed(DECIMAL_PRECISION),\n },\n };\n }\n\n public async getPLYWNEARPoolDetails(): Promise<PLYWNEARPoolDetails> {\n return this._stakingRead.getPLYWNEARPoolDetails();\n }\n\n public async getTokenPrice(token: Token): Promise<CurrencyAmount> {\n const price = await fetchPrice(\n token.address,\n this._networkConnection.provider\n );\n return {\n currency: 'USD',\n amount: price.toFixed(DECIMAL_PRECISION),\n };\n }\n\n /**\n * Get amount and value in $ of staked LP tokens\n */\n public async stakeBalanceOf(user: string): Promise<TokenValuation> {\n return this._stakingRead.stakeBalanceOf(user);\n }\n\n /**\n * Get amount and value in $ of LP token in user wallet\n */\n public async LpBalanceOf(user: string): Promise<TokenValuation> {\n return this._stakingRead.LpBalanceOf(user);\n }\n\n public async unclaimedRewardsOf(user: string): Promise<TokenAmount[]> {\n return this._stakingRead.unclaimedRewardsOf(user);\n }\n\n public calcHypotheticalStats({\n userMarketDetail,\n currentBorrowLimit,\n currentBorrowValuation,\n action,\n tokenAmount,\n }: {\n userMarketDetail: UserMarketDetails;\n currentBorrowLimit: CurrencyAmount;\n currentBorrowValuation: CurrencyAmount;\n action: MarketAction;\n tokenAmount?: TokenAmount;\n }): HypotheticalStats {\n var newBorrowLimit = new BigNumber(currentBorrowLimit.amount),\n newBorrowValuation = new BigNumber(currentBorrowValuation.amount);\n switch (action) {\n case MarketAction.EnableCollateral:\n case MarketAction.DisableCollateral:\n var deltaBorrowLimit = calcValuation(\n userMarketDetail.depositBalance,\n new BigNumber(userMarketDetail.underlyingPrice)\n )\n .multipliedBy(userMarketDetail.collateralRatio)\n .multipliedBy(BORROW_LIMIT_BUFFER);\n newBorrowLimit =\n action == MarketAction.EnableCollateral\n ? newBorrowLimit.plus(deltaBorrowLimit)\n : newBorrowLimit.minus(deltaBorrowLimit);\n break;\n\n case MarketAction.Deposit:\n case MarketAction.Withdraw:\n deltaBorrowLimit = calcValuation(\n tokenAmount!,\n new BigNumber(userMarketDetail.underlyingPrice)\n )\n .multipliedBy(userMarketDetail.collateralRatio)\n .multipliedBy(BORROW_LIMIT_BUFFER);\n newBorrowLimit =\n action == MarketAction.Deposit\n ? newBorrowLimit.plus(deltaBorrowLimit)\n : newBorrowLimit.minus(deltaBorrowLimit);\n break;\n\n case MarketAction.Borrow:\n case MarketAction.Repay:\n var deltaBorrowValuation = calcValuation(\n tokenAmount!,\n new BigNumber(userMarketDetail.underlyingPrice)\n );\n newBorrowValuation =\n action == MarketAction.Borrow\n ? newBorrowValuation.plus(deltaBorrowValuation)\n : newBorrowValuation.minus(deltaBorrowValuation);\n break;\n }\n return {\n newBorrowLimit: {\n amount: newBorrowLimit!.toFixed(DECIMAL_PRECISION),\n currency: 'USD',\n },\n newBorrowUtilization: newBorrowLimit.eq(0)\n ? newBorrowValuation.eq(0)\n ? 0\n : 9999.99\n : newBorrowValuation!.div(newBorrowLimit!).toNumber(),\n };\n }\n}\n\nexport class SdkReadWrite extends SdkRead {\n /**\n * Claim PLY reward in all markets + staking pools\n */\n public async claim(): Promise<TransactionResponse> {\n return this._auriLens\n .connect(this._networkConnection.signer!)\n .claimRewards(\n this._comptroller.address,\n this._auriFairLaunch.address,\n ALL_STAKING_POOLS\n );\n }\n\n public async stake(amount: TokenAmount): Promise<TransactionResponse> {\n return new StakingReadWrite(this._networkConnection).stake(amount);\n }\n\n public async unstake(amount: TokenAmount): Promise<TransactionResponse> {\n return new StakingReadWrite(this._networkConnection).unstake(amount);\n }\n\n public async faucetDrip(): Promise<TransactionResponse> {\n const faucet = new Contract(\n networkAddresses.misc.FAUCET,\n FaucetABI.abi,\n this._networkConnection.provider\n );\n return faucet.connect(this._networkConnection.signer!).drip();\n }\n}\n\nexport class SDK extends BlockchainEntity {\n constructor() {\n super();\n }\n public read(networkConnection: NetworkConnection): SdkRead {\n return new SdkRead(networkConnection);\n }\n\n public readWrite(networkConnection: NetworkConnection): SdkReadWrite {\n return new SdkReadWrite(networkConnection);\n }\n}\n","import { Token } from './token';\nimport { TokenAmount } from './tokenAmount';\nimport { UserMarketDetails } from './types';\n\nexport const dummyToken = new Token(\n '0xb97ef9ef8734c71904d8002f8b6bc66dd9c48a6e',\n 6\n);\n\nexport const dummyPly = new Token(\n '0x8729438eb15e2c8b576fcc6aecda6a148776c0f5',\n 18\n);\n\nexport const dummyPlyAurora = new Token(\n '0xE530dC2095Ef5653205CF5ea79F8979a7028065c',\n 18\n);\n\nexport const dummyTokenAmount = new TokenAmount(dummyToken, '123.456', false);\n\nexport const dummyZeroTokenAmount = new TokenAmount(dummyToken, '0');\n\nexport const dummyTokenAmount2 = new TokenAmount(dummyToken, '456.123', false);\n\nexport const dummyTokenAmount3 = new TokenAmount(dummyToken, '1000.123', false);\n\nexport const dummyMarketAddress = '0xbeb5d47a3f720ec0a390d04b4d41ed7d9688bc7f'; // qiUSDC\n\nexport const dummyUserMarketDetails: UserMarketDetails = {\n market: dummyMarketAddress,\n depositBalance: dummyTokenAmount2,\n borrowBalance: dummyZeroTokenAmount,\n isCollateral: true,\n maxWithdrawableAmount: dummyTokenAmount,\n collateralRatio: 0.5,\n underlyingPrice: '1',\n};\n","import { BlockchainEntityRead } from './BlockchainEntity';\nimport { NetworkConnection } from './types';\nimport { AuToken } from '@aurigami/contracts/typechain';\nimport AuTokenABI from '@aurigami/contracts/artifacts/contracts/AuToken.sol/AuToken.json';\nimport { BigNumber as BN, Contract } from 'ethers';\n\ntype SimpleTransfer = {\n from: string;\n to: string;\n amount: BN;\n blockNumber: number;\n};\n\nexport class TransferEventQuery extends BlockchainEntityRead {\n auToken: AuToken;\n\n constructor(tokenAddr: string, networkConnection: NetworkConnection) {\n super(networkConnection);\n this.auToken = new Contract(\n tokenAddr,\n AuTokenABI.abi,\n this._networkConnection.provider\n ) as AuToken;\n }\n\n /**\n * query ERC20 transfers from/to an address & auto convert them into SimpleTransfer.\n * The result will be sorted by blocknumber.\n */\n async queryERC20TransfersOf(\n address: string,\n fromBlock: number,\n toBlock: number\n ): Promise<SimpleTransfer[]> {\n const filters = [\n this.auToken.filters.Transfer(address, null),\n this.auToken.filters.Transfer(null, address),\n ];\n\n const events = (\n await Promise.all(\n filters.map((filter) =>\n this.auToken.queryFilter(filter, fromBlock, toBlock)\n )\n )\n ).flat();\n\n let results: SimpleTransfer[] = events.map((event) => {\n return {\n from: event.args![0],\n to: event.args![1],\n amount: event.args![2],\n blockNumber: event.blockNumber,\n };\n });\n\n results.sort((a, b) => a.blockNumber - b.blockNumber);\n\n return results;\n }\n\n /**\n * Get the balance of an address at a given block number.\n *\n * Note that this will return the balance after the block get mined.\n */\n async queryERC20BalanceAt(address: string, endBlock: number): Promise<BN> {\n return this.auToken.balanceOf(address, { blockTag: endBlock + 1 });\n }\n}\n","import { Provider } from '@ethersproject/abstract-provider';\nimport { TransactionResponse } from '@ethersproject/abstract-provider';\nimport { BlockchainEntity, BlockchainEntityRead } from './BlockchainEntity';\nimport { Address, NetworkConnection } from './types';\nimport { BigNumber as BN, Contract, utils } from 'ethers';\nimport { TransferEventQuery } from './transfer-event-query';\nimport {\n AIRDROP_START_TIMESTAMP,\n AIRDROP_KEEP_THRESHOLD,\n AIRDROP_END_TIMESTAMP,\n networkAddresses,\n} from './constants';\nimport AuriAirdropABI from '@aurigami/contracts/artifacts/contracts/AuriAirdrop.sol/AuriAirdrop.json';\nimport {\n getBlockBeforeTimestamp,\n getCurrentTimestamp,\n getDecimal,\n isSameAddress,\n} from './helpers';\nimport AIRDROP_AUTOKEN_INFO from './airdrop_misc/auTokensInfo.json';\nimport AIRDROP_WHITELIST_ADDRESSES from './airdrop_misc/whitelist.json';\nimport { AuriAirdrop } from '@aurigami/contracts/typechain';\nimport assert from 'assert';\nimport { TokenAmount } from './tokenAmount';\nimport { Token } from './token';\n\ntype AirdropUnderlyingInfo = {\n minDeposit: BN;\n};\n\ntype AirdropAuTokenInfo = {\n address: string;\n exchangeRate: BN;\n deploymentBlock: number;\n underlying: AirdropUnderlyingInfo;\n};\n\nclass AirdropSettings {\n private static _instance: AirdropSettings;\n\n airdropStartBlock: number = 0;\n airdropEndBlock: number = 0;\n airdropStartTimestamp: number = AIRDROP_START_TIMESTAMP;\n airdropEndTimestamp: number = AIRDROP_END_TIMESTAMP;\n airdropThreshold: number = AIRDROP_KEEP_THRESHOLD;\n private constructor() {}\n\n public static async getSettings(\n provider: Provider\n ): Promise<AirdropSettings> {\n if (this._instance) return this._instance;\n\n let settings: AirdropSettings = new AirdropSettings();\n\n settings.airdropStartBlock = await getBlockBeforeTimestamp(\n provider,\n settings.airdropStartTimestamp\n );\n\n settings.airdropEndBlock = await getBlockBeforeTimestamp(\n provider,\n settings.airdropEndTimestamp\n );\n\n this._instance = settings;\n return settings;\n }\n}\n\nclass AirdropAuTokenKeepTracker extends BlockchainEntityRead {\n private _transferQuery: TransferEventQuery;\n private _airdropAuTokenInfo: AirdropAuTokenInfo;\n public constructor(\n networkConnection: NetworkConnection,\n airdropAuTokenInfo: AirdropAuTokenInfo\n ) {\n super(networkConnection);\n this._transferQuery = new TransferEventQuery(\n airdropAuTokenInfo.address,\n networkConnection\n );\n this._airdropAuTokenInfo = airdropAuTokenInfo;\n\n // exchangeRate = 102% * exchangeRate, see why in the comment of _toUnderlyingValue\n this._airdropAuTokenInfo.exchangeRate =\n this._airdropAuTokenInfo.exchangeRate.add(\n this._airdropAuTokenInfo.exchangeRate.div(50)\n );\n }\n\n /**\n * Convert the given amount of auToken to the underlying value with the stored exchange rate\n *\n * Why we need to do this?\n *\n * By transfer event, we cannot know the exact underlying, the only\n * info that we can keep track of via transfer is event is the auToken amount. So we need to\n * convert it to the underlying value with the stored exchange rate.\n *\n * However, we cannot just simply use auTokenAmount * exchangeRate, because the exchange rate\n * is changing over time. As advice of the contract team, use fixed exchangeRate * 102% is good enough.\n *\n */\n private _toUnderlyingValue(auTokenAmount: BN): BN {\n return auTokenAmount\n .mul(this._airdropAuTokenInfo.exchangeRate)\n .div(BN.from(10).pow(18));\n }\n\n /**\n * Check if the user has been deposit at least (minDeposit) and keep it for\n * more than AIRDROP_KEEP_THRESHOLD milliseconds\n *\n * How it works:\n * Whenever the user balance is exceed minDeposit, we will record the timestamp,\n * and when the balance is below minDeposit, we will compare with the saved timestamp to see\n * whether it has been keep for more than AIRDROP_KEEP_THRESHOLD milliseconds.\n *\n */\n public async isEligible(address: string): Promise<boolean> {\n const settings = await AirdropSettings.getSettings(\n this._networkConnection.provider\n );\n const minDeposit = this._airdropAuTokenInfo.underlying.minDeposit;\n\n // Get user balance at the time of Airdrop start\n let balance = await this._transferQuery.queryERC20BalanceAt(\n address,\n settings.airdropStartBlock - 1\n );\n\n const [BELOW, ABOVE] = [false, true];\n let flag = BELOW;\n // variable to store the last timestamp that, from it to \"current\" timestamp,\n // the balance is always above minDeposit\n let lastEligibleBalanceTimestamp = 0;\n\n if (this._toUnderlyingValue(balance).gte(minDeposit)) {\n lastEligibleBalanceTimestamp = settings.airdropStartTimestamp;\n flag = ABOVE;\n }\n\n let events = await this._transferQuery.queryERC20TransfersOf(\n address,\n settings.airdropStartBlock,\n settings.airdropEndBlock\n );\n\n for (let { from, to, amount, blockNumber } of events) {\n if (isSameAddress(from, address)) {\n balance = balance.sub(amount);\n }\n if (isSameAddress(to, address)) {\n balance = balance.add(amount);\n }\n\n // if it is different from the flag, that means the balance is changing\n if (this._toUnderlyingValue(balance).gte(minDeposit) != flag) {\n flag = !flag;\n const timestamp = (\n await this._networkConnection.provider.getBlock(blockNumber)\n ).timestamp;\n\n // if this txn make the balance below the minDeposit,\n // check whether it has been keep for more than AIRDROP_KEEP_THRESHOLD\n if (flag == BELOW) {\n if (\n timestamp - lastEligibleBalanceTimestamp >=\n settings.airdropThreshold\n ) {\n return true;\n }\n lastEligibleBalanceTimestamp = 0;\n } else {\n // record the timestamp when the balance is above minDeposit\n lastEligibleBalanceTimestamp = timestamp;\n }\n }\n }\n\n // if after the last txn, the balance is still above minDeposit,\n // we should check from the last timestamp to \"now\"\n if (flag == ABOVE) {\n const timestamp = Math.min(\n settings.airdropEndTimestamp,\n getCurrentTimestamp()\n );\n return (\n timestamp - lastEligibleBalanceTimestamp >= settings.airdropThreshold\n );\n }\n\n return false;\n }\n}\n\nexport class AirdropRead extends BlockchainEntityRead {\n protected _airDrop: AuriAirdrop;\n private _whitelistedAddresses: Set<string>;\n private keepTrackers: AirdropAuTokenKeepTracker[] = [];\n public constructor(networkConnection: NetworkConnection) {\n super(networkConnection);\n this._airDrop = new Contract(\n networkAddresses.misc.AURI_AIRDROP,\n AuriAirdropABI.abi,\n networkConnection.provider\n ) as AuriAirdrop;\n\n this._whitelistedAddresses = new Set(\n (AIRDROP_WHITELIST_ADDRESSES as string[]).map((e) =>\n e.toLocaleLowerCase()\n )\n );\n\n let auTokens: any = AIRDROP_AUTOKEN_INFO;\n\n for (let auToken in auTokens) {\n let { address, exchangeRate, deploymentBlock, underlying } =\n auTokens[auToken];\n\n let airdropInfo: AirdropAuTokenInfo = {\n address: address,\n exchangeRate: BN.from(exchangeRate),\n deploymentBlock: parseInt(deploymentBlock),\n underlying: {\n minDeposit: BN.from(underlying.minDeposit),\n },\n };\n\n this.keepTrackers.push(\n new AirdropAuTokenKeepTracker(networkConnection, airdropInfo)\n );\n }\n }\n\n public countWhitelistedAddresses(): number {\n return this._whitelistedAddresses.size;\n }\n\n public isWhitelisted(user: string): boolean {\n return this._whitelistedAddresses.has(user.toLocaleLowerCase());\n }\n\n public async hasCompletedChallenge(user: string): Promise<boolean> {\n const settings = await AirdropSettings.getSettings(\n this._networkConnection.provider\n );\n\n if (getCurrentTimestamp() < settings.airdropStartTimestamp) {\n return false;\n }\n\n if (!this.isWhitelisted(user)) {\n return false;\n }\n\n // iterate for all the market and check if the user has completed the challenge\n return (\n await Promise.all(\n this.keepTrackers.map(async (keepTracker) => {\n return keepTracker.isEligible(user);\n })\n )\n ).includes(true);\n }\n\n /**\n * Get redeemable rewards amount of user\n */\n public async getRedeemableReward(\n campaign: string,\n token: Address,\n user: Address\n ): Promise<TokenAmount> {\n let tokenInstance: Token = new Token(token, getDecimal(token));\n\n let rewards: BN = await this._airDrop.getRedeemableReward(\n utils.formatBytes32String(campaign),\n token,\n user\n );\n\n return new TokenAmount(tokenInstance, rewards.toString());\n }\n}\n\nexport class AirdropReadWrite extends AirdropRead {\n /**\n * Transfer rewards from multiple campaigns to msg.sender\n */\n public async redeemMultiple(\n campaigns: string[],\n tokens: Address[]\n ): Promise<TransactionResponse> {\n assert(\n campaigns.length == tokens.length,\n 'campaigns and tokens must have the same length'\n );\n return this._airDrop.connect(this._networkConnection.signer!).redeem(\n campaigns.map((e) => utils.formatBytes32String(e)),\n tokens,\n await this._networkConnection.signer!.getAddress()\n );\n }\n\n /**\n * Redeem reward from a single campaign\n */\n public async redeemSingle(\n campaign: string,\n token: Address\n ): Promise<TransactionResponse> {\n return this.redeemMultiple([campaign], [token]);\n }\n}\n\nexport class Airdrop extends BlockchainEntity {\n constructor() {\n super();\n }\n public read(networkConnection: NetworkConnection): AirdropRead {\n return new AirdropRead(networkConnection);\n }\n public readWrite(networkConnection: NetworkConnection): AirdropReadWrite {\n return new AirdropReadWrite(networkConnection);\n }\n}\n","import BigNumber from 'bignumber.js';\nimport { ethers } from 'ethers';\nimport { Logger } from 'ethers/lib/utils';\n\nethers.utils.Logger.setLogLevel(Logger.levels.ERROR);\nBigNumber.config({ DECIMAL_PLACES: 50 });\n\nexport * from './SDK';\nexport * from './MoneyMarket';\nexport * from './BlockchainEntity';\nexport * from './helpers';\nexport * from './constants';\nexport * from './dummy';\nexport * from './priceFetcher';\nexport * from './token';\nexport * from './tokenAmount';\nexport * from './types';\nexport * from './airdrop-lottery';\nexport * from './transfer-event-query';\nexport * from './Papermill';\n"],"names":["undefined","BlockchainEntityRead","networkConnection","_networkConnection","BlockchainEntityReadWrite","signer","Signer","Error","BlockchainEntity","read","readWrite","dummyAddress","ETHAddress","AURORA_CHAINID","DECIMAL_PRECISION","networkAddresses","auTokens","name","address","toLowerCase","underlying","misc","COMPTROLLER","oracle","AURIFAIRLAUNCH","AURILENS","TOKENLOCK","ETHREPAYHELPER","AURI_AIRDROP","tokens","AURORA","PLY","stNEAR","USDC","WNEAR","TRI","META","toLocaleLowerCase","PULP","PLYWNEAR","PRICE_WHITELISTED","Set","map","t","REWARD_CLAIM_START","BORROW_LIMIT_BUFFER","BigNumber","ONE_DAY","ONE_WEEK","ONE_YEAR","PLYWNEAR_POOL_ID","PLYWNEAR_REWARD_TOKENS","ALL_STAKING_POOLS","INF","BN","from","pow","sub","AIRDROP_START_TIMESTAMP","AIRDROP_END_TIMESTAMP","AIRDROP_KEEP_THRESHOLD","DEPOSIT_NEAR_REWARDS_PER_WEEK","Object","fromEntries","entries","k","v","BORROW_NEAR_REWARDS_PER_WEEK","AURORA_API_BASE_URL","getQuery","module","action","params","axios","get","URLSearchParams","headers","resp","data","result","decimalRecords","formatObject","object","JSON","stringify","decimalFactor","decimal","toString","isSameAddress","address1","address2","getCurrentTimestamp","Math","trunc","Date","now","validateAndParseAddress","utils","getAddress","error","getDecimal","addressLowercase","assert","calcLMRewardApr","rewardsValue","totalStakeValue","frequencyPerYear","lte","multipliedBy","dividedBy","getBlockTimestamp","provider","blockNumber","getBlock","block","timestamp","getBlockBeforeTimestamp","getAuroraAPIQuery","closest","parseInt","getBlockNumber","ComptrollerRewardType","MarketAction","Token","decimals","PLYToken","PLYWNEARToken","TokenAmount","token","amount","isRaw","rawAmnt","times","toFixed","formattedAmount","div","rawAmount","fromAddressAndAmount","tokenAddress","fetchPriceFromCoingeckoAPI","id","then","res","price","usd","fetchPriceFromCoingecko","fetchLPPositions","LPAddress","LPContract","Contract","IUniswapV2PairABI","abi","promises","push","token0","token1","getReserves","totalSupply","Promise","all","values","reserve0","reserve1","fetchLPPrice","fetchLPPriceBy","tokenReverse","reserve","isZero","_fetchPrice","tokenPrice","tokenDecimal","reserveUSD","LPDecimal","LPInfo","processPriceFromOracle","rawPrice","underlyingDecimal","fetchPriceFromOracle","auTokenAddress","oracleContract","OracleABI","getUnderlyingPrice","fetchUnderlyingTokensPrices","auriLens","AuriLensABI","auTokenAddresses","auToken","underlyingDecimals","auTokenUnderlyingPriceAll","rawPrices","ind","underlyingPrice","fetchStNEARPrice","ratioPromise","nearPricePromise","ratioRes","nearPrice","ratio","st_near_price","shouldFetchFromCoingecko","has","matchingAuToken","find","fetchPrice","fetchPLYPrice","fetchToken0PriceByLP","LP","token0Decimal","token1Decimal","fetchValuation","tokenAmount","calcValuation","valuateToken","tokenValuation","currencyAmount","currency","MoneyMarketRead","underlyingAsset","AuETHABI","AuErc20ABI","_comptroller","ComptrollerABI","_auriLens","getRewardSpeeds","speeds","getTotalTokenBorrowed","totalBorrows","getTotalTokenDeposited","totalBorrow","getCash","totalCash","add","getDepositAPY","supplyRatePerTimestamp","getBorrowAPY","borrowRatePerTimestamp","getCollateralRatio","markets","collateralFactorMantissa","getBorrowPlyAPY","totalBorrowed","rewardSpeeds","rewardSpeed","plyPrice","getDepositPlyAPY","totalDeposited","getDetails","depositAPY","toNumber","borrowAPY","collateralRatio","borrowPlyApy","plyRewardBorrowSpeed","depositPlyApy","plyRewardSupplySpeed","getDepositNEARRewardPerWeek","depositNEARApy","getBorrowNEARRewardPerWeek","borrowNEARApy","depositMETAApy","totalTokenDeposited","totalTokenBorrowed","depositApy","borrowApy","depositPlyPerWeek","mul","borrowPlyPerWeek","getUserBorrowBalance","userAddress","callStatic","borrowBalanceCurrent","getUserDepositBalance","balanceOfUnderlying","totalDeposit","NEARToken","rewardStartTime","rewardStopTime","currentTime","reward","MoneyMarketReadWrite","_EthRepayHelper","EthRepayHelperABI","deposit","connect","mint","value","borrow","withdraw","lt","redeemUnderlying","repay","repayBorrow","enableCollateral","enterMarkets","disableCollateral","exitMarket","MoneyMarket","LOCKING_DENOMINATOR","PapermillRead","plyAddress","pulpAddress","plyToken","pulpToken","_auriFairLaunch","AuriFairLaunchABI","_ply","EIP20InterfaceABI","_pulp","PulpABI","getPlyBalance","balanceOf","plyBalance","getPulpBalance","pulpBalance","getUnclaimedPlyReward","claimRewards","rewardBalancesMetadata","plyAccrured","getWeek","getLockingDetails","currentWeek","getPercentLock","percentLockCurrentWeek","percentLockNextWeek","totalRewards","calcLockAmount","pulpAmountCurrentWeek","plyAmountCurrentWeek","plyAmountNextWeek","pulpAmountNextWeek","currentUnlockPortion","nextUnlockPortion","vestingStart","accruedPly","currentPly","currentPulp","nextPly","nextPulp","getTimestampToUnlock","targetUnlockPortion","getWeekToUnlock","weekId","getUnlockPortionAt","lockPortion","unlockPortion","PapermillReadWrite","redeem","recipient","selfRedeem","msgSender","Papermill","StakingRead","getPLYWNEARPoolDetails","getPoolInfo","stakedLiquidity","totalStake","rewardPerSeconds","stakedLiquidityAmount","totalStakeValuation","i","length","rewardTokenAddress","rewardToken","rewardPerSecond","APYs","forEach","rewardPerSecondValuation","apy","totalStakedLiquidity","stakeBalanceOf","user","getUserInfo","userInfo","stakeAmount","LpBalanceOf","lpContract","balance","unclaimedRewardsOf","updateAndGetUserInfo","rewards","unclaimedRewards","StakingReadWrite","stake","unstake","SdkRead","_stakingRead","getUserDetails","marketCount","userMarketDetails","totalBorrowLimit","pricePromises","userMarketDetail","market","moneyMarket","depositBalance","borrowBalance","getAssetsIn","assetsIn","underlyingPrices","depositValues","auAddress","isCollateral","reduce","p","index","plus","getAccountLiquidity","accountLiquidity","borrowedvaluation","minus","bufferedBorrowLimit","minimumBorrowLimitAllowed","borrowableAmount","borrowLimitMargin","gt","maxWithdrawCap","maxWithdrawableAmount","borrowLimit","userLockingDetails","getTokenPrice","calcHypotheticalStats","currentBorrowLimit","currentBorrowValuation","newBorrowLimit","newBorrowValuation","EnableCollateral","DisableCollateral","deltaBorrowLimit","Deposit","Withdraw","Borrow","Repay","deltaBorrowValuation","newBorrowUtilization","eq","SdkReadWrite","claim","faucetDrip","faucet","FAUCET","FaucetABI","drip","SDK","dummyToken","dummyPly","dummyPlyAurora","dummyTokenAmount","dummyZeroTokenAmount","dummyTokenAmount2","dummyTokenAmount3","dummyMarketAddress","dummyUserMarketDetails","TransferEventQuery","tokenAddr","AuTokenABI","queryERC20TransfersOf","fromBlock","toBlock","filters","Transfer","filter","queryFilter","events","flat","results","event","args","to","sort","a","b","queryERC20BalanceAt","endBlock","blockTag","AirdropSettings","getSettings","_instance","settings","airdropStartTimestamp","airdropStartBlock","airdropEndTimestamp","airdropEndBlock","AirdropAuTokenKeepTracker","airdropAuTokenInfo","_transferQuery","_airdropAuTokenInfo","exchangeRate","_toUnderlyingValue","auTokenAmount","isEligible","minDeposit","BELOW","ABOVE","flag","lastEligibleBalanceTimestamp","gte","airdropThreshold","min","AirdropRead","_airDrop","AuriAirdropABI","_whitelistedAddresses","AIRDROP_WHITELIST_ADDRESSES","e","AIRDROP_AUTOKEN_INFO","deploymentBlock","airdropInfo","keepTrackers","countWhitelistedAddresses","size","isWhitelisted","hasCompletedChallenge","keepTracker","includes","getRedeemableReward","campaign","tokenInstance","formatBytes32String","AirdropReadWrite","redeemMultiple","campaigns","redeemSingle","Airdrop","ethers","Logger","setLogLevel","levels","ERROR","config","DECIMAL_PLACES"],"mappings":"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;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;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"}
|