From 06dc6c1274e07e2931afd1d3614a031a05d92dc9 Mon Sep 17 00:00:00 2001 From: jeff Date: Sat, 9 Jan 2021 12:57:13 +0000 Subject: [PATCH] Move typescript into source tree. --- package.json | 4 +- .../frontend}/_proto/cofd_api_pb.d.ts | 0 .../frontend}/_proto/cofd_api_pb.js | 0 .../frontend}/_proto/cofd_api_pb_service.d.ts | 0 .../frontend}/_proto/cofd_api_pb_service.js | 0 .../frontend}/_proto/cofd_pb.d.ts | 0 .../frontend}/_proto/cofd_pb.js | 0 .../frontend}/_proto/cofd_pb_service.d.ts | 0 .../frontend}/_proto/cofd_pb_service.js | 0 .../src => src/frontend/scripts}/api.ts | 0 .../frontend/scripts}/characters/edit.ts | 0 src/{ => frontend}/templates/base.html.tera | 0 .../characters/edit_character.html.tera | 0 .../edit_character_macros.html.tera | 0 .../characters/new_character.html.tera | 0 .../characters/view_character.html.tera | 0 .../view_character_macros.html.tera | 0 src/{ => frontend}/templates/error.html.tera | 0 src/{ => frontend}/templates/index.html.tera | 0 src/{ => frontend}/templates/login.html.tera | 0 .../templates/registration.html.tera | 0 .../build/_proto_cofd_api_pb_js.bundle.js | 4825 ----------------- static/scripts/build/blah.bundle.js | 23 - static/scripts/build/index.bundle.js | 21 - static/scripts/build/runtime.bundle.js | 146 - ...ogle-protobuf_google-protobuf_js.bundle.js | 537 -- static/scripts/webpack.config.js | 63 - static/scripts/tsconfig.json => tsconfig.json | 0 webpack.config.js | 64 + 29 files changed, 66 insertions(+), 5617 deletions(-) rename {static/scripts => src/frontend}/_proto/cofd_api_pb.d.ts (100%) rename {static/scripts => src/frontend}/_proto/cofd_api_pb.js (100%) rename {static/scripts => src/frontend}/_proto/cofd_api_pb_service.d.ts (100%) rename {static/scripts => src/frontend}/_proto/cofd_api_pb_service.js (100%) rename {static/scripts => src/frontend}/_proto/cofd_pb.d.ts (100%) rename {static/scripts => src/frontend}/_proto/cofd_pb.js (100%) rename {static/scripts => src/frontend}/_proto/cofd_pb_service.d.ts (100%) rename {static/scripts => src/frontend}/_proto/cofd_pb_service.js (100%) rename {static/scripts/src => src/frontend/scripts}/api.ts (100%) rename {static/scripts/src => src/frontend/scripts}/characters/edit.ts (100%) rename src/{ => frontend}/templates/base.html.tera (100%) rename src/{ => frontend}/templates/characters/edit_character.html.tera (100%) rename src/{ => frontend}/templates/characters/edit_character_macros.html.tera (100%) rename src/{ => frontend}/templates/characters/new_character.html.tera (100%) rename src/{ => frontend}/templates/characters/view_character.html.tera (100%) rename src/{ => frontend}/templates/characters/view_character_macros.html.tera (100%) rename src/{ => frontend}/templates/error.html.tera (100%) rename src/{ => frontend}/templates/index.html.tera (100%) rename src/{ => frontend}/templates/login.html.tera (100%) rename src/{ => frontend}/templates/registration.html.tera (100%) delete mode 100644 static/scripts/build/_proto_cofd_api_pb_js.bundle.js delete mode 100644 static/scripts/build/blah.bundle.js delete mode 100644 static/scripts/build/index.bundle.js delete mode 100644 static/scripts/build/runtime.bundle.js delete mode 100644 static/scripts/build/vendors-node_modules_google-protobuf_google-protobuf_js.bundle.js delete mode 100644 static/scripts/webpack.config.js rename static/scripts/tsconfig.json => tsconfig.json (100%) create mode 100644 webpack.config.js diff --git a/package.json b/package.json index a3bd54c..1e58c75 100644 --- a/package.json +++ b/package.json @@ -6,8 +6,8 @@ "scripts": { "test": "echo \"Error: no test specified\" && exit 1", "webpack-dev": "cd static/scripts && webpack serve --watch --inline --port 8081 --host 0.0.0.0 --output-path=./build", - "build:protobuf": "mkdir -p static/scripts/_proto && protoc --plugin=protoc-gen-ts=./node_modules/.bin/protoc-gen-ts -I ./proto --js_out=import_style=commonjs,binary:./static/scripts/_proto --ts_out=service=grpc-web:./static/scripts/_proto ./proto/*.proto", - "build:webpack": "cd static/scripts && webpack" + "build:protobuf": "mkdir -p src/frontend/_proto && protoc --plugin=protoc-gen-ts=./node_modules/.bin/protoc-gen-ts -I ./proto --js_out=import_style=commonjs,binary:./src/frontend/_proto --ts_out=service=grpc-web:./src/frontend/_proto ./proto/*.proto", + "build:webpack": "webpack" }, "repository": { "type": "git", diff --git a/static/scripts/_proto/cofd_api_pb.d.ts b/src/frontend/_proto/cofd_api_pb.d.ts similarity index 100% rename from static/scripts/_proto/cofd_api_pb.d.ts rename to src/frontend/_proto/cofd_api_pb.d.ts diff --git a/static/scripts/_proto/cofd_api_pb.js b/src/frontend/_proto/cofd_api_pb.js similarity index 100% rename from static/scripts/_proto/cofd_api_pb.js rename to src/frontend/_proto/cofd_api_pb.js diff --git a/static/scripts/_proto/cofd_api_pb_service.d.ts b/src/frontend/_proto/cofd_api_pb_service.d.ts similarity index 100% rename from static/scripts/_proto/cofd_api_pb_service.d.ts rename to src/frontend/_proto/cofd_api_pb_service.d.ts diff --git a/static/scripts/_proto/cofd_api_pb_service.js b/src/frontend/_proto/cofd_api_pb_service.js similarity index 100% rename from static/scripts/_proto/cofd_api_pb_service.js rename to src/frontend/_proto/cofd_api_pb_service.js diff --git a/static/scripts/_proto/cofd_pb.d.ts b/src/frontend/_proto/cofd_pb.d.ts similarity index 100% rename from static/scripts/_proto/cofd_pb.d.ts rename to src/frontend/_proto/cofd_pb.d.ts diff --git a/static/scripts/_proto/cofd_pb.js b/src/frontend/_proto/cofd_pb.js similarity index 100% rename from static/scripts/_proto/cofd_pb.js rename to src/frontend/_proto/cofd_pb.js diff --git a/static/scripts/_proto/cofd_pb_service.d.ts b/src/frontend/_proto/cofd_pb_service.d.ts similarity index 100% rename from static/scripts/_proto/cofd_pb_service.d.ts rename to src/frontend/_proto/cofd_pb_service.d.ts diff --git a/static/scripts/_proto/cofd_pb_service.js b/src/frontend/_proto/cofd_pb_service.js similarity index 100% rename from static/scripts/_proto/cofd_pb_service.js rename to src/frontend/_proto/cofd_pb_service.js diff --git a/static/scripts/src/api.ts b/src/frontend/scripts/api.ts similarity index 100% rename from static/scripts/src/api.ts rename to src/frontend/scripts/api.ts diff --git a/static/scripts/src/characters/edit.ts b/src/frontend/scripts/characters/edit.ts similarity index 100% rename from static/scripts/src/characters/edit.ts rename to src/frontend/scripts/characters/edit.ts diff --git a/src/templates/base.html.tera b/src/frontend/templates/base.html.tera similarity index 100% rename from src/templates/base.html.tera rename to src/frontend/templates/base.html.tera diff --git a/src/templates/characters/edit_character.html.tera b/src/frontend/templates/characters/edit_character.html.tera similarity index 100% rename from src/templates/characters/edit_character.html.tera rename to src/frontend/templates/characters/edit_character.html.tera diff --git a/src/templates/characters/edit_character_macros.html.tera b/src/frontend/templates/characters/edit_character_macros.html.tera similarity index 100% rename from src/templates/characters/edit_character_macros.html.tera rename to src/frontend/templates/characters/edit_character_macros.html.tera diff --git a/src/templates/characters/new_character.html.tera b/src/frontend/templates/characters/new_character.html.tera similarity index 100% rename from src/templates/characters/new_character.html.tera rename to src/frontend/templates/characters/new_character.html.tera diff --git a/src/templates/characters/view_character.html.tera b/src/frontend/templates/characters/view_character.html.tera similarity index 100% rename from src/templates/characters/view_character.html.tera rename to src/frontend/templates/characters/view_character.html.tera diff --git a/src/templates/characters/view_character_macros.html.tera b/src/frontend/templates/characters/view_character_macros.html.tera similarity index 100% rename from src/templates/characters/view_character_macros.html.tera rename to src/frontend/templates/characters/view_character_macros.html.tera diff --git a/src/templates/error.html.tera b/src/frontend/templates/error.html.tera similarity index 100% rename from src/templates/error.html.tera rename to src/frontend/templates/error.html.tera diff --git a/src/templates/index.html.tera b/src/frontend/templates/index.html.tera similarity index 100% rename from src/templates/index.html.tera rename to src/frontend/templates/index.html.tera diff --git a/src/templates/login.html.tera b/src/frontend/templates/login.html.tera similarity index 100% rename from src/templates/login.html.tera rename to src/frontend/templates/login.html.tera diff --git a/src/templates/registration.html.tera b/src/frontend/templates/registration.html.tera similarity index 100% rename from src/templates/registration.html.tera rename to src/frontend/templates/registration.html.tera diff --git a/static/scripts/build/_proto_cofd_api_pb_js.bundle.js b/static/scripts/build/_proto_cofd_api_pb_js.bundle.js deleted file mode 100644 index 3712473..0000000 --- a/static/scripts/build/_proto_cofd_api_pb_js.bundle.js +++ /dev/null @@ -1,4825 +0,0 @@ -(self["webpackChunk"] = self["webpackChunk"] || []).push([["_proto_cofd_api_pb_js"],{ - -/***/ "./_proto/cofd_api_pb.js": -/*!*******************************!*\ - !*** ./_proto/cofd_api_pb.js ***! - \*******************************/ -/***/ ((__unused_webpack_module, exports, __webpack_require__) => { - -// source: cofd_api.proto -/** - * @fileoverview - * @enhanceable - * @suppress {messageConventions} JS Compiler reports an error if a variable or - * field starts with 'MSG_' and isn't a translatable message. - * @public - */ -// GENERATED CODE -- DO NOT EDIT! -/* eslint-disable */ -// @ts-nocheck - -var jspb = __webpack_require__(/*! google-protobuf */ "../../node_modules/google-protobuf/google-protobuf.js"); -var goog = jspb; -var global = Function('return this')(); - -var cofd_pb = __webpack_require__(/*! ./cofd_pb.js */ "./_proto/cofd_pb.js"); -goog.object.extend(proto, cofd_pb); -goog.exportSymbol('proto.models.proto.cofd.api.Attributes', null, global); -goog.exportSymbol('proto.models.proto.cofd.api.BasicInfo', null, global); -goog.exportSymbol('proto.models.proto.cofd.api.Condition', null, global); -goog.exportSymbol('proto.models.proto.cofd.api.SkillSpecializationsUpdate', null, global); -goog.exportSymbol('proto.models.proto.cofd.api.SkillUpdate', null, global); -goog.exportSymbol('proto.models.proto.cofd.api.Skills', null, global); -goog.exportSymbol('proto.models.proto.cofd.api.UpdateAttributeRequest', null, global); -goog.exportSymbol('proto.models.proto.cofd.api.UpdateSkillValueRequest', null, global); -/** - * Generated by JsPbCodeGenerator. - * @param {Array=} opt_data Optional initial data array, typically from a - * server response, or constructed directly in Javascript. The array is used - * in place and becomes part of the constructed object. It is not cloned. - * If no data is provided, the constructed object will be empty, but still - * valid. - * @extends {jspb.Message} - * @constructor - */ -proto.models.proto.cofd.api.BasicInfo = function(opt_data) { - jspb.Message.initialize(this, opt_data, 0, -1, null, null); -}; -goog.inherits(proto.models.proto.cofd.api.BasicInfo, jspb.Message); -if (goog.DEBUG && !COMPILED) { - /** - * @public - * @override - */ - proto.models.proto.cofd.api.BasicInfo.displayName = 'proto.models.proto.cofd.api.BasicInfo'; -} -/** - * Generated by JsPbCodeGenerator. - * @param {Array=} opt_data Optional initial data array, typically from a - * server response, or constructed directly in Javascript. The array is used - * in place and becomes part of the constructed object. It is not cloned. - * If no data is provided, the constructed object will be empty, but still - * valid. - * @extends {jspb.Message} - * @constructor - */ -proto.models.proto.cofd.api.Attributes = function(opt_data) { - jspb.Message.initialize(this, opt_data, 0, -1, null, null); -}; -goog.inherits(proto.models.proto.cofd.api.Attributes, jspb.Message); -if (goog.DEBUG && !COMPILED) { - /** - * @public - * @override - */ - proto.models.proto.cofd.api.Attributes.displayName = 'proto.models.proto.cofd.api.Attributes'; -} -/** - * Generated by JsPbCodeGenerator. - * @param {Array=} opt_data Optional initial data array, typically from a - * server response, or constructed directly in Javascript. The array is used - * in place and becomes part of the constructed object. It is not cloned. - * If no data is provided, the constructed object will be empty, but still - * valid. - * @extends {jspb.Message} - * @constructor - */ -proto.models.proto.cofd.api.UpdateAttributeRequest = function(opt_data) { - jspb.Message.initialize(this, opt_data, 0, -1, null, null); -}; -goog.inherits(proto.models.proto.cofd.api.UpdateAttributeRequest, jspb.Message); -if (goog.DEBUG && !COMPILED) { - /** - * @public - * @override - */ - proto.models.proto.cofd.api.UpdateAttributeRequest.displayName = 'proto.models.proto.cofd.api.UpdateAttributeRequest'; -} -/** - * Generated by JsPbCodeGenerator. - * @param {Array=} opt_data Optional initial data array, typically from a - * server response, or constructed directly in Javascript. The array is used - * in place and becomes part of the constructed object. It is not cloned. - * If no data is provided, the constructed object will be empty, but still - * valid. - * @extends {jspb.Message} - * @constructor - */ -proto.models.proto.cofd.api.Skills = function(opt_data) { - jspb.Message.initialize(this, opt_data, 0, -1, proto.models.proto.cofd.api.Skills.repeatedFields_, null); -}; -goog.inherits(proto.models.proto.cofd.api.Skills, jspb.Message); -if (goog.DEBUG && !COMPILED) { - /** - * @public - * @override - */ - proto.models.proto.cofd.api.Skills.displayName = 'proto.models.proto.cofd.api.Skills'; -} -/** - * Generated by JsPbCodeGenerator. - * @param {Array=} opt_data Optional initial data array, typically from a - * server response, or constructed directly in Javascript. The array is used - * in place and becomes part of the constructed object. It is not cloned. - * If no data is provided, the constructed object will be empty, but still - * valid. - * @extends {jspb.Message} - * @constructor - */ -proto.models.proto.cofd.api.SkillUpdate = function(opt_data) { - jspb.Message.initialize(this, opt_data, 0, -1, null, null); -}; -goog.inherits(proto.models.proto.cofd.api.SkillUpdate, jspb.Message); -if (goog.DEBUG && !COMPILED) { - /** - * @public - * @override - */ - proto.models.proto.cofd.api.SkillUpdate.displayName = 'proto.models.proto.cofd.api.SkillUpdate'; -} -/** - * Generated by JsPbCodeGenerator. - * @param {Array=} opt_data Optional initial data array, typically from a - * server response, or constructed directly in Javascript. The array is used - * in place and becomes part of the constructed object. It is not cloned. - * If no data is provided, the constructed object will be empty, but still - * valid. - * @extends {jspb.Message} - * @constructor - */ -proto.models.proto.cofd.api.UpdateSkillValueRequest = function(opt_data) { - jspb.Message.initialize(this, opt_data, 0, -1, null, null); -}; -goog.inherits(proto.models.proto.cofd.api.UpdateSkillValueRequest, jspb.Message); -if (goog.DEBUG && !COMPILED) { - /** - * @public - * @override - */ - proto.models.proto.cofd.api.UpdateSkillValueRequest.displayName = 'proto.models.proto.cofd.api.UpdateSkillValueRequest'; -} -/** - * Generated by JsPbCodeGenerator. - * @param {Array=} opt_data Optional initial data array, typically from a - * server response, or constructed directly in Javascript. The array is used - * in place and becomes part of the constructed object. It is not cloned. - * If no data is provided, the constructed object will be empty, but still - * valid. - * @extends {jspb.Message} - * @constructor - */ -proto.models.proto.cofd.api.SkillSpecializationsUpdate = function(opt_data) { - jspb.Message.initialize(this, opt_data, 0, -1, proto.models.proto.cofd.api.SkillSpecializationsUpdate.repeatedFields_, null); -}; -goog.inherits(proto.models.proto.cofd.api.SkillSpecializationsUpdate, jspb.Message); -if (goog.DEBUG && !COMPILED) { - /** - * @public - * @override - */ - proto.models.proto.cofd.api.SkillSpecializationsUpdate.displayName = 'proto.models.proto.cofd.api.SkillSpecializationsUpdate'; -} -/** - * Generated by JsPbCodeGenerator. - * @param {Array=} opt_data Optional initial data array, typically from a - * server response, or constructed directly in Javascript. The array is used - * in place and becomes part of the constructed object. It is not cloned. - * If no data is provided, the constructed object will be empty, but still - * valid. - * @extends {jspb.Message} - * @constructor - */ -proto.models.proto.cofd.api.Condition = function(opt_data) { - jspb.Message.initialize(this, opt_data, 0, -1, null, null); -}; -goog.inherits(proto.models.proto.cofd.api.Condition, jspb.Message); -if (goog.DEBUG && !COMPILED) { - /** - * @public - * @override - */ - proto.models.proto.cofd.api.Condition.displayName = 'proto.models.proto.cofd.api.Condition'; -} - - - -if (jspb.Message.GENERATE_TO_OBJECT) { -/** - * Creates an object representation of this proto. - * Field names that are reserved in JavaScript and will be renamed to pb_name. - * Optional fields that are not set will be set to undefined. - * To access a reserved field use, foo.pb_, eg, foo.pb_default. - * For the list of reserved names please see: - * net/proto2/compiler/js/internal/generator.cc#kKeyword. - * @param {boolean=} opt_includeInstance Deprecated. whether to include the - * JSPB instance for transitional soy proto support: - * http://goto/soy-param-migration - * @return {!Object} - */ -proto.models.proto.cofd.api.BasicInfo.prototype.toObject = function(opt_includeInstance) { - return proto.models.proto.cofd.api.BasicInfo.toObject(opt_includeInstance, this); -}; - - -/** - * Static version of the {@see toObject} method. - * @param {boolean|undefined} includeInstance Deprecated. Whether to include - * the JSPB instance for transitional soy proto support: - * http://goto/soy-param-migration - * @param {!proto.models.proto.cofd.api.BasicInfo} msg The msg instance to transform. - * @return {!Object} - * @suppress {unusedLocalVariables} f is only used for nested messages - */ -proto.models.proto.cofd.api.BasicInfo.toObject = function(includeInstance, msg) { - var f, obj = { - name: jspb.Message.getFieldWithDefault(msg, 1, ""), - gender: jspb.Message.getFieldWithDefault(msg, 2, ""), - concept: jspb.Message.getFieldWithDefault(msg, 3, ""), - chronicle: jspb.Message.getFieldWithDefault(msg, 4, ""), - age: jspb.Message.getFieldWithDefault(msg, 5, 0) - }; - - if (includeInstance) { - obj.$jspbMessageInstance = msg; - } - return obj; -}; -} - - -/** - * Deserializes binary data (in protobuf wire format). - * @param {jspb.ByteSource} bytes The bytes to deserialize. - * @return {!proto.models.proto.cofd.api.BasicInfo} - */ -proto.models.proto.cofd.api.BasicInfo.deserializeBinary = function(bytes) { - var reader = new jspb.BinaryReader(bytes); - var msg = new proto.models.proto.cofd.api.BasicInfo; - return proto.models.proto.cofd.api.BasicInfo.deserializeBinaryFromReader(msg, reader); -}; - - -/** - * Deserializes binary data (in protobuf wire format) from the - * given reader into the given message object. - * @param {!proto.models.proto.cofd.api.BasicInfo} msg The message object to deserialize into. - * @param {!jspb.BinaryReader} reader The BinaryReader to use. - * @return {!proto.models.proto.cofd.api.BasicInfo} - */ -proto.models.proto.cofd.api.BasicInfo.deserializeBinaryFromReader = function(msg, reader) { - while (reader.nextField()) { - if (reader.isEndGroup()) { - break; - } - var field = reader.getFieldNumber(); - switch (field) { - case 1: - var value = /** @type {string} */ (reader.readString()); - msg.setName(value); - break; - case 2: - var value = /** @type {string} */ (reader.readString()); - msg.setGender(value); - break; - case 3: - var value = /** @type {string} */ (reader.readString()); - msg.setConcept(value); - break; - case 4: - var value = /** @type {string} */ (reader.readString()); - msg.setChronicle(value); - break; - case 5: - var value = /** @type {number} */ (reader.readInt32()); - msg.setAge(value); - break; - default: - reader.skipField(); - break; - } - } - return msg; -}; - - -/** - * Serializes the message to binary data (in protobuf wire format). - * @return {!Uint8Array} - */ -proto.models.proto.cofd.api.BasicInfo.prototype.serializeBinary = function() { - var writer = new jspb.BinaryWriter(); - proto.models.proto.cofd.api.BasicInfo.serializeBinaryToWriter(this, writer); - return writer.getResultBuffer(); -}; - - -/** - * Serializes the given message to binary data (in protobuf wire - * format), writing to the given BinaryWriter. - * @param {!proto.models.proto.cofd.api.BasicInfo} message - * @param {!jspb.BinaryWriter} writer - * @suppress {unusedLocalVariables} f is only used for nested messages - */ -proto.models.proto.cofd.api.BasicInfo.serializeBinaryToWriter = function(message, writer) { - var f = undefined; - f = message.getName(); - if (f.length > 0) { - writer.writeString( - 1, - f - ); - } - f = message.getGender(); - if (f.length > 0) { - writer.writeString( - 2, - f - ); - } - f = message.getConcept(); - if (f.length > 0) { - writer.writeString( - 3, - f - ); - } - f = message.getChronicle(); - if (f.length > 0) { - writer.writeString( - 4, - f - ); - } - f = message.getAge(); - if (f !== 0) { - writer.writeInt32( - 5, - f - ); - } -}; - - -/** - * optional string name = 1; - * @return {string} - */ -proto.models.proto.cofd.api.BasicInfo.prototype.getName = function() { - return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 1, "")); -}; - - -/** - * @param {string} value - * @return {!proto.models.proto.cofd.api.BasicInfo} returns this - */ -proto.models.proto.cofd.api.BasicInfo.prototype.setName = function(value) { - return jspb.Message.setProto3StringField(this, 1, value); -}; - - -/** - * optional string gender = 2; - * @return {string} - */ -proto.models.proto.cofd.api.BasicInfo.prototype.getGender = function() { - return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 2, "")); -}; - - -/** - * @param {string} value - * @return {!proto.models.proto.cofd.api.BasicInfo} returns this - */ -proto.models.proto.cofd.api.BasicInfo.prototype.setGender = function(value) { - return jspb.Message.setProto3StringField(this, 2, value); -}; - - -/** - * optional string concept = 3; - * @return {string} - */ -proto.models.proto.cofd.api.BasicInfo.prototype.getConcept = function() { - return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 3, "")); -}; - - -/** - * @param {string} value - * @return {!proto.models.proto.cofd.api.BasicInfo} returns this - */ -proto.models.proto.cofd.api.BasicInfo.prototype.setConcept = function(value) { - return jspb.Message.setProto3StringField(this, 3, value); -}; - - -/** - * optional string chronicle = 4; - * @return {string} - */ -proto.models.proto.cofd.api.BasicInfo.prototype.getChronicle = function() { - return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 4, "")); -}; - - -/** - * @param {string} value - * @return {!proto.models.proto.cofd.api.BasicInfo} returns this - */ -proto.models.proto.cofd.api.BasicInfo.prototype.setChronicle = function(value) { - return jspb.Message.setProto3StringField(this, 4, value); -}; - - -/** - * optional int32 age = 5; - * @return {number} - */ -proto.models.proto.cofd.api.BasicInfo.prototype.getAge = function() { - return /** @type {number} */ (jspb.Message.getFieldWithDefault(this, 5, 0)); -}; - - -/** - * @param {number} value - * @return {!proto.models.proto.cofd.api.BasicInfo} returns this - */ -proto.models.proto.cofd.api.BasicInfo.prototype.setAge = function(value) { - return jspb.Message.setProto3IntField(this, 5, value); -}; - - - - - -if (jspb.Message.GENERATE_TO_OBJECT) { -/** - * Creates an object representation of this proto. - * Field names that are reserved in JavaScript and will be renamed to pb_name. - * Optional fields that are not set will be set to undefined. - * To access a reserved field use, foo.pb_, eg, foo.pb_default. - * For the list of reserved names please see: - * net/proto2/compiler/js/internal/generator.cc#kKeyword. - * @param {boolean=} opt_includeInstance Deprecated. whether to include the - * JSPB instance for transitional soy proto support: - * http://goto/soy-param-migration - * @return {!Object} - */ -proto.models.proto.cofd.api.Attributes.prototype.toObject = function(opt_includeInstance) { - return proto.models.proto.cofd.api.Attributes.toObject(opt_includeInstance, this); -}; - - -/** - * Static version of the {@see toObject} method. - * @param {boolean|undefined} includeInstance Deprecated. Whether to include - * the JSPB instance for transitional soy proto support: - * http://goto/soy-param-migration - * @param {!proto.models.proto.cofd.api.Attributes} msg The msg instance to transform. - * @return {!Object} - * @suppress {unusedLocalVariables} f is only used for nested messages - */ -proto.models.proto.cofd.api.Attributes.toObject = function(includeInstance, msg) { - var f, obj = { - strength: jspb.Message.getFieldWithDefault(msg, 1, 0), - dexterity: jspb.Message.getFieldWithDefault(msg, 2, 0), - stamina: jspb.Message.getFieldWithDefault(msg, 3, 0), - intelligence: jspb.Message.getFieldWithDefault(msg, 4, 0), - wits: jspb.Message.getFieldWithDefault(msg, 5, 0), - resolve: jspb.Message.getFieldWithDefault(msg, 6, 0), - presence: jspb.Message.getFieldWithDefault(msg, 7, 0), - manipulation: jspb.Message.getFieldWithDefault(msg, 8, 0), - composure: jspb.Message.getFieldWithDefault(msg, 9, 0) - }; - - if (includeInstance) { - obj.$jspbMessageInstance = msg; - } - return obj; -}; -} - - -/** - * Deserializes binary data (in protobuf wire format). - * @param {jspb.ByteSource} bytes The bytes to deserialize. - * @return {!proto.models.proto.cofd.api.Attributes} - */ -proto.models.proto.cofd.api.Attributes.deserializeBinary = function(bytes) { - var reader = new jspb.BinaryReader(bytes); - var msg = new proto.models.proto.cofd.api.Attributes; - return proto.models.proto.cofd.api.Attributes.deserializeBinaryFromReader(msg, reader); -}; - - -/** - * Deserializes binary data (in protobuf wire format) from the - * given reader into the given message object. - * @param {!proto.models.proto.cofd.api.Attributes} msg The message object to deserialize into. - * @param {!jspb.BinaryReader} reader The BinaryReader to use. - * @return {!proto.models.proto.cofd.api.Attributes} - */ -proto.models.proto.cofd.api.Attributes.deserializeBinaryFromReader = function(msg, reader) { - while (reader.nextField()) { - if (reader.isEndGroup()) { - break; - } - var field = reader.getFieldNumber(); - switch (field) { - case 1: - var value = /** @type {number} */ (reader.readInt32()); - msg.setStrength(value); - break; - case 2: - var value = /** @type {number} */ (reader.readInt32()); - msg.setDexterity(value); - break; - case 3: - var value = /** @type {number} */ (reader.readInt32()); - msg.setStamina(value); - break; - case 4: - var value = /** @type {number} */ (reader.readInt32()); - msg.setIntelligence(value); - break; - case 5: - var value = /** @type {number} */ (reader.readInt32()); - msg.setWits(value); - break; - case 6: - var value = /** @type {number} */ (reader.readInt32()); - msg.setResolve(value); - break; - case 7: - var value = /** @type {number} */ (reader.readInt32()); - msg.setPresence(value); - break; - case 8: - var value = /** @type {number} */ (reader.readInt32()); - msg.setManipulation(value); - break; - case 9: - var value = /** @type {number} */ (reader.readInt32()); - msg.setComposure(value); - break; - default: - reader.skipField(); - break; - } - } - return msg; -}; - - -/** - * Serializes the message to binary data (in protobuf wire format). - * @return {!Uint8Array} - */ -proto.models.proto.cofd.api.Attributes.prototype.serializeBinary = function() { - var writer = new jspb.BinaryWriter(); - proto.models.proto.cofd.api.Attributes.serializeBinaryToWriter(this, writer); - return writer.getResultBuffer(); -}; - - -/** - * Serializes the given message to binary data (in protobuf wire - * format), writing to the given BinaryWriter. - * @param {!proto.models.proto.cofd.api.Attributes} message - * @param {!jspb.BinaryWriter} writer - * @suppress {unusedLocalVariables} f is only used for nested messages - */ -proto.models.proto.cofd.api.Attributes.serializeBinaryToWriter = function(message, writer) { - var f = undefined; - f = message.getStrength(); - if (f !== 0) { - writer.writeInt32( - 1, - f - ); - } - f = message.getDexterity(); - if (f !== 0) { - writer.writeInt32( - 2, - f - ); - } - f = message.getStamina(); - if (f !== 0) { - writer.writeInt32( - 3, - f - ); - } - f = message.getIntelligence(); - if (f !== 0) { - writer.writeInt32( - 4, - f - ); - } - f = message.getWits(); - if (f !== 0) { - writer.writeInt32( - 5, - f - ); - } - f = message.getResolve(); - if (f !== 0) { - writer.writeInt32( - 6, - f - ); - } - f = message.getPresence(); - if (f !== 0) { - writer.writeInt32( - 7, - f - ); - } - f = message.getManipulation(); - if (f !== 0) { - writer.writeInt32( - 8, - f - ); - } - f = message.getComposure(); - if (f !== 0) { - writer.writeInt32( - 9, - f - ); - } -}; - - -/** - * optional int32 strength = 1; - * @return {number} - */ -proto.models.proto.cofd.api.Attributes.prototype.getStrength = function() { - return /** @type {number} */ (jspb.Message.getFieldWithDefault(this, 1, 0)); -}; - - -/** - * @param {number} value - * @return {!proto.models.proto.cofd.api.Attributes} returns this - */ -proto.models.proto.cofd.api.Attributes.prototype.setStrength = function(value) { - return jspb.Message.setProto3IntField(this, 1, value); -}; - - -/** - * optional int32 dexterity = 2; - * @return {number} - */ -proto.models.proto.cofd.api.Attributes.prototype.getDexterity = function() { - return /** @type {number} */ (jspb.Message.getFieldWithDefault(this, 2, 0)); -}; - - -/** - * @param {number} value - * @return {!proto.models.proto.cofd.api.Attributes} returns this - */ -proto.models.proto.cofd.api.Attributes.prototype.setDexterity = function(value) { - return jspb.Message.setProto3IntField(this, 2, value); -}; - - -/** - * optional int32 stamina = 3; - * @return {number} - */ -proto.models.proto.cofd.api.Attributes.prototype.getStamina = function() { - return /** @type {number} */ (jspb.Message.getFieldWithDefault(this, 3, 0)); -}; - - -/** - * @param {number} value - * @return {!proto.models.proto.cofd.api.Attributes} returns this - */ -proto.models.proto.cofd.api.Attributes.prototype.setStamina = function(value) { - return jspb.Message.setProto3IntField(this, 3, value); -}; - - -/** - * optional int32 intelligence = 4; - * @return {number} - */ -proto.models.proto.cofd.api.Attributes.prototype.getIntelligence = function() { - return /** @type {number} */ (jspb.Message.getFieldWithDefault(this, 4, 0)); -}; - - -/** - * @param {number} value - * @return {!proto.models.proto.cofd.api.Attributes} returns this - */ -proto.models.proto.cofd.api.Attributes.prototype.setIntelligence = function(value) { - return jspb.Message.setProto3IntField(this, 4, value); -}; - - -/** - * optional int32 wits = 5; - * @return {number} - */ -proto.models.proto.cofd.api.Attributes.prototype.getWits = function() { - return /** @type {number} */ (jspb.Message.getFieldWithDefault(this, 5, 0)); -}; - - -/** - * @param {number} value - * @return {!proto.models.proto.cofd.api.Attributes} returns this - */ -proto.models.proto.cofd.api.Attributes.prototype.setWits = function(value) { - return jspb.Message.setProto3IntField(this, 5, value); -}; - - -/** - * optional int32 resolve = 6; - * @return {number} - */ -proto.models.proto.cofd.api.Attributes.prototype.getResolve = function() { - return /** @type {number} */ (jspb.Message.getFieldWithDefault(this, 6, 0)); -}; - - -/** - * @param {number} value - * @return {!proto.models.proto.cofd.api.Attributes} returns this - */ -proto.models.proto.cofd.api.Attributes.prototype.setResolve = function(value) { - return jspb.Message.setProto3IntField(this, 6, value); -}; - - -/** - * optional int32 presence = 7; - * @return {number} - */ -proto.models.proto.cofd.api.Attributes.prototype.getPresence = function() { - return /** @type {number} */ (jspb.Message.getFieldWithDefault(this, 7, 0)); -}; - - -/** - * @param {number} value - * @return {!proto.models.proto.cofd.api.Attributes} returns this - */ -proto.models.proto.cofd.api.Attributes.prototype.setPresence = function(value) { - return jspb.Message.setProto3IntField(this, 7, value); -}; - - -/** - * optional int32 manipulation = 8; - * @return {number} - */ -proto.models.proto.cofd.api.Attributes.prototype.getManipulation = function() { - return /** @type {number} */ (jspb.Message.getFieldWithDefault(this, 8, 0)); -}; - - -/** - * @param {number} value - * @return {!proto.models.proto.cofd.api.Attributes} returns this - */ -proto.models.proto.cofd.api.Attributes.prototype.setManipulation = function(value) { - return jspb.Message.setProto3IntField(this, 8, value); -}; - - -/** - * optional int32 composure = 9; - * @return {number} - */ -proto.models.proto.cofd.api.Attributes.prototype.getComposure = function() { - return /** @type {number} */ (jspb.Message.getFieldWithDefault(this, 9, 0)); -}; - - -/** - * @param {number} value - * @return {!proto.models.proto.cofd.api.Attributes} returns this - */ -proto.models.proto.cofd.api.Attributes.prototype.setComposure = function(value) { - return jspb.Message.setProto3IntField(this, 9, value); -}; - - - - - -if (jspb.Message.GENERATE_TO_OBJECT) { -/** - * Creates an object representation of this proto. - * Field names that are reserved in JavaScript and will be renamed to pb_name. - * Optional fields that are not set will be set to undefined. - * To access a reserved field use, foo.pb_, eg, foo.pb_default. - * For the list of reserved names please see: - * net/proto2/compiler/js/internal/generator.cc#kKeyword. - * @param {boolean=} opt_includeInstance Deprecated. whether to include the - * JSPB instance for transitional soy proto support: - * http://goto/soy-param-migration - * @return {!Object} - */ -proto.models.proto.cofd.api.UpdateAttributeRequest.prototype.toObject = function(opt_includeInstance) { - return proto.models.proto.cofd.api.UpdateAttributeRequest.toObject(opt_includeInstance, this); -}; - - -/** - * Static version of the {@see toObject} method. - * @param {boolean|undefined} includeInstance Deprecated. Whether to include - * the JSPB instance for transitional soy proto support: - * http://goto/soy-param-migration - * @param {!proto.models.proto.cofd.api.UpdateAttributeRequest} msg The msg instance to transform. - * @return {!Object} - * @suppress {unusedLocalVariables} f is only used for nested messages - */ -proto.models.proto.cofd.api.UpdateAttributeRequest.toObject = function(includeInstance, msg) { - var f, obj = { - characterUsername: jspb.Message.getFieldWithDefault(msg, 1, ""), - characterId: jspb.Message.getFieldWithDefault(msg, 2, 0), - attributeName: jspb.Message.getFieldWithDefault(msg, 3, ""), - attributeValue: jspb.Message.getFieldWithDefault(msg, 4, 0) - }; - - if (includeInstance) { - obj.$jspbMessageInstance = msg; - } - return obj; -}; -} - - -/** - * Deserializes binary data (in protobuf wire format). - * @param {jspb.ByteSource} bytes The bytes to deserialize. - * @return {!proto.models.proto.cofd.api.UpdateAttributeRequest} - */ -proto.models.proto.cofd.api.UpdateAttributeRequest.deserializeBinary = function(bytes) { - var reader = new jspb.BinaryReader(bytes); - var msg = new proto.models.proto.cofd.api.UpdateAttributeRequest; - return proto.models.proto.cofd.api.UpdateAttributeRequest.deserializeBinaryFromReader(msg, reader); -}; - - -/** - * Deserializes binary data (in protobuf wire format) from the - * given reader into the given message object. - * @param {!proto.models.proto.cofd.api.UpdateAttributeRequest} msg The message object to deserialize into. - * @param {!jspb.BinaryReader} reader The BinaryReader to use. - * @return {!proto.models.proto.cofd.api.UpdateAttributeRequest} - */ -proto.models.proto.cofd.api.UpdateAttributeRequest.deserializeBinaryFromReader = function(msg, reader) { - while (reader.nextField()) { - if (reader.isEndGroup()) { - break; - } - var field = reader.getFieldNumber(); - switch (field) { - case 1: - var value = /** @type {string} */ (reader.readString()); - msg.setCharacterUsername(value); - break; - case 2: - var value = /** @type {number} */ (reader.readInt32()); - msg.setCharacterId(value); - break; - case 3: - var value = /** @type {string} */ (reader.readString()); - msg.setAttributeName(value); - break; - case 4: - var value = /** @type {number} */ (reader.readInt32()); - msg.setAttributeValue(value); - break; - default: - reader.skipField(); - break; - } - } - return msg; -}; - - -/** - * Serializes the message to binary data (in protobuf wire format). - * @return {!Uint8Array} - */ -proto.models.proto.cofd.api.UpdateAttributeRequest.prototype.serializeBinary = function() { - var writer = new jspb.BinaryWriter(); - proto.models.proto.cofd.api.UpdateAttributeRequest.serializeBinaryToWriter(this, writer); - return writer.getResultBuffer(); -}; - - -/** - * Serializes the given message to binary data (in protobuf wire - * format), writing to the given BinaryWriter. - * @param {!proto.models.proto.cofd.api.UpdateAttributeRequest} message - * @param {!jspb.BinaryWriter} writer - * @suppress {unusedLocalVariables} f is only used for nested messages - */ -proto.models.proto.cofd.api.UpdateAttributeRequest.serializeBinaryToWriter = function(message, writer) { - var f = undefined; - f = message.getCharacterUsername(); - if (f.length > 0) { - writer.writeString( - 1, - f - ); - } - f = message.getCharacterId(); - if (f !== 0) { - writer.writeInt32( - 2, - f - ); - } - f = message.getAttributeName(); - if (f.length > 0) { - writer.writeString( - 3, - f - ); - } - f = message.getAttributeValue(); - if (f !== 0) { - writer.writeInt32( - 4, - f - ); - } -}; - - -/** - * optional string character_username = 1; - * @return {string} - */ -proto.models.proto.cofd.api.UpdateAttributeRequest.prototype.getCharacterUsername = function() { - return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 1, "")); -}; - - -/** - * @param {string} value - * @return {!proto.models.proto.cofd.api.UpdateAttributeRequest} returns this - */ -proto.models.proto.cofd.api.UpdateAttributeRequest.prototype.setCharacterUsername = function(value) { - return jspb.Message.setProto3StringField(this, 1, value); -}; - - -/** - * optional int32 character_id = 2; - * @return {number} - */ -proto.models.proto.cofd.api.UpdateAttributeRequest.prototype.getCharacterId = function() { - return /** @type {number} */ (jspb.Message.getFieldWithDefault(this, 2, 0)); -}; - - -/** - * @param {number} value - * @return {!proto.models.proto.cofd.api.UpdateAttributeRequest} returns this - */ -proto.models.proto.cofd.api.UpdateAttributeRequest.prototype.setCharacterId = function(value) { - return jspb.Message.setProto3IntField(this, 2, value); -}; - - -/** - * optional string attribute_name = 3; - * @return {string} - */ -proto.models.proto.cofd.api.UpdateAttributeRequest.prototype.getAttributeName = function() { - return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 3, "")); -}; - - -/** - * @param {string} value - * @return {!proto.models.proto.cofd.api.UpdateAttributeRequest} returns this - */ -proto.models.proto.cofd.api.UpdateAttributeRequest.prototype.setAttributeName = function(value) { - return jspb.Message.setProto3StringField(this, 3, value); -}; - - -/** - * optional int32 attribute_value = 4; - * @return {number} - */ -proto.models.proto.cofd.api.UpdateAttributeRequest.prototype.getAttributeValue = function() { - return /** @type {number} */ (jspb.Message.getFieldWithDefault(this, 4, 0)); -}; - - -/** - * @param {number} value - * @return {!proto.models.proto.cofd.api.UpdateAttributeRequest} returns this - */ -proto.models.proto.cofd.api.UpdateAttributeRequest.prototype.setAttributeValue = function(value) { - return jspb.Message.setProto3IntField(this, 4, value); -}; - - - -/** - * List of repeated fields within this message type. - * @private {!Array} - * @const - */ -proto.models.proto.cofd.api.Skills.repeatedFields_ = [1,2,3]; - - - -if (jspb.Message.GENERATE_TO_OBJECT) { -/** - * Creates an object representation of this proto. - * Field names that are reserved in JavaScript and will be renamed to pb_name. - * Optional fields that are not set will be set to undefined. - * To access a reserved field use, foo.pb_, eg, foo.pb_default. - * For the list of reserved names please see: - * net/proto2/compiler/js/internal/generator.cc#kKeyword. - * @param {boolean=} opt_includeInstance Deprecated. whether to include the - * JSPB instance for transitional soy proto support: - * http://goto/soy-param-migration - * @return {!Object} - */ -proto.models.proto.cofd.api.Skills.prototype.toObject = function(opt_includeInstance) { - return proto.models.proto.cofd.api.Skills.toObject(opt_includeInstance, this); -}; - - -/** - * Static version of the {@see toObject} method. - * @param {boolean|undefined} includeInstance Deprecated. Whether to include - * the JSPB instance for transitional soy proto support: - * http://goto/soy-param-migration - * @param {!proto.models.proto.cofd.api.Skills} msg The msg instance to transform. - * @return {!Object} - * @suppress {unusedLocalVariables} f is only used for nested messages - */ -proto.models.proto.cofd.api.Skills.toObject = function(includeInstance, msg) { - var f, obj = { - physicalSkillsList: jspb.Message.toObjectList(msg.getPhysicalSkillsList(), - cofd_pb.CofdSheet.Skill.toObject, includeInstance), - mentalSkillsList: jspb.Message.toObjectList(msg.getMentalSkillsList(), - cofd_pb.CofdSheet.Skill.toObject, includeInstance), - socialSkillsList: jspb.Message.toObjectList(msg.getSocialSkillsList(), - cofd_pb.CofdSheet.Skill.toObject, includeInstance) - }; - - if (includeInstance) { - obj.$jspbMessageInstance = msg; - } - return obj; -}; -} - - -/** - * Deserializes binary data (in protobuf wire format). - * @param {jspb.ByteSource} bytes The bytes to deserialize. - * @return {!proto.models.proto.cofd.api.Skills} - */ -proto.models.proto.cofd.api.Skills.deserializeBinary = function(bytes) { - var reader = new jspb.BinaryReader(bytes); - var msg = new proto.models.proto.cofd.api.Skills; - return proto.models.proto.cofd.api.Skills.deserializeBinaryFromReader(msg, reader); -}; - - -/** - * Deserializes binary data (in protobuf wire format) from the - * given reader into the given message object. - * @param {!proto.models.proto.cofd.api.Skills} msg The message object to deserialize into. - * @param {!jspb.BinaryReader} reader The BinaryReader to use. - * @return {!proto.models.proto.cofd.api.Skills} - */ -proto.models.proto.cofd.api.Skills.deserializeBinaryFromReader = function(msg, reader) { - while (reader.nextField()) { - if (reader.isEndGroup()) { - break; - } - var field = reader.getFieldNumber(); - switch (field) { - case 1: - var value = new cofd_pb.CofdSheet.Skill; - reader.readMessage(value,cofd_pb.CofdSheet.Skill.deserializeBinaryFromReader); - msg.addPhysicalSkills(value); - break; - case 2: - var value = new cofd_pb.CofdSheet.Skill; - reader.readMessage(value,cofd_pb.CofdSheet.Skill.deserializeBinaryFromReader); - msg.addMentalSkills(value); - break; - case 3: - var value = new cofd_pb.CofdSheet.Skill; - reader.readMessage(value,cofd_pb.CofdSheet.Skill.deserializeBinaryFromReader); - msg.addSocialSkills(value); - break; - default: - reader.skipField(); - break; - } - } - return msg; -}; - - -/** - * Serializes the message to binary data (in protobuf wire format). - * @return {!Uint8Array} - */ -proto.models.proto.cofd.api.Skills.prototype.serializeBinary = function() { - var writer = new jspb.BinaryWriter(); - proto.models.proto.cofd.api.Skills.serializeBinaryToWriter(this, writer); - return writer.getResultBuffer(); -}; - - -/** - * Serializes the given message to binary data (in protobuf wire - * format), writing to the given BinaryWriter. - * @param {!proto.models.proto.cofd.api.Skills} message - * @param {!jspb.BinaryWriter} writer - * @suppress {unusedLocalVariables} f is only used for nested messages - */ -proto.models.proto.cofd.api.Skills.serializeBinaryToWriter = function(message, writer) { - var f = undefined; - f = message.getPhysicalSkillsList(); - if (f.length > 0) { - writer.writeRepeatedMessage( - 1, - f, - cofd_pb.CofdSheet.Skill.serializeBinaryToWriter - ); - } - f = message.getMentalSkillsList(); - if (f.length > 0) { - writer.writeRepeatedMessage( - 2, - f, - cofd_pb.CofdSheet.Skill.serializeBinaryToWriter - ); - } - f = message.getSocialSkillsList(); - if (f.length > 0) { - writer.writeRepeatedMessage( - 3, - f, - cofd_pb.CofdSheet.Skill.serializeBinaryToWriter - ); - } -}; - - -/** - * repeated models.proto.cofd.CofdSheet.Skill physical_skills = 1; - * @return {!Array} - */ -proto.models.proto.cofd.api.Skills.prototype.getPhysicalSkillsList = function() { - return /** @type{!Array} */ ( - jspb.Message.getRepeatedWrapperField(this, cofd_pb.CofdSheet.Skill, 1)); -}; - - -/** - * @param {!Array} value - * @return {!proto.models.proto.cofd.api.Skills} returns this -*/ -proto.models.proto.cofd.api.Skills.prototype.setPhysicalSkillsList = function(value) { - return jspb.Message.setRepeatedWrapperField(this, 1, value); -}; - - -/** - * @param {!proto.models.proto.cofd.CofdSheet.Skill=} opt_value - * @param {number=} opt_index - * @return {!proto.models.proto.cofd.CofdSheet.Skill} - */ -proto.models.proto.cofd.api.Skills.prototype.addPhysicalSkills = function(opt_value, opt_index) { - return jspb.Message.addToRepeatedWrapperField(this, 1, opt_value, proto.models.proto.cofd.CofdSheet.Skill, opt_index); -}; - - -/** - * Clears the list making it empty but non-null. - * @return {!proto.models.proto.cofd.api.Skills} returns this - */ -proto.models.proto.cofd.api.Skills.prototype.clearPhysicalSkillsList = function() { - return this.setPhysicalSkillsList([]); -}; - - -/** - * repeated models.proto.cofd.CofdSheet.Skill mental_skills = 2; - * @return {!Array} - */ -proto.models.proto.cofd.api.Skills.prototype.getMentalSkillsList = function() { - return /** @type{!Array} */ ( - jspb.Message.getRepeatedWrapperField(this, cofd_pb.CofdSheet.Skill, 2)); -}; - - -/** - * @param {!Array} value - * @return {!proto.models.proto.cofd.api.Skills} returns this -*/ -proto.models.proto.cofd.api.Skills.prototype.setMentalSkillsList = function(value) { - return jspb.Message.setRepeatedWrapperField(this, 2, value); -}; - - -/** - * @param {!proto.models.proto.cofd.CofdSheet.Skill=} opt_value - * @param {number=} opt_index - * @return {!proto.models.proto.cofd.CofdSheet.Skill} - */ -proto.models.proto.cofd.api.Skills.prototype.addMentalSkills = function(opt_value, opt_index) { - return jspb.Message.addToRepeatedWrapperField(this, 2, opt_value, proto.models.proto.cofd.CofdSheet.Skill, opt_index); -}; - - -/** - * Clears the list making it empty but non-null. - * @return {!proto.models.proto.cofd.api.Skills} returns this - */ -proto.models.proto.cofd.api.Skills.prototype.clearMentalSkillsList = function() { - return this.setMentalSkillsList([]); -}; - - -/** - * repeated models.proto.cofd.CofdSheet.Skill social_skills = 3; - * @return {!Array} - */ -proto.models.proto.cofd.api.Skills.prototype.getSocialSkillsList = function() { - return /** @type{!Array} */ ( - jspb.Message.getRepeatedWrapperField(this, cofd_pb.CofdSheet.Skill, 3)); -}; - - -/** - * @param {!Array} value - * @return {!proto.models.proto.cofd.api.Skills} returns this -*/ -proto.models.proto.cofd.api.Skills.prototype.setSocialSkillsList = function(value) { - return jspb.Message.setRepeatedWrapperField(this, 3, value); -}; - - -/** - * @param {!proto.models.proto.cofd.CofdSheet.Skill=} opt_value - * @param {number=} opt_index - * @return {!proto.models.proto.cofd.CofdSheet.Skill} - */ -proto.models.proto.cofd.api.Skills.prototype.addSocialSkills = function(opt_value, opt_index) { - return jspb.Message.addToRepeatedWrapperField(this, 3, opt_value, proto.models.proto.cofd.CofdSheet.Skill, opt_index); -}; - - -/** - * Clears the list making it empty but non-null. - * @return {!proto.models.proto.cofd.api.Skills} returns this - */ -proto.models.proto.cofd.api.Skills.prototype.clearSocialSkillsList = function() { - return this.setSocialSkillsList([]); -}; - - - - - -if (jspb.Message.GENERATE_TO_OBJECT) { -/** - * Creates an object representation of this proto. - * Field names that are reserved in JavaScript and will be renamed to pb_name. - * Optional fields that are not set will be set to undefined. - * To access a reserved field use, foo.pb_, eg, foo.pb_default. - * For the list of reserved names please see: - * net/proto2/compiler/js/internal/generator.cc#kKeyword. - * @param {boolean=} opt_includeInstance Deprecated. whether to include the - * JSPB instance for transitional soy proto support: - * http://goto/soy-param-migration - * @return {!Object} - */ -proto.models.proto.cofd.api.SkillUpdate.prototype.toObject = function(opt_includeInstance) { - return proto.models.proto.cofd.api.SkillUpdate.toObject(opt_includeInstance, this); -}; - - -/** - * Static version of the {@see toObject} method. - * @param {boolean|undefined} includeInstance Deprecated. Whether to include - * the JSPB instance for transitional soy proto support: - * http://goto/soy-param-migration - * @param {!proto.models.proto.cofd.api.SkillUpdate} msg The msg instance to transform. - * @return {!Object} - * @suppress {unusedLocalVariables} f is only used for nested messages - */ -proto.models.proto.cofd.api.SkillUpdate.toObject = function(includeInstance, msg) { - var f, obj = { - name: jspb.Message.getFieldWithDefault(msg, 1, ""), - skill: (f = msg.getSkill()) && cofd_pb.CofdSheet.Skill.toObject(includeInstance, f) - }; - - if (includeInstance) { - obj.$jspbMessageInstance = msg; - } - return obj; -}; -} - - -/** - * Deserializes binary data (in protobuf wire format). - * @param {jspb.ByteSource} bytes The bytes to deserialize. - * @return {!proto.models.proto.cofd.api.SkillUpdate} - */ -proto.models.proto.cofd.api.SkillUpdate.deserializeBinary = function(bytes) { - var reader = new jspb.BinaryReader(bytes); - var msg = new proto.models.proto.cofd.api.SkillUpdate; - return proto.models.proto.cofd.api.SkillUpdate.deserializeBinaryFromReader(msg, reader); -}; - - -/** - * Deserializes binary data (in protobuf wire format) from the - * given reader into the given message object. - * @param {!proto.models.proto.cofd.api.SkillUpdate} msg The message object to deserialize into. - * @param {!jspb.BinaryReader} reader The BinaryReader to use. - * @return {!proto.models.proto.cofd.api.SkillUpdate} - */ -proto.models.proto.cofd.api.SkillUpdate.deserializeBinaryFromReader = function(msg, reader) { - while (reader.nextField()) { - if (reader.isEndGroup()) { - break; - } - var field = reader.getFieldNumber(); - switch (field) { - case 1: - var value = /** @type {string} */ (reader.readString()); - msg.setName(value); - break; - case 2: - var value = new cofd_pb.CofdSheet.Skill; - reader.readMessage(value,cofd_pb.CofdSheet.Skill.deserializeBinaryFromReader); - msg.setSkill(value); - break; - default: - reader.skipField(); - break; - } - } - return msg; -}; - - -/** - * Serializes the message to binary data (in protobuf wire format). - * @return {!Uint8Array} - */ -proto.models.proto.cofd.api.SkillUpdate.prototype.serializeBinary = function() { - var writer = new jspb.BinaryWriter(); - proto.models.proto.cofd.api.SkillUpdate.serializeBinaryToWriter(this, writer); - return writer.getResultBuffer(); -}; - - -/** - * Serializes the given message to binary data (in protobuf wire - * format), writing to the given BinaryWriter. - * @param {!proto.models.proto.cofd.api.SkillUpdate} message - * @param {!jspb.BinaryWriter} writer - * @suppress {unusedLocalVariables} f is only used for nested messages - */ -proto.models.proto.cofd.api.SkillUpdate.serializeBinaryToWriter = function(message, writer) { - var f = undefined; - f = message.getName(); - if (f.length > 0) { - writer.writeString( - 1, - f - ); - } - f = message.getSkill(); - if (f != null) { - writer.writeMessage( - 2, - f, - cofd_pb.CofdSheet.Skill.serializeBinaryToWriter - ); - } -}; - - -/** - * optional string name = 1; - * @return {string} - */ -proto.models.proto.cofd.api.SkillUpdate.prototype.getName = function() { - return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 1, "")); -}; - - -/** - * @param {string} value - * @return {!proto.models.proto.cofd.api.SkillUpdate} returns this - */ -proto.models.proto.cofd.api.SkillUpdate.prototype.setName = function(value) { - return jspb.Message.setProto3StringField(this, 1, value); -}; - - -/** - * optional models.proto.cofd.CofdSheet.Skill skill = 2; - * @return {?proto.models.proto.cofd.CofdSheet.Skill} - */ -proto.models.proto.cofd.api.SkillUpdate.prototype.getSkill = function() { - return /** @type{?proto.models.proto.cofd.CofdSheet.Skill} */ ( - jspb.Message.getWrapperField(this, cofd_pb.CofdSheet.Skill, 2)); -}; - - -/** - * @param {?proto.models.proto.cofd.CofdSheet.Skill|undefined} value - * @return {!proto.models.proto.cofd.api.SkillUpdate} returns this -*/ -proto.models.proto.cofd.api.SkillUpdate.prototype.setSkill = function(value) { - return jspb.Message.setWrapperField(this, 2, value); -}; - - -/** - * Clears the message field making it undefined. - * @return {!proto.models.proto.cofd.api.SkillUpdate} returns this - */ -proto.models.proto.cofd.api.SkillUpdate.prototype.clearSkill = function() { - return this.setSkill(undefined); -}; - - -/** - * Returns whether this field is set. - * @return {boolean} - */ -proto.models.proto.cofd.api.SkillUpdate.prototype.hasSkill = function() { - return jspb.Message.getField(this, 2) != null; -}; - - - - - -if (jspb.Message.GENERATE_TO_OBJECT) { -/** - * Creates an object representation of this proto. - * Field names that are reserved in JavaScript and will be renamed to pb_name. - * Optional fields that are not set will be set to undefined. - * To access a reserved field use, foo.pb_, eg, foo.pb_default. - * For the list of reserved names please see: - * net/proto2/compiler/js/internal/generator.cc#kKeyword. - * @param {boolean=} opt_includeInstance Deprecated. whether to include the - * JSPB instance for transitional soy proto support: - * http://goto/soy-param-migration - * @return {!Object} - */ -proto.models.proto.cofd.api.UpdateSkillValueRequest.prototype.toObject = function(opt_includeInstance) { - return proto.models.proto.cofd.api.UpdateSkillValueRequest.toObject(opt_includeInstance, this); -}; - - -/** - * Static version of the {@see toObject} method. - * @param {boolean|undefined} includeInstance Deprecated. Whether to include - * the JSPB instance for transitional soy proto support: - * http://goto/soy-param-migration - * @param {!proto.models.proto.cofd.api.UpdateSkillValueRequest} msg The msg instance to transform. - * @return {!Object} - * @suppress {unusedLocalVariables} f is only used for nested messages - */ -proto.models.proto.cofd.api.UpdateSkillValueRequest.toObject = function(includeInstance, msg) { - var f, obj = { - characterUsername: jspb.Message.getFieldWithDefault(msg, 1, ""), - characterId: jspb.Message.getFieldWithDefault(msg, 2, 0), - skillName: jspb.Message.getFieldWithDefault(msg, 3, ""), - skillValue: jspb.Message.getFieldWithDefault(msg, 4, 0) - }; - - if (includeInstance) { - obj.$jspbMessageInstance = msg; - } - return obj; -}; -} - - -/** - * Deserializes binary data (in protobuf wire format). - * @param {jspb.ByteSource} bytes The bytes to deserialize. - * @return {!proto.models.proto.cofd.api.UpdateSkillValueRequest} - */ -proto.models.proto.cofd.api.UpdateSkillValueRequest.deserializeBinary = function(bytes) { - var reader = new jspb.BinaryReader(bytes); - var msg = new proto.models.proto.cofd.api.UpdateSkillValueRequest; - return proto.models.proto.cofd.api.UpdateSkillValueRequest.deserializeBinaryFromReader(msg, reader); -}; - - -/** - * Deserializes binary data (in protobuf wire format) from the - * given reader into the given message object. - * @param {!proto.models.proto.cofd.api.UpdateSkillValueRequest} msg The message object to deserialize into. - * @param {!jspb.BinaryReader} reader The BinaryReader to use. - * @return {!proto.models.proto.cofd.api.UpdateSkillValueRequest} - */ -proto.models.proto.cofd.api.UpdateSkillValueRequest.deserializeBinaryFromReader = function(msg, reader) { - while (reader.nextField()) { - if (reader.isEndGroup()) { - break; - } - var field = reader.getFieldNumber(); - switch (field) { - case 1: - var value = /** @type {string} */ (reader.readString()); - msg.setCharacterUsername(value); - break; - case 2: - var value = /** @type {number} */ (reader.readInt32()); - msg.setCharacterId(value); - break; - case 3: - var value = /** @type {string} */ (reader.readString()); - msg.setSkillName(value); - break; - case 4: - var value = /** @type {number} */ (reader.readInt32()); - msg.setSkillValue(value); - break; - default: - reader.skipField(); - break; - } - } - return msg; -}; - - -/** - * Serializes the message to binary data (in protobuf wire format). - * @return {!Uint8Array} - */ -proto.models.proto.cofd.api.UpdateSkillValueRequest.prototype.serializeBinary = function() { - var writer = new jspb.BinaryWriter(); - proto.models.proto.cofd.api.UpdateSkillValueRequest.serializeBinaryToWriter(this, writer); - return writer.getResultBuffer(); -}; - - -/** - * Serializes the given message to binary data (in protobuf wire - * format), writing to the given BinaryWriter. - * @param {!proto.models.proto.cofd.api.UpdateSkillValueRequest} message - * @param {!jspb.BinaryWriter} writer - * @suppress {unusedLocalVariables} f is only used for nested messages - */ -proto.models.proto.cofd.api.UpdateSkillValueRequest.serializeBinaryToWriter = function(message, writer) { - var f = undefined; - f = message.getCharacterUsername(); - if (f.length > 0) { - writer.writeString( - 1, - f - ); - } - f = message.getCharacterId(); - if (f !== 0) { - writer.writeInt32( - 2, - f - ); - } - f = message.getSkillName(); - if (f.length > 0) { - writer.writeString( - 3, - f - ); - } - f = message.getSkillValue(); - if (f !== 0) { - writer.writeInt32( - 4, - f - ); - } -}; - - -/** - * optional string character_username = 1; - * @return {string} - */ -proto.models.proto.cofd.api.UpdateSkillValueRequest.prototype.getCharacterUsername = function() { - return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 1, "")); -}; - - -/** - * @param {string} value - * @return {!proto.models.proto.cofd.api.UpdateSkillValueRequest} returns this - */ -proto.models.proto.cofd.api.UpdateSkillValueRequest.prototype.setCharacterUsername = function(value) { - return jspb.Message.setProto3StringField(this, 1, value); -}; - - -/** - * optional int32 character_id = 2; - * @return {number} - */ -proto.models.proto.cofd.api.UpdateSkillValueRequest.prototype.getCharacterId = function() { - return /** @type {number} */ (jspb.Message.getFieldWithDefault(this, 2, 0)); -}; - - -/** - * @param {number} value - * @return {!proto.models.proto.cofd.api.UpdateSkillValueRequest} returns this - */ -proto.models.proto.cofd.api.UpdateSkillValueRequest.prototype.setCharacterId = function(value) { - return jspb.Message.setProto3IntField(this, 2, value); -}; - - -/** - * optional string skill_name = 3; - * @return {string} - */ -proto.models.proto.cofd.api.UpdateSkillValueRequest.prototype.getSkillName = function() { - return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 3, "")); -}; - - -/** - * @param {string} value - * @return {!proto.models.proto.cofd.api.UpdateSkillValueRequest} returns this - */ -proto.models.proto.cofd.api.UpdateSkillValueRequest.prototype.setSkillName = function(value) { - return jspb.Message.setProto3StringField(this, 3, value); -}; - - -/** - * optional int32 skill_value = 4; - * @return {number} - */ -proto.models.proto.cofd.api.UpdateSkillValueRequest.prototype.getSkillValue = function() { - return /** @type {number} */ (jspb.Message.getFieldWithDefault(this, 4, 0)); -}; - - -/** - * @param {number} value - * @return {!proto.models.proto.cofd.api.UpdateSkillValueRequest} returns this - */ -proto.models.proto.cofd.api.UpdateSkillValueRequest.prototype.setSkillValue = function(value) { - return jspb.Message.setProto3IntField(this, 4, value); -}; - - - -/** - * List of repeated fields within this message type. - * @private {!Array} - * @const - */ -proto.models.proto.cofd.api.SkillSpecializationsUpdate.repeatedFields_ = [2]; - - - -if (jspb.Message.GENERATE_TO_OBJECT) { -/** - * Creates an object representation of this proto. - * Field names that are reserved in JavaScript and will be renamed to pb_name. - * Optional fields that are not set will be set to undefined. - * To access a reserved field use, foo.pb_, eg, foo.pb_default. - * For the list of reserved names please see: - * net/proto2/compiler/js/internal/generator.cc#kKeyword. - * @param {boolean=} opt_includeInstance Deprecated. whether to include the - * JSPB instance for transitional soy proto support: - * http://goto/soy-param-migration - * @return {!Object} - */ -proto.models.proto.cofd.api.SkillSpecializationsUpdate.prototype.toObject = function(opt_includeInstance) { - return proto.models.proto.cofd.api.SkillSpecializationsUpdate.toObject(opt_includeInstance, this); -}; - - -/** - * Static version of the {@see toObject} method. - * @param {boolean|undefined} includeInstance Deprecated. Whether to include - * the JSPB instance for transitional soy proto support: - * http://goto/soy-param-migration - * @param {!proto.models.proto.cofd.api.SkillSpecializationsUpdate} msg The msg instance to transform. - * @return {!Object} - * @suppress {unusedLocalVariables} f is only used for nested messages - */ -proto.models.proto.cofd.api.SkillSpecializationsUpdate.toObject = function(includeInstance, msg) { - var f, obj = { - name: jspb.Message.getFieldWithDefault(msg, 1, ""), - specializationsList: (f = jspb.Message.getRepeatedField(msg, 2)) == null ? undefined : f - }; - - if (includeInstance) { - obj.$jspbMessageInstance = msg; - } - return obj; -}; -} - - -/** - * Deserializes binary data (in protobuf wire format). - * @param {jspb.ByteSource} bytes The bytes to deserialize. - * @return {!proto.models.proto.cofd.api.SkillSpecializationsUpdate} - */ -proto.models.proto.cofd.api.SkillSpecializationsUpdate.deserializeBinary = function(bytes) { - var reader = new jspb.BinaryReader(bytes); - var msg = new proto.models.proto.cofd.api.SkillSpecializationsUpdate; - return proto.models.proto.cofd.api.SkillSpecializationsUpdate.deserializeBinaryFromReader(msg, reader); -}; - - -/** - * Deserializes binary data (in protobuf wire format) from the - * given reader into the given message object. - * @param {!proto.models.proto.cofd.api.SkillSpecializationsUpdate} msg The message object to deserialize into. - * @param {!jspb.BinaryReader} reader The BinaryReader to use. - * @return {!proto.models.proto.cofd.api.SkillSpecializationsUpdate} - */ -proto.models.proto.cofd.api.SkillSpecializationsUpdate.deserializeBinaryFromReader = function(msg, reader) { - while (reader.nextField()) { - if (reader.isEndGroup()) { - break; - } - var field = reader.getFieldNumber(); - switch (field) { - case 1: - var value = /** @type {string} */ (reader.readString()); - msg.setName(value); - break; - case 2: - var value = /** @type {string} */ (reader.readString()); - msg.addSpecializations(value); - break; - default: - reader.skipField(); - break; - } - } - return msg; -}; - - -/** - * Serializes the message to binary data (in protobuf wire format). - * @return {!Uint8Array} - */ -proto.models.proto.cofd.api.SkillSpecializationsUpdate.prototype.serializeBinary = function() { - var writer = new jspb.BinaryWriter(); - proto.models.proto.cofd.api.SkillSpecializationsUpdate.serializeBinaryToWriter(this, writer); - return writer.getResultBuffer(); -}; - - -/** - * Serializes the given message to binary data (in protobuf wire - * format), writing to the given BinaryWriter. - * @param {!proto.models.proto.cofd.api.SkillSpecializationsUpdate} message - * @param {!jspb.BinaryWriter} writer - * @suppress {unusedLocalVariables} f is only used for nested messages - */ -proto.models.proto.cofd.api.SkillSpecializationsUpdate.serializeBinaryToWriter = function(message, writer) { - var f = undefined; - f = message.getName(); - if (f.length > 0) { - writer.writeString( - 1, - f - ); - } - f = message.getSpecializationsList(); - if (f.length > 0) { - writer.writeRepeatedString( - 2, - f - ); - } -}; - - -/** - * optional string name = 1; - * @return {string} - */ -proto.models.proto.cofd.api.SkillSpecializationsUpdate.prototype.getName = function() { - return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 1, "")); -}; - - -/** - * @param {string} value - * @return {!proto.models.proto.cofd.api.SkillSpecializationsUpdate} returns this - */ -proto.models.proto.cofd.api.SkillSpecializationsUpdate.prototype.setName = function(value) { - return jspb.Message.setProto3StringField(this, 1, value); -}; - - -/** - * repeated string specializations = 2; - * @return {!Array} - */ -proto.models.proto.cofd.api.SkillSpecializationsUpdate.prototype.getSpecializationsList = function() { - return /** @type {!Array} */ (jspb.Message.getRepeatedField(this, 2)); -}; - - -/** - * @param {!Array} value - * @return {!proto.models.proto.cofd.api.SkillSpecializationsUpdate} returns this - */ -proto.models.proto.cofd.api.SkillSpecializationsUpdate.prototype.setSpecializationsList = function(value) { - return jspb.Message.setField(this, 2, value || []); -}; - - -/** - * @param {string} value - * @param {number=} opt_index - * @return {!proto.models.proto.cofd.api.SkillSpecializationsUpdate} returns this - */ -proto.models.proto.cofd.api.SkillSpecializationsUpdate.prototype.addSpecializations = function(value, opt_index) { - return jspb.Message.addToRepeatedField(this, 2, value, opt_index); -}; - - -/** - * Clears the list making it empty but non-null. - * @return {!proto.models.proto.cofd.api.SkillSpecializationsUpdate} returns this - */ -proto.models.proto.cofd.api.SkillSpecializationsUpdate.prototype.clearSpecializationsList = function() { - return this.setSpecializationsList([]); -}; - - - - - -if (jspb.Message.GENERATE_TO_OBJECT) { -/** - * Creates an object representation of this proto. - * Field names that are reserved in JavaScript and will be renamed to pb_name. - * Optional fields that are not set will be set to undefined. - * To access a reserved field use, foo.pb_, eg, foo.pb_default. - * For the list of reserved names please see: - * net/proto2/compiler/js/internal/generator.cc#kKeyword. - * @param {boolean=} opt_includeInstance Deprecated. whether to include the - * JSPB instance for transitional soy proto support: - * http://goto/soy-param-migration - * @return {!Object} - */ -proto.models.proto.cofd.api.Condition.prototype.toObject = function(opt_includeInstance) { - return proto.models.proto.cofd.api.Condition.toObject(opt_includeInstance, this); -}; - - -/** - * Static version of the {@see toObject} method. - * @param {boolean|undefined} includeInstance Deprecated. Whether to include - * the JSPB instance for transitional soy proto support: - * http://goto/soy-param-migration - * @param {!proto.models.proto.cofd.api.Condition} msg The msg instance to transform. - * @return {!Object} - * @suppress {unusedLocalVariables} f is only used for nested messages - */ -proto.models.proto.cofd.api.Condition.toObject = function(includeInstance, msg) { - var f, obj = { - name: jspb.Message.getFieldWithDefault(msg, 1, "") - }; - - if (includeInstance) { - obj.$jspbMessageInstance = msg; - } - return obj; -}; -} - - -/** - * Deserializes binary data (in protobuf wire format). - * @param {jspb.ByteSource} bytes The bytes to deserialize. - * @return {!proto.models.proto.cofd.api.Condition} - */ -proto.models.proto.cofd.api.Condition.deserializeBinary = function(bytes) { - var reader = new jspb.BinaryReader(bytes); - var msg = new proto.models.proto.cofd.api.Condition; - return proto.models.proto.cofd.api.Condition.deserializeBinaryFromReader(msg, reader); -}; - - -/** - * Deserializes binary data (in protobuf wire format) from the - * given reader into the given message object. - * @param {!proto.models.proto.cofd.api.Condition} msg The message object to deserialize into. - * @param {!jspb.BinaryReader} reader The BinaryReader to use. - * @return {!proto.models.proto.cofd.api.Condition} - */ -proto.models.proto.cofd.api.Condition.deserializeBinaryFromReader = function(msg, reader) { - while (reader.nextField()) { - if (reader.isEndGroup()) { - break; - } - var field = reader.getFieldNumber(); - switch (field) { - case 1: - var value = /** @type {string} */ (reader.readString()); - msg.setName(value); - break; - default: - reader.skipField(); - break; - } - } - return msg; -}; - - -/** - * Serializes the message to binary data (in protobuf wire format). - * @return {!Uint8Array} - */ -proto.models.proto.cofd.api.Condition.prototype.serializeBinary = function() { - var writer = new jspb.BinaryWriter(); - proto.models.proto.cofd.api.Condition.serializeBinaryToWriter(this, writer); - return writer.getResultBuffer(); -}; - - -/** - * Serializes the given message to binary data (in protobuf wire - * format), writing to the given BinaryWriter. - * @param {!proto.models.proto.cofd.api.Condition} message - * @param {!jspb.BinaryWriter} writer - * @suppress {unusedLocalVariables} f is only used for nested messages - */ -proto.models.proto.cofd.api.Condition.serializeBinaryToWriter = function(message, writer) { - var f = undefined; - f = message.getName(); - if (f.length > 0) { - writer.writeString( - 1, - f - ); - } -}; - - -/** - * optional string name = 1; - * @return {string} - */ -proto.models.proto.cofd.api.Condition.prototype.getName = function() { - return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 1, "")); -}; - - -/** - * @param {string} value - * @return {!proto.models.proto.cofd.api.Condition} returns this - */ -proto.models.proto.cofd.api.Condition.prototype.setName = function(value) { - return jspb.Message.setProto3StringField(this, 1, value); -}; - - -goog.object.extend(exports, proto.models.proto.cofd.api); - - -/***/ }), - -/***/ "./_proto/cofd_pb.js": -/*!***************************!*\ - !*** ./_proto/cofd_pb.js ***! - \***************************/ -/***/ ((__unused_webpack_module, exports, __webpack_require__) => { - -// source: cofd.proto -/** - * @fileoverview - * @enhanceable - * @suppress {messageConventions} JS Compiler reports an error if a variable or - * field starts with 'MSG_' and isn't a translatable message. - * @public - */ -// GENERATED CODE -- DO NOT EDIT! -/* eslint-disable */ -// @ts-nocheck - -var jspb = __webpack_require__(/*! google-protobuf */ "../../node_modules/google-protobuf/google-protobuf.js"); -var goog = jspb; -var global = Function('return this')(); - -goog.exportSymbol('proto.models.proto.cofd.ChangelingFields', null, global); -goog.exportSymbol('proto.models.proto.cofd.CofdSheet', null, global); -goog.exportSymbol('proto.models.proto.cofd.CofdSheet.Attack', null, global); -goog.exportSymbol('proto.models.proto.cofd.CofdSheet.Condition', null, global); -goog.exportSymbol('proto.models.proto.cofd.CofdSheet.Item', null, global); -goog.exportSymbol('proto.models.proto.cofd.CofdSheet.Merit', null, global); -goog.exportSymbol('proto.models.proto.cofd.CofdSheet.Skill', null, global); -goog.exportSymbol('proto.models.proto.cofd.CofdSheet.SystemFieldsCase', null, global); -goog.exportSymbol('proto.models.proto.cofd.CoreFields', null, global); -goog.exportSymbol('proto.models.proto.cofd.MageFields', null, global); -/** - * Generated by JsPbCodeGenerator. - * @param {Array=} opt_data Optional initial data array, typically from a - * server response, or constructed directly in Javascript. The array is used - * in place and becomes part of the constructed object. It is not cloned. - * If no data is provided, the constructed object will be empty, but still - * valid. - * @extends {jspb.Message} - * @constructor - */ -proto.models.proto.cofd.CoreFields = function(opt_data) { - jspb.Message.initialize(this, opt_data, 0, -1, null, null); -}; -goog.inherits(proto.models.proto.cofd.CoreFields, jspb.Message); -if (goog.DEBUG && !COMPILED) { - /** - * @public - * @override - */ - proto.models.proto.cofd.CoreFields.displayName = 'proto.models.proto.cofd.CoreFields'; -} -/** - * Generated by JsPbCodeGenerator. - * @param {Array=} opt_data Optional initial data array, typically from a - * server response, or constructed directly in Javascript. The array is used - * in place and becomes part of the constructed object. It is not cloned. - * If no data is provided, the constructed object will be empty, but still - * valid. - * @extends {jspb.Message} - * @constructor - */ -proto.models.proto.cofd.MageFields = function(opt_data) { - jspb.Message.initialize(this, opt_data, 0, -1, null, null); -}; -goog.inherits(proto.models.proto.cofd.MageFields, jspb.Message); -if (goog.DEBUG && !COMPILED) { - /** - * @public - * @override - */ - proto.models.proto.cofd.MageFields.displayName = 'proto.models.proto.cofd.MageFields'; -} -/** - * Generated by JsPbCodeGenerator. - * @param {Array=} opt_data Optional initial data array, typically from a - * server response, or constructed directly in Javascript. The array is used - * in place and becomes part of the constructed object. It is not cloned. - * If no data is provided, the constructed object will be empty, but still - * valid. - * @extends {jspb.Message} - * @constructor - */ -proto.models.proto.cofd.ChangelingFields = function(opt_data) { - jspb.Message.initialize(this, opt_data, 0, -1, null, null); -}; -goog.inherits(proto.models.proto.cofd.ChangelingFields, jspb.Message); -if (goog.DEBUG && !COMPILED) { - /** - * @public - * @override - */ - proto.models.proto.cofd.ChangelingFields.displayName = 'proto.models.proto.cofd.ChangelingFields'; -} -/** - * Generated by JsPbCodeGenerator. - * @param {Array=} opt_data Optional initial data array, typically from a - * server response, or constructed directly in Javascript. The array is used - * in place and becomes part of the constructed object. It is not cloned. - * If no data is provided, the constructed object will be empty, but still - * valid. - * @extends {jspb.Message} - * @constructor - */ -proto.models.proto.cofd.CofdSheet = function(opt_data) { - jspb.Message.initialize(this, opt_data, 0, -1, proto.models.proto.cofd.CofdSheet.repeatedFields_, proto.models.proto.cofd.CofdSheet.oneofGroups_); -}; -goog.inherits(proto.models.proto.cofd.CofdSheet, jspb.Message); -if (goog.DEBUG && !COMPILED) { - /** - * @public - * @override - */ - proto.models.proto.cofd.CofdSheet.displayName = 'proto.models.proto.cofd.CofdSheet'; -} -/** - * Generated by JsPbCodeGenerator. - * @param {Array=} opt_data Optional initial data array, typically from a - * server response, or constructed directly in Javascript. The array is used - * in place and becomes part of the constructed object. It is not cloned. - * If no data is provided, the constructed object will be empty, but still - * valid. - * @extends {jspb.Message} - * @constructor - */ -proto.models.proto.cofd.CofdSheet.Merit = function(opt_data) { - jspb.Message.initialize(this, opt_data, 0, -1, null, null); -}; -goog.inherits(proto.models.proto.cofd.CofdSheet.Merit, jspb.Message); -if (goog.DEBUG && !COMPILED) { - /** - * @public - * @override - */ - proto.models.proto.cofd.CofdSheet.Merit.displayName = 'proto.models.proto.cofd.CofdSheet.Merit'; -} -/** - * Generated by JsPbCodeGenerator. - * @param {Array=} opt_data Optional initial data array, typically from a - * server response, or constructed directly in Javascript. The array is used - * in place and becomes part of the constructed object. It is not cloned. - * If no data is provided, the constructed object will be empty, but still - * valid. - * @extends {jspb.Message} - * @constructor - */ -proto.models.proto.cofd.CofdSheet.Condition = function(opt_data) { - jspb.Message.initialize(this, opt_data, 0, -1, null, null); -}; -goog.inherits(proto.models.proto.cofd.CofdSheet.Condition, jspb.Message); -if (goog.DEBUG && !COMPILED) { - /** - * @public - * @override - */ - proto.models.proto.cofd.CofdSheet.Condition.displayName = 'proto.models.proto.cofd.CofdSheet.Condition'; -} -/** - * Generated by JsPbCodeGenerator. - * @param {Array=} opt_data Optional initial data array, typically from a - * server response, or constructed directly in Javascript. The array is used - * in place and becomes part of the constructed object. It is not cloned. - * If no data is provided, the constructed object will be empty, but still - * valid. - * @extends {jspb.Message} - * @constructor - */ -proto.models.proto.cofd.CofdSheet.Skill = function(opt_data) { - jspb.Message.initialize(this, opt_data, 0, -1, proto.models.proto.cofd.CofdSheet.Skill.repeatedFields_, null); -}; -goog.inherits(proto.models.proto.cofd.CofdSheet.Skill, jspb.Message); -if (goog.DEBUG && !COMPILED) { - /** - * @public - * @override - */ - proto.models.proto.cofd.CofdSheet.Skill.displayName = 'proto.models.proto.cofd.CofdSheet.Skill'; -} -/** - * Generated by JsPbCodeGenerator. - * @param {Array=} opt_data Optional initial data array, typically from a - * server response, or constructed directly in Javascript. The array is used - * in place and becomes part of the constructed object. It is not cloned. - * If no data is provided, the constructed object will be empty, but still - * valid. - * @extends {jspb.Message} - * @constructor - */ -proto.models.proto.cofd.CofdSheet.Item = function(opt_data) { - jspb.Message.initialize(this, opt_data, 0, -1, null, null); -}; -goog.inherits(proto.models.proto.cofd.CofdSheet.Item, jspb.Message); -if (goog.DEBUG && !COMPILED) { - /** - * @public - * @override - */ - proto.models.proto.cofd.CofdSheet.Item.displayName = 'proto.models.proto.cofd.CofdSheet.Item'; -} -/** - * Generated by JsPbCodeGenerator. - * @param {Array=} opt_data Optional initial data array, typically from a - * server response, or constructed directly in Javascript. The array is used - * in place and becomes part of the constructed object. It is not cloned. - * If no data is provided, the constructed object will be empty, but still - * valid. - * @extends {jspb.Message} - * @constructor - */ -proto.models.proto.cofd.CofdSheet.Attack = function(opt_data) { - jspb.Message.initialize(this, opt_data, 0, -1, null, null); -}; -goog.inherits(proto.models.proto.cofd.CofdSheet.Attack, jspb.Message); -if (goog.DEBUG && !COMPILED) { - /** - * @public - * @override - */ - proto.models.proto.cofd.CofdSheet.Attack.displayName = 'proto.models.proto.cofd.CofdSheet.Attack'; -} - - - -if (jspb.Message.GENERATE_TO_OBJECT) { -/** - * Creates an object representation of this proto. - * Field names that are reserved in JavaScript and will be renamed to pb_name. - * Optional fields that are not set will be set to undefined. - * To access a reserved field use, foo.pb_, eg, foo.pb_default. - * For the list of reserved names please see: - * net/proto2/compiler/js/internal/generator.cc#kKeyword. - * @param {boolean=} opt_includeInstance Deprecated. whether to include the - * JSPB instance for transitional soy proto support: - * http://goto/soy-param-migration - * @return {!Object} - */ -proto.models.proto.cofd.CoreFields.prototype.toObject = function(opt_includeInstance) { - return proto.models.proto.cofd.CoreFields.toObject(opt_includeInstance, this); -}; - - -/** - * Static version of the {@see toObject} method. - * @param {boolean|undefined} includeInstance Deprecated. Whether to include - * the JSPB instance for transitional soy proto support: - * http://goto/soy-param-migration - * @param {!proto.models.proto.cofd.CoreFields} msg The msg instance to transform. - * @return {!Object} - * @suppress {unusedLocalVariables} f is only used for nested messages - */ -proto.models.proto.cofd.CoreFields.toObject = function(includeInstance, msg) { - var f, obj = { - integrity: jspb.Message.getFieldWithDefault(msg, 1, 0) - }; - - if (includeInstance) { - obj.$jspbMessageInstance = msg; - } - return obj; -}; -} - - -/** - * Deserializes binary data (in protobuf wire format). - * @param {jspb.ByteSource} bytes The bytes to deserialize. - * @return {!proto.models.proto.cofd.CoreFields} - */ -proto.models.proto.cofd.CoreFields.deserializeBinary = function(bytes) { - var reader = new jspb.BinaryReader(bytes); - var msg = new proto.models.proto.cofd.CoreFields; - return proto.models.proto.cofd.CoreFields.deserializeBinaryFromReader(msg, reader); -}; - - -/** - * Deserializes binary data (in protobuf wire format) from the - * given reader into the given message object. - * @param {!proto.models.proto.cofd.CoreFields} msg The message object to deserialize into. - * @param {!jspb.BinaryReader} reader The BinaryReader to use. - * @return {!proto.models.proto.cofd.CoreFields} - */ -proto.models.proto.cofd.CoreFields.deserializeBinaryFromReader = function(msg, reader) { - while (reader.nextField()) { - if (reader.isEndGroup()) { - break; - } - var field = reader.getFieldNumber(); - switch (field) { - case 1: - var value = /** @type {number} */ (reader.readInt32()); - msg.setIntegrity(value); - break; - default: - reader.skipField(); - break; - } - } - return msg; -}; - - -/** - * Serializes the message to binary data (in protobuf wire format). - * @return {!Uint8Array} - */ -proto.models.proto.cofd.CoreFields.prototype.serializeBinary = function() { - var writer = new jspb.BinaryWriter(); - proto.models.proto.cofd.CoreFields.serializeBinaryToWriter(this, writer); - return writer.getResultBuffer(); -}; - - -/** - * Serializes the given message to binary data (in protobuf wire - * format), writing to the given BinaryWriter. - * @param {!proto.models.proto.cofd.CoreFields} message - * @param {!jspb.BinaryWriter} writer - * @suppress {unusedLocalVariables} f is only used for nested messages - */ -proto.models.proto.cofd.CoreFields.serializeBinaryToWriter = function(message, writer) { - var f = undefined; - f = message.getIntegrity(); - if (f !== 0) { - writer.writeInt32( - 1, - f - ); - } -}; - - -/** - * optional int32 integrity = 1; - * @return {number} - */ -proto.models.proto.cofd.CoreFields.prototype.getIntegrity = function() { - return /** @type {number} */ (jspb.Message.getFieldWithDefault(this, 1, 0)); -}; - - -/** - * @param {number} value - * @return {!proto.models.proto.cofd.CoreFields} returns this - */ -proto.models.proto.cofd.CoreFields.prototype.setIntegrity = function(value) { - return jspb.Message.setProto3IntField(this, 1, value); -}; - - - - - -if (jspb.Message.GENERATE_TO_OBJECT) { -/** - * Creates an object representation of this proto. - * Field names that are reserved in JavaScript and will be renamed to pb_name. - * Optional fields that are not set will be set to undefined. - * To access a reserved field use, foo.pb_, eg, foo.pb_default. - * For the list of reserved names please see: - * net/proto2/compiler/js/internal/generator.cc#kKeyword. - * @param {boolean=} opt_includeInstance Deprecated. whether to include the - * JSPB instance for transitional soy proto support: - * http://goto/soy-param-migration - * @return {!Object} - */ -proto.models.proto.cofd.MageFields.prototype.toObject = function(opt_includeInstance) { - return proto.models.proto.cofd.MageFields.toObject(opt_includeInstance, this); -}; - - -/** - * Static version of the {@see toObject} method. - * @param {boolean|undefined} includeInstance Deprecated. Whether to include - * the JSPB instance for transitional soy proto support: - * http://goto/soy-param-migration - * @param {!proto.models.proto.cofd.MageFields} msg The msg instance to transform. - * @return {!Object} - * @suppress {unusedLocalVariables} f is only used for nested messages - */ -proto.models.proto.cofd.MageFields.toObject = function(includeInstance, msg) { - var f, obj = { - widsom: jspb.Message.getFieldWithDefault(msg, 1, 0) - }; - - if (includeInstance) { - obj.$jspbMessageInstance = msg; - } - return obj; -}; -} - - -/** - * Deserializes binary data (in protobuf wire format). - * @param {jspb.ByteSource} bytes The bytes to deserialize. - * @return {!proto.models.proto.cofd.MageFields} - */ -proto.models.proto.cofd.MageFields.deserializeBinary = function(bytes) { - var reader = new jspb.BinaryReader(bytes); - var msg = new proto.models.proto.cofd.MageFields; - return proto.models.proto.cofd.MageFields.deserializeBinaryFromReader(msg, reader); -}; - - -/** - * Deserializes binary data (in protobuf wire format) from the - * given reader into the given message object. - * @param {!proto.models.proto.cofd.MageFields} msg The message object to deserialize into. - * @param {!jspb.BinaryReader} reader The BinaryReader to use. - * @return {!proto.models.proto.cofd.MageFields} - */ -proto.models.proto.cofd.MageFields.deserializeBinaryFromReader = function(msg, reader) { - while (reader.nextField()) { - if (reader.isEndGroup()) { - break; - } - var field = reader.getFieldNumber(); - switch (field) { - case 1: - var value = /** @type {number} */ (reader.readInt32()); - msg.setWidsom(value); - break; - default: - reader.skipField(); - break; - } - } - return msg; -}; - - -/** - * Serializes the message to binary data (in protobuf wire format). - * @return {!Uint8Array} - */ -proto.models.proto.cofd.MageFields.prototype.serializeBinary = function() { - var writer = new jspb.BinaryWriter(); - proto.models.proto.cofd.MageFields.serializeBinaryToWriter(this, writer); - return writer.getResultBuffer(); -}; - - -/** - * Serializes the given message to binary data (in protobuf wire - * format), writing to the given BinaryWriter. - * @param {!proto.models.proto.cofd.MageFields} message - * @param {!jspb.BinaryWriter} writer - * @suppress {unusedLocalVariables} f is only used for nested messages - */ -proto.models.proto.cofd.MageFields.serializeBinaryToWriter = function(message, writer) { - var f = undefined; - f = message.getWidsom(); - if (f !== 0) { - writer.writeInt32( - 1, - f - ); - } -}; - - -/** - * optional int32 widsom = 1; - * @return {number} - */ -proto.models.proto.cofd.MageFields.prototype.getWidsom = function() { - return /** @type {number} */ (jspb.Message.getFieldWithDefault(this, 1, 0)); -}; - - -/** - * @param {number} value - * @return {!proto.models.proto.cofd.MageFields} returns this - */ -proto.models.proto.cofd.MageFields.prototype.setWidsom = function(value) { - return jspb.Message.setProto3IntField(this, 1, value); -}; - - - - - -if (jspb.Message.GENERATE_TO_OBJECT) { -/** - * Creates an object representation of this proto. - * Field names that are reserved in JavaScript and will be renamed to pb_name. - * Optional fields that are not set will be set to undefined. - * To access a reserved field use, foo.pb_, eg, foo.pb_default. - * For the list of reserved names please see: - * net/proto2/compiler/js/internal/generator.cc#kKeyword. - * @param {boolean=} opt_includeInstance Deprecated. whether to include the - * JSPB instance for transitional soy proto support: - * http://goto/soy-param-migration - * @return {!Object} - */ -proto.models.proto.cofd.ChangelingFields.prototype.toObject = function(opt_includeInstance) { - return proto.models.proto.cofd.ChangelingFields.toObject(opt_includeInstance, this); -}; - - -/** - * Static version of the {@see toObject} method. - * @param {boolean|undefined} includeInstance Deprecated. Whether to include - * the JSPB instance for transitional soy proto support: - * http://goto/soy-param-migration - * @param {!proto.models.proto.cofd.ChangelingFields} msg The msg instance to transform. - * @return {!Object} - * @suppress {unusedLocalVariables} f is only used for nested messages - */ -proto.models.proto.cofd.ChangelingFields.toObject = function(includeInstance, msg) { - var f, obj = { - clarity: jspb.Message.getFieldWithDefault(msg, 1, 0) - }; - - if (includeInstance) { - obj.$jspbMessageInstance = msg; - } - return obj; -}; -} - - -/** - * Deserializes binary data (in protobuf wire format). - * @param {jspb.ByteSource} bytes The bytes to deserialize. - * @return {!proto.models.proto.cofd.ChangelingFields} - */ -proto.models.proto.cofd.ChangelingFields.deserializeBinary = function(bytes) { - var reader = new jspb.BinaryReader(bytes); - var msg = new proto.models.proto.cofd.ChangelingFields; - return proto.models.proto.cofd.ChangelingFields.deserializeBinaryFromReader(msg, reader); -}; - - -/** - * Deserializes binary data (in protobuf wire format) from the - * given reader into the given message object. - * @param {!proto.models.proto.cofd.ChangelingFields} msg The message object to deserialize into. - * @param {!jspb.BinaryReader} reader The BinaryReader to use. - * @return {!proto.models.proto.cofd.ChangelingFields} - */ -proto.models.proto.cofd.ChangelingFields.deserializeBinaryFromReader = function(msg, reader) { - while (reader.nextField()) { - if (reader.isEndGroup()) { - break; - } - var field = reader.getFieldNumber(); - switch (field) { - case 1: - var value = /** @type {number} */ (reader.readInt32()); - msg.setClarity(value); - break; - default: - reader.skipField(); - break; - } - } - return msg; -}; - - -/** - * Serializes the message to binary data (in protobuf wire format). - * @return {!Uint8Array} - */ -proto.models.proto.cofd.ChangelingFields.prototype.serializeBinary = function() { - var writer = new jspb.BinaryWriter(); - proto.models.proto.cofd.ChangelingFields.serializeBinaryToWriter(this, writer); - return writer.getResultBuffer(); -}; - - -/** - * Serializes the given message to binary data (in protobuf wire - * format), writing to the given BinaryWriter. - * @param {!proto.models.proto.cofd.ChangelingFields} message - * @param {!jspb.BinaryWriter} writer - * @suppress {unusedLocalVariables} f is only used for nested messages - */ -proto.models.proto.cofd.ChangelingFields.serializeBinaryToWriter = function(message, writer) { - var f = undefined; - f = message.getClarity(); - if (f !== 0) { - writer.writeInt32( - 1, - f - ); - } -}; - - -/** - * optional int32 clarity = 1; - * @return {number} - */ -proto.models.proto.cofd.ChangelingFields.prototype.getClarity = function() { - return /** @type {number} */ (jspb.Message.getFieldWithDefault(this, 1, 0)); -}; - - -/** - * @param {number} value - * @return {!proto.models.proto.cofd.ChangelingFields} returns this - */ -proto.models.proto.cofd.ChangelingFields.prototype.setClarity = function(value) { - return jspb.Message.setProto3IntField(this, 1, value); -}; - - - -/** - * List of repeated fields within this message type. - * @private {!Array} - * @const - */ -proto.models.proto.cofd.CofdSheet.repeatedFields_ = [15,19,25,26]; - -/** - * Oneof group definitions for this message. Each group defines the field - * numbers belonging to that group. When of these fields' value is set, all - * other fields in the group are cleared. During deserialization, if multiple - * fields are encountered for a group, only the last value seen will be kept. - * @private {!Array>} - * @const - */ -proto.models.proto.cofd.CofdSheet.oneofGroups_ = [[28,29,30]]; - -/** - * @enum {number} - */ -proto.models.proto.cofd.CofdSheet.SystemFieldsCase = { - SYSTEM_FIELDS_NOT_SET: 0, - CORE: 28, - MAGE: 29, - CHANGELING: 30 -}; - -/** - * @return {proto.models.proto.cofd.CofdSheet.SystemFieldsCase} - */ -proto.models.proto.cofd.CofdSheet.prototype.getSystemFieldsCase = function() { - return /** @type {proto.models.proto.cofd.CofdSheet.SystemFieldsCase} */(jspb.Message.computeOneofCase(this, proto.models.proto.cofd.CofdSheet.oneofGroups_[0])); -}; - - - -if (jspb.Message.GENERATE_TO_OBJECT) { -/** - * Creates an object representation of this proto. - * Field names that are reserved in JavaScript and will be renamed to pb_name. - * Optional fields that are not set will be set to undefined. - * To access a reserved field use, foo.pb_, eg, foo.pb_default. - * For the list of reserved names please see: - * net/proto2/compiler/js/internal/generator.cc#kKeyword. - * @param {boolean=} opt_includeInstance Deprecated. whether to include the - * JSPB instance for transitional soy proto support: - * http://goto/soy-param-migration - * @return {!Object} - */ -proto.models.proto.cofd.CofdSheet.prototype.toObject = function(opt_includeInstance) { - return proto.models.proto.cofd.CofdSheet.toObject(opt_includeInstance, this); -}; - - -/** - * Static version of the {@see toObject} method. - * @param {boolean|undefined} includeInstance Deprecated. Whether to include - * the JSPB instance for transitional soy proto support: - * http://goto/soy-param-migration - * @param {!proto.models.proto.cofd.CofdSheet} msg The msg instance to transform. - * @return {!Object} - * @suppress {unusedLocalVariables} f is only used for nested messages - */ -proto.models.proto.cofd.CofdSheet.toObject = function(includeInstance, msg) { - var f, obj = { - name: jspb.Message.getFieldWithDefault(msg, 1, ""), - player: jspb.Message.getFieldWithDefault(msg, 2, ""), - campaign: jspb.Message.getFieldWithDefault(msg, 3, ""), - description: jspb.Message.getFieldWithDefault(msg, 4, ""), - strength: jspb.Message.getFieldWithDefault(msg, 6, 0), - dexterity: jspb.Message.getFieldWithDefault(msg, 7, 0), - stamina: jspb.Message.getFieldWithDefault(msg, 8, 0), - intelligence: jspb.Message.getFieldWithDefault(msg, 9, 0), - wits: jspb.Message.getFieldWithDefault(msg, 10, 0), - resolve: jspb.Message.getFieldWithDefault(msg, 11, 0), - presence: jspb.Message.getFieldWithDefault(msg, 12, 0), - manipulation: jspb.Message.getFieldWithDefault(msg, 13, 0), - composure: jspb.Message.getFieldWithDefault(msg, 14, 0), - physicalSkillsMap: (f = msg.getPhysicalSkillsMap()) ? f.toObject(includeInstance, proto.models.proto.cofd.CofdSheet.Skill.toObject) : [], - mentalSkillsMap: (f = msg.getMentalSkillsMap()) ? f.toObject(includeInstance, proto.models.proto.cofd.CofdSheet.Skill.toObject) : [], - socialSkillsMap: (f = msg.getSocialSkillsMap()) ? f.toObject(includeInstance, proto.models.proto.cofd.CofdSheet.Skill.toObject) : [], - meritsList: jspb.Message.toObjectList(msg.getMeritsList(), - proto.models.proto.cofd.CofdSheet.Merit.toObject, includeInstance), - conditionsList: jspb.Message.toObjectList(msg.getConditionsList(), - proto.models.proto.cofd.CofdSheet.Condition.toObject, includeInstance), - size: jspb.Message.getFieldWithDefault(msg, 20, 0), - health: jspb.Message.getFieldWithDefault(msg, 21, 0), - willpower: jspb.Message.getFieldWithDefault(msg, 22, 0), - experiencePoints: jspb.Message.getFieldWithDefault(msg, 23, 0), - beats: jspb.Message.getFieldWithDefault(msg, 24, 0), - itemsList: jspb.Message.toObjectList(msg.getItemsList(), - proto.models.proto.cofd.CofdSheet.Item.toObject, includeInstance), - attacksList: jspb.Message.toObjectList(msg.getAttacksList(), - proto.models.proto.cofd.CofdSheet.Attack.toObject, includeInstance), - otherDataMap: (f = msg.getOtherDataMap()) ? f.toObject(includeInstance, undefined) : [], - core: (f = msg.getCore()) && proto.models.proto.cofd.CoreFields.toObject(includeInstance, f), - mage: (f = msg.getMage()) && proto.models.proto.cofd.MageFields.toObject(includeInstance, f), - changeling: (f = msg.getChangeling()) && proto.models.proto.cofd.ChangelingFields.toObject(includeInstance, f) - }; - - if (includeInstance) { - obj.$jspbMessageInstance = msg; - } - return obj; -}; -} - - -/** - * Deserializes binary data (in protobuf wire format). - * @param {jspb.ByteSource} bytes The bytes to deserialize. - * @return {!proto.models.proto.cofd.CofdSheet} - */ -proto.models.proto.cofd.CofdSheet.deserializeBinary = function(bytes) { - var reader = new jspb.BinaryReader(bytes); - var msg = new proto.models.proto.cofd.CofdSheet; - return proto.models.proto.cofd.CofdSheet.deserializeBinaryFromReader(msg, reader); -}; - - -/** - * Deserializes binary data (in protobuf wire format) from the - * given reader into the given message object. - * @param {!proto.models.proto.cofd.CofdSheet} msg The message object to deserialize into. - * @param {!jspb.BinaryReader} reader The BinaryReader to use. - * @return {!proto.models.proto.cofd.CofdSheet} - */ -proto.models.proto.cofd.CofdSheet.deserializeBinaryFromReader = function(msg, reader) { - while (reader.nextField()) { - if (reader.isEndGroup()) { - break; - } - var field = reader.getFieldNumber(); - switch (field) { - case 1: - var value = /** @type {string} */ (reader.readString()); - msg.setName(value); - break; - case 2: - var value = /** @type {string} */ (reader.readString()); - msg.setPlayer(value); - break; - case 3: - var value = /** @type {string} */ (reader.readString()); - msg.setCampaign(value); - break; - case 4: - var value = /** @type {string} */ (reader.readString()); - msg.setDescription(value); - break; - case 6: - var value = /** @type {number} */ (reader.readInt32()); - msg.setStrength(value); - break; - case 7: - var value = /** @type {number} */ (reader.readInt32()); - msg.setDexterity(value); - break; - case 8: - var value = /** @type {number} */ (reader.readInt32()); - msg.setStamina(value); - break; - case 9: - var value = /** @type {number} */ (reader.readInt32()); - msg.setIntelligence(value); - break; - case 10: - var value = /** @type {number} */ (reader.readInt32()); - msg.setWits(value); - break; - case 11: - var value = /** @type {number} */ (reader.readInt32()); - msg.setResolve(value); - break; - case 12: - var value = /** @type {number} */ (reader.readInt32()); - msg.setPresence(value); - break; - case 13: - var value = /** @type {number} */ (reader.readInt32()); - msg.setManipulation(value); - break; - case 14: - var value = /** @type {number} */ (reader.readInt32()); - msg.setComposure(value); - break; - case 16: - var value = msg.getPhysicalSkillsMap(); - reader.readMessage(value, function(message, reader) { - jspb.Map.deserializeBinary(message, reader, jspb.BinaryReader.prototype.readString, jspb.BinaryReader.prototype.readMessage, proto.models.proto.cofd.CofdSheet.Skill.deserializeBinaryFromReader, "", new proto.models.proto.cofd.CofdSheet.Skill()); - }); - break; - case 17: - var value = msg.getMentalSkillsMap(); - reader.readMessage(value, function(message, reader) { - jspb.Map.deserializeBinary(message, reader, jspb.BinaryReader.prototype.readString, jspb.BinaryReader.prototype.readMessage, proto.models.proto.cofd.CofdSheet.Skill.deserializeBinaryFromReader, "", new proto.models.proto.cofd.CofdSheet.Skill()); - }); - break; - case 18: - var value = msg.getSocialSkillsMap(); - reader.readMessage(value, function(message, reader) { - jspb.Map.deserializeBinary(message, reader, jspb.BinaryReader.prototype.readString, jspb.BinaryReader.prototype.readMessage, proto.models.proto.cofd.CofdSheet.Skill.deserializeBinaryFromReader, "", new proto.models.proto.cofd.CofdSheet.Skill()); - }); - break; - case 15: - var value = new proto.models.proto.cofd.CofdSheet.Merit; - reader.readMessage(value,proto.models.proto.cofd.CofdSheet.Merit.deserializeBinaryFromReader); - msg.addMerits(value); - break; - case 19: - var value = new proto.models.proto.cofd.CofdSheet.Condition; - reader.readMessage(value,proto.models.proto.cofd.CofdSheet.Condition.deserializeBinaryFromReader); - msg.addConditions(value); - break; - case 20: - var value = /** @type {number} */ (reader.readInt32()); - msg.setSize(value); - break; - case 21: - var value = /** @type {number} */ (reader.readInt32()); - msg.setHealth(value); - break; - case 22: - var value = /** @type {number} */ (reader.readInt32()); - msg.setWillpower(value); - break; - case 23: - var value = /** @type {number} */ (reader.readInt32()); - msg.setExperiencePoints(value); - break; - case 24: - var value = /** @type {number} */ (reader.readInt32()); - msg.setBeats(value); - break; - case 25: - var value = new proto.models.proto.cofd.CofdSheet.Item; - reader.readMessage(value,proto.models.proto.cofd.CofdSheet.Item.deserializeBinaryFromReader); - msg.addItems(value); - break; - case 26: - var value = new proto.models.proto.cofd.CofdSheet.Attack; - reader.readMessage(value,proto.models.proto.cofd.CofdSheet.Attack.deserializeBinaryFromReader); - msg.addAttacks(value); - break; - case 27: - var value = msg.getOtherDataMap(); - reader.readMessage(value, function(message, reader) { - jspb.Map.deserializeBinary(message, reader, jspb.BinaryReader.prototype.readString, jspb.BinaryReader.prototype.readString, null, "", ""); - }); - break; - case 28: - var value = new proto.models.proto.cofd.CoreFields; - reader.readMessage(value,proto.models.proto.cofd.CoreFields.deserializeBinaryFromReader); - msg.setCore(value); - break; - case 29: - var value = new proto.models.proto.cofd.MageFields; - reader.readMessage(value,proto.models.proto.cofd.MageFields.deserializeBinaryFromReader); - msg.setMage(value); - break; - case 30: - var value = new proto.models.proto.cofd.ChangelingFields; - reader.readMessage(value,proto.models.proto.cofd.ChangelingFields.deserializeBinaryFromReader); - msg.setChangeling(value); - break; - default: - reader.skipField(); - break; - } - } - return msg; -}; - - -/** - * Serializes the message to binary data (in protobuf wire format). - * @return {!Uint8Array} - */ -proto.models.proto.cofd.CofdSheet.prototype.serializeBinary = function() { - var writer = new jspb.BinaryWriter(); - proto.models.proto.cofd.CofdSheet.serializeBinaryToWriter(this, writer); - return writer.getResultBuffer(); -}; - - -/** - * Serializes the given message to binary data (in protobuf wire - * format), writing to the given BinaryWriter. - * @param {!proto.models.proto.cofd.CofdSheet} message - * @param {!jspb.BinaryWriter} writer - * @suppress {unusedLocalVariables} f is only used for nested messages - */ -proto.models.proto.cofd.CofdSheet.serializeBinaryToWriter = function(message, writer) { - var f = undefined; - f = message.getName(); - if (f.length > 0) { - writer.writeString( - 1, - f - ); - } - f = message.getPlayer(); - if (f.length > 0) { - writer.writeString( - 2, - f - ); - } - f = message.getCampaign(); - if (f.length > 0) { - writer.writeString( - 3, - f - ); - } - f = message.getDescription(); - if (f.length > 0) { - writer.writeString( - 4, - f - ); - } - f = message.getStrength(); - if (f !== 0) { - writer.writeInt32( - 6, - f - ); - } - f = message.getDexterity(); - if (f !== 0) { - writer.writeInt32( - 7, - f - ); - } - f = message.getStamina(); - if (f !== 0) { - writer.writeInt32( - 8, - f - ); - } - f = message.getIntelligence(); - if (f !== 0) { - writer.writeInt32( - 9, - f - ); - } - f = message.getWits(); - if (f !== 0) { - writer.writeInt32( - 10, - f - ); - } - f = message.getResolve(); - if (f !== 0) { - writer.writeInt32( - 11, - f - ); - } - f = message.getPresence(); - if (f !== 0) { - writer.writeInt32( - 12, - f - ); - } - f = message.getManipulation(); - if (f !== 0) { - writer.writeInt32( - 13, - f - ); - } - f = message.getComposure(); - if (f !== 0) { - writer.writeInt32( - 14, - f - ); - } - f = message.getPhysicalSkillsMap(true); - if (f && f.getLength() > 0) { - f.serializeBinary(16, writer, jspb.BinaryWriter.prototype.writeString, jspb.BinaryWriter.prototype.writeMessage, proto.models.proto.cofd.CofdSheet.Skill.serializeBinaryToWriter); - } - f = message.getMentalSkillsMap(true); - if (f && f.getLength() > 0) { - f.serializeBinary(17, writer, jspb.BinaryWriter.prototype.writeString, jspb.BinaryWriter.prototype.writeMessage, proto.models.proto.cofd.CofdSheet.Skill.serializeBinaryToWriter); - } - f = message.getSocialSkillsMap(true); - if (f && f.getLength() > 0) { - f.serializeBinary(18, writer, jspb.BinaryWriter.prototype.writeString, jspb.BinaryWriter.prototype.writeMessage, proto.models.proto.cofd.CofdSheet.Skill.serializeBinaryToWriter); - } - f = message.getMeritsList(); - if (f.length > 0) { - writer.writeRepeatedMessage( - 15, - f, - proto.models.proto.cofd.CofdSheet.Merit.serializeBinaryToWriter - ); - } - f = message.getConditionsList(); - if (f.length > 0) { - writer.writeRepeatedMessage( - 19, - f, - proto.models.proto.cofd.CofdSheet.Condition.serializeBinaryToWriter - ); - } - f = message.getSize(); - if (f !== 0) { - writer.writeInt32( - 20, - f - ); - } - f = message.getHealth(); - if (f !== 0) { - writer.writeInt32( - 21, - f - ); - } - f = message.getWillpower(); - if (f !== 0) { - writer.writeInt32( - 22, - f - ); - } - f = message.getExperiencePoints(); - if (f !== 0) { - writer.writeInt32( - 23, - f - ); - } - f = message.getBeats(); - if (f !== 0) { - writer.writeInt32( - 24, - f - ); - } - f = message.getItemsList(); - if (f.length > 0) { - writer.writeRepeatedMessage( - 25, - f, - proto.models.proto.cofd.CofdSheet.Item.serializeBinaryToWriter - ); - } - f = message.getAttacksList(); - if (f.length > 0) { - writer.writeRepeatedMessage( - 26, - f, - proto.models.proto.cofd.CofdSheet.Attack.serializeBinaryToWriter - ); - } - f = message.getOtherDataMap(true); - if (f && f.getLength() > 0) { - f.serializeBinary(27, writer, jspb.BinaryWriter.prototype.writeString, jspb.BinaryWriter.prototype.writeString); - } - f = message.getCore(); - if (f != null) { - writer.writeMessage( - 28, - f, - proto.models.proto.cofd.CoreFields.serializeBinaryToWriter - ); - } - f = message.getMage(); - if (f != null) { - writer.writeMessage( - 29, - f, - proto.models.proto.cofd.MageFields.serializeBinaryToWriter - ); - } - f = message.getChangeling(); - if (f != null) { - writer.writeMessage( - 30, - f, - proto.models.proto.cofd.ChangelingFields.serializeBinaryToWriter - ); - } -}; - - - - - -if (jspb.Message.GENERATE_TO_OBJECT) { -/** - * Creates an object representation of this proto. - * Field names that are reserved in JavaScript and will be renamed to pb_name. - * Optional fields that are not set will be set to undefined. - * To access a reserved field use, foo.pb_, eg, foo.pb_default. - * For the list of reserved names please see: - * net/proto2/compiler/js/internal/generator.cc#kKeyword. - * @param {boolean=} opt_includeInstance Deprecated. whether to include the - * JSPB instance for transitional soy proto support: - * http://goto/soy-param-migration - * @return {!Object} - */ -proto.models.proto.cofd.CofdSheet.Merit.prototype.toObject = function(opt_includeInstance) { - return proto.models.proto.cofd.CofdSheet.Merit.toObject(opt_includeInstance, this); -}; - - -/** - * Static version of the {@see toObject} method. - * @param {boolean|undefined} includeInstance Deprecated. Whether to include - * the JSPB instance for transitional soy proto support: - * http://goto/soy-param-migration - * @param {!proto.models.proto.cofd.CofdSheet.Merit} msg The msg instance to transform. - * @return {!Object} - * @suppress {unusedLocalVariables} f is only used for nested messages - */ -proto.models.proto.cofd.CofdSheet.Merit.toObject = function(includeInstance, msg) { - var f, obj = { - dots: jspb.Message.getFieldWithDefault(msg, 1, 0), - name: jspb.Message.getFieldWithDefault(msg, 2, "") - }; - - if (includeInstance) { - obj.$jspbMessageInstance = msg; - } - return obj; -}; -} - - -/** - * Deserializes binary data (in protobuf wire format). - * @param {jspb.ByteSource} bytes The bytes to deserialize. - * @return {!proto.models.proto.cofd.CofdSheet.Merit} - */ -proto.models.proto.cofd.CofdSheet.Merit.deserializeBinary = function(bytes) { - var reader = new jspb.BinaryReader(bytes); - var msg = new proto.models.proto.cofd.CofdSheet.Merit; - return proto.models.proto.cofd.CofdSheet.Merit.deserializeBinaryFromReader(msg, reader); -}; - - -/** - * Deserializes binary data (in protobuf wire format) from the - * given reader into the given message object. - * @param {!proto.models.proto.cofd.CofdSheet.Merit} msg The message object to deserialize into. - * @param {!jspb.BinaryReader} reader The BinaryReader to use. - * @return {!proto.models.proto.cofd.CofdSheet.Merit} - */ -proto.models.proto.cofd.CofdSheet.Merit.deserializeBinaryFromReader = function(msg, reader) { - while (reader.nextField()) { - if (reader.isEndGroup()) { - break; - } - var field = reader.getFieldNumber(); - switch (field) { - case 1: - var value = /** @type {number} */ (reader.readInt32()); - msg.setDots(value); - break; - case 2: - var value = /** @type {string} */ (reader.readString()); - msg.setName(value); - break; - default: - reader.skipField(); - break; - } - } - return msg; -}; - - -/** - * Serializes the message to binary data (in protobuf wire format). - * @return {!Uint8Array} - */ -proto.models.proto.cofd.CofdSheet.Merit.prototype.serializeBinary = function() { - var writer = new jspb.BinaryWriter(); - proto.models.proto.cofd.CofdSheet.Merit.serializeBinaryToWriter(this, writer); - return writer.getResultBuffer(); -}; - - -/** - * Serializes the given message to binary data (in protobuf wire - * format), writing to the given BinaryWriter. - * @param {!proto.models.proto.cofd.CofdSheet.Merit} message - * @param {!jspb.BinaryWriter} writer - * @suppress {unusedLocalVariables} f is only used for nested messages - */ -proto.models.proto.cofd.CofdSheet.Merit.serializeBinaryToWriter = function(message, writer) { - var f = undefined; - f = message.getDots(); - if (f !== 0) { - writer.writeInt32( - 1, - f - ); - } - f = message.getName(); - if (f.length > 0) { - writer.writeString( - 2, - f - ); - } -}; - - -/** - * optional int32 dots = 1; - * @return {number} - */ -proto.models.proto.cofd.CofdSheet.Merit.prototype.getDots = function() { - return /** @type {number} */ (jspb.Message.getFieldWithDefault(this, 1, 0)); -}; - - -/** - * @param {number} value - * @return {!proto.models.proto.cofd.CofdSheet.Merit} returns this - */ -proto.models.proto.cofd.CofdSheet.Merit.prototype.setDots = function(value) { - return jspb.Message.setProto3IntField(this, 1, value); -}; - - -/** - * optional string name = 2; - * @return {string} - */ -proto.models.proto.cofd.CofdSheet.Merit.prototype.getName = function() { - return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 2, "")); -}; - - -/** - * @param {string} value - * @return {!proto.models.proto.cofd.CofdSheet.Merit} returns this - */ -proto.models.proto.cofd.CofdSheet.Merit.prototype.setName = function(value) { - return jspb.Message.setProto3StringField(this, 2, value); -}; - - - - - -if (jspb.Message.GENERATE_TO_OBJECT) { -/** - * Creates an object representation of this proto. - * Field names that are reserved in JavaScript and will be renamed to pb_name. - * Optional fields that are not set will be set to undefined. - * To access a reserved field use, foo.pb_, eg, foo.pb_default. - * For the list of reserved names please see: - * net/proto2/compiler/js/internal/generator.cc#kKeyword. - * @param {boolean=} opt_includeInstance Deprecated. whether to include the - * JSPB instance for transitional soy proto support: - * http://goto/soy-param-migration - * @return {!Object} - */ -proto.models.proto.cofd.CofdSheet.Condition.prototype.toObject = function(opt_includeInstance) { - return proto.models.proto.cofd.CofdSheet.Condition.toObject(opt_includeInstance, this); -}; - - -/** - * Static version of the {@see toObject} method. - * @param {boolean|undefined} includeInstance Deprecated. Whether to include - * the JSPB instance for transitional soy proto support: - * http://goto/soy-param-migration - * @param {!proto.models.proto.cofd.CofdSheet.Condition} msg The msg instance to transform. - * @return {!Object} - * @suppress {unusedLocalVariables} f is only used for nested messages - */ -proto.models.proto.cofd.CofdSheet.Condition.toObject = function(includeInstance, msg) { - var f, obj = { - name: jspb.Message.getFieldWithDefault(msg, 1, "") - }; - - if (includeInstance) { - obj.$jspbMessageInstance = msg; - } - return obj; -}; -} - - -/** - * Deserializes binary data (in protobuf wire format). - * @param {jspb.ByteSource} bytes The bytes to deserialize. - * @return {!proto.models.proto.cofd.CofdSheet.Condition} - */ -proto.models.proto.cofd.CofdSheet.Condition.deserializeBinary = function(bytes) { - var reader = new jspb.BinaryReader(bytes); - var msg = new proto.models.proto.cofd.CofdSheet.Condition; - return proto.models.proto.cofd.CofdSheet.Condition.deserializeBinaryFromReader(msg, reader); -}; - - -/** - * Deserializes binary data (in protobuf wire format) from the - * given reader into the given message object. - * @param {!proto.models.proto.cofd.CofdSheet.Condition} msg The message object to deserialize into. - * @param {!jspb.BinaryReader} reader The BinaryReader to use. - * @return {!proto.models.proto.cofd.CofdSheet.Condition} - */ -proto.models.proto.cofd.CofdSheet.Condition.deserializeBinaryFromReader = function(msg, reader) { - while (reader.nextField()) { - if (reader.isEndGroup()) { - break; - } - var field = reader.getFieldNumber(); - switch (field) { - case 1: - var value = /** @type {string} */ (reader.readString()); - msg.setName(value); - break; - default: - reader.skipField(); - break; - } - } - return msg; -}; - - -/** - * Serializes the message to binary data (in protobuf wire format). - * @return {!Uint8Array} - */ -proto.models.proto.cofd.CofdSheet.Condition.prototype.serializeBinary = function() { - var writer = new jspb.BinaryWriter(); - proto.models.proto.cofd.CofdSheet.Condition.serializeBinaryToWriter(this, writer); - return writer.getResultBuffer(); -}; - - -/** - * Serializes the given message to binary data (in protobuf wire - * format), writing to the given BinaryWriter. - * @param {!proto.models.proto.cofd.CofdSheet.Condition} message - * @param {!jspb.BinaryWriter} writer - * @suppress {unusedLocalVariables} f is only used for nested messages - */ -proto.models.proto.cofd.CofdSheet.Condition.serializeBinaryToWriter = function(message, writer) { - var f = undefined; - f = message.getName(); - if (f.length > 0) { - writer.writeString( - 1, - f - ); - } -}; - - -/** - * optional string name = 1; - * @return {string} - */ -proto.models.proto.cofd.CofdSheet.Condition.prototype.getName = function() { - return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 1, "")); -}; - - -/** - * @param {string} value - * @return {!proto.models.proto.cofd.CofdSheet.Condition} returns this - */ -proto.models.proto.cofd.CofdSheet.Condition.prototype.setName = function(value) { - return jspb.Message.setProto3StringField(this, 1, value); -}; - - - -/** - * List of repeated fields within this message type. - * @private {!Array} - * @const - */ -proto.models.proto.cofd.CofdSheet.Skill.repeatedFields_ = [4]; - - - -if (jspb.Message.GENERATE_TO_OBJECT) { -/** - * Creates an object representation of this proto. - * Field names that are reserved in JavaScript and will be renamed to pb_name. - * Optional fields that are not set will be set to undefined. - * To access a reserved field use, foo.pb_, eg, foo.pb_default. - * For the list of reserved names please see: - * net/proto2/compiler/js/internal/generator.cc#kKeyword. - * @param {boolean=} opt_includeInstance Deprecated. whether to include the - * JSPB instance for transitional soy proto support: - * http://goto/soy-param-migration - * @return {!Object} - */ -proto.models.proto.cofd.CofdSheet.Skill.prototype.toObject = function(opt_includeInstance) { - return proto.models.proto.cofd.CofdSheet.Skill.toObject(opt_includeInstance, this); -}; - - -/** - * Static version of the {@see toObject} method. - * @param {boolean|undefined} includeInstance Deprecated. Whether to include - * the JSPB instance for transitional soy proto support: - * http://goto/soy-param-migration - * @param {!proto.models.proto.cofd.CofdSheet.Skill} msg The msg instance to transform. - * @return {!Object} - * @suppress {unusedLocalVariables} f is only used for nested messages - */ -proto.models.proto.cofd.CofdSheet.Skill.toObject = function(includeInstance, msg) { - var f, obj = { - dots: jspb.Message.getFieldWithDefault(msg, 1, 0), - name: jspb.Message.getFieldWithDefault(msg, 2, ""), - untrainedPenalty: jspb.Message.getFieldWithDefault(msg, 3, 0), - specializationsList: (f = jspb.Message.getRepeatedField(msg, 4)) == null ? undefined : f - }; - - if (includeInstance) { - obj.$jspbMessageInstance = msg; - } - return obj; -}; -} - - -/** - * Deserializes binary data (in protobuf wire format). - * @param {jspb.ByteSource} bytes The bytes to deserialize. - * @return {!proto.models.proto.cofd.CofdSheet.Skill} - */ -proto.models.proto.cofd.CofdSheet.Skill.deserializeBinary = function(bytes) { - var reader = new jspb.BinaryReader(bytes); - var msg = new proto.models.proto.cofd.CofdSheet.Skill; - return proto.models.proto.cofd.CofdSheet.Skill.deserializeBinaryFromReader(msg, reader); -}; - - -/** - * Deserializes binary data (in protobuf wire format) from the - * given reader into the given message object. - * @param {!proto.models.proto.cofd.CofdSheet.Skill} msg The message object to deserialize into. - * @param {!jspb.BinaryReader} reader The BinaryReader to use. - * @return {!proto.models.proto.cofd.CofdSheet.Skill} - */ -proto.models.proto.cofd.CofdSheet.Skill.deserializeBinaryFromReader = function(msg, reader) { - while (reader.nextField()) { - if (reader.isEndGroup()) { - break; - } - var field = reader.getFieldNumber(); - switch (field) { - case 1: - var value = /** @type {number} */ (reader.readInt32()); - msg.setDots(value); - break; - case 2: - var value = /** @type {string} */ (reader.readString()); - msg.setName(value); - break; - case 3: - var value = /** @type {number} */ (reader.readSint32()); - msg.setUntrainedPenalty(value); - break; - case 4: - var value = /** @type {string} */ (reader.readString()); - msg.addSpecializations(value); - break; - default: - reader.skipField(); - break; - } - } - return msg; -}; - - -/** - * Serializes the message to binary data (in protobuf wire format). - * @return {!Uint8Array} - */ -proto.models.proto.cofd.CofdSheet.Skill.prototype.serializeBinary = function() { - var writer = new jspb.BinaryWriter(); - proto.models.proto.cofd.CofdSheet.Skill.serializeBinaryToWriter(this, writer); - return writer.getResultBuffer(); -}; - - -/** - * Serializes the given message to binary data (in protobuf wire - * format), writing to the given BinaryWriter. - * @param {!proto.models.proto.cofd.CofdSheet.Skill} message - * @param {!jspb.BinaryWriter} writer - * @suppress {unusedLocalVariables} f is only used for nested messages - */ -proto.models.proto.cofd.CofdSheet.Skill.serializeBinaryToWriter = function(message, writer) { - var f = undefined; - f = message.getDots(); - if (f !== 0) { - writer.writeInt32( - 1, - f - ); - } - f = message.getName(); - if (f.length > 0) { - writer.writeString( - 2, - f - ); - } - f = message.getUntrainedPenalty(); - if (f !== 0) { - writer.writeSint32( - 3, - f - ); - } - f = message.getSpecializationsList(); - if (f.length > 0) { - writer.writeRepeatedString( - 4, - f - ); - } -}; - - -/** - * optional int32 dots = 1; - * @return {number} - */ -proto.models.proto.cofd.CofdSheet.Skill.prototype.getDots = function() { - return /** @type {number} */ (jspb.Message.getFieldWithDefault(this, 1, 0)); -}; - - -/** - * @param {number} value - * @return {!proto.models.proto.cofd.CofdSheet.Skill} returns this - */ -proto.models.proto.cofd.CofdSheet.Skill.prototype.setDots = function(value) { - return jspb.Message.setProto3IntField(this, 1, value); -}; - - -/** - * optional string name = 2; - * @return {string} - */ -proto.models.proto.cofd.CofdSheet.Skill.prototype.getName = function() { - return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 2, "")); -}; - - -/** - * @param {string} value - * @return {!proto.models.proto.cofd.CofdSheet.Skill} returns this - */ -proto.models.proto.cofd.CofdSheet.Skill.prototype.setName = function(value) { - return jspb.Message.setProto3StringField(this, 2, value); -}; - - -/** - * optional sint32 untrained_penalty = 3; - * @return {number} - */ -proto.models.proto.cofd.CofdSheet.Skill.prototype.getUntrainedPenalty = function() { - return /** @type {number} */ (jspb.Message.getFieldWithDefault(this, 3, 0)); -}; - - -/** - * @param {number} value - * @return {!proto.models.proto.cofd.CofdSheet.Skill} returns this - */ -proto.models.proto.cofd.CofdSheet.Skill.prototype.setUntrainedPenalty = function(value) { - return jspb.Message.setProto3IntField(this, 3, value); -}; - - -/** - * repeated string specializations = 4; - * @return {!Array} - */ -proto.models.proto.cofd.CofdSheet.Skill.prototype.getSpecializationsList = function() { - return /** @type {!Array} */ (jspb.Message.getRepeatedField(this, 4)); -}; - - -/** - * @param {!Array} value - * @return {!proto.models.proto.cofd.CofdSheet.Skill} returns this - */ -proto.models.proto.cofd.CofdSheet.Skill.prototype.setSpecializationsList = function(value) { - return jspb.Message.setField(this, 4, value || []); -}; - - -/** - * @param {string} value - * @param {number=} opt_index - * @return {!proto.models.proto.cofd.CofdSheet.Skill} returns this - */ -proto.models.proto.cofd.CofdSheet.Skill.prototype.addSpecializations = function(value, opt_index) { - return jspb.Message.addToRepeatedField(this, 4, value, opt_index); -}; - - -/** - * Clears the list making it empty but non-null. - * @return {!proto.models.proto.cofd.CofdSheet.Skill} returns this - */ -proto.models.proto.cofd.CofdSheet.Skill.prototype.clearSpecializationsList = function() { - return this.setSpecializationsList([]); -}; - - - - - -if (jspb.Message.GENERATE_TO_OBJECT) { -/** - * Creates an object representation of this proto. - * Field names that are reserved in JavaScript and will be renamed to pb_name. - * Optional fields that are not set will be set to undefined. - * To access a reserved field use, foo.pb_, eg, foo.pb_default. - * For the list of reserved names please see: - * net/proto2/compiler/js/internal/generator.cc#kKeyword. - * @param {boolean=} opt_includeInstance Deprecated. whether to include the - * JSPB instance for transitional soy proto support: - * http://goto/soy-param-migration - * @return {!Object} - */ -proto.models.proto.cofd.CofdSheet.Item.prototype.toObject = function(opt_includeInstance) { - return proto.models.proto.cofd.CofdSheet.Item.toObject(opt_includeInstance, this); -}; - - -/** - * Static version of the {@see toObject} method. - * @param {boolean|undefined} includeInstance Deprecated. Whether to include - * the JSPB instance for transitional soy proto support: - * http://goto/soy-param-migration - * @param {!proto.models.proto.cofd.CofdSheet.Item} msg The msg instance to transform. - * @return {!Object} - * @suppress {unusedLocalVariables} f is only used for nested messages - */ -proto.models.proto.cofd.CofdSheet.Item.toObject = function(includeInstance, msg) { - var f, obj = { - name: jspb.Message.getFieldWithDefault(msg, 1, ""), - description: jspb.Message.getFieldWithDefault(msg, 2, ""), - rules: jspb.Message.getFieldWithDefault(msg, 3, "") - }; - - if (includeInstance) { - obj.$jspbMessageInstance = msg; - } - return obj; -}; -} - - -/** - * Deserializes binary data (in protobuf wire format). - * @param {jspb.ByteSource} bytes The bytes to deserialize. - * @return {!proto.models.proto.cofd.CofdSheet.Item} - */ -proto.models.proto.cofd.CofdSheet.Item.deserializeBinary = function(bytes) { - var reader = new jspb.BinaryReader(bytes); - var msg = new proto.models.proto.cofd.CofdSheet.Item; - return proto.models.proto.cofd.CofdSheet.Item.deserializeBinaryFromReader(msg, reader); -}; - - -/** - * Deserializes binary data (in protobuf wire format) from the - * given reader into the given message object. - * @param {!proto.models.proto.cofd.CofdSheet.Item} msg The message object to deserialize into. - * @param {!jspb.BinaryReader} reader The BinaryReader to use. - * @return {!proto.models.proto.cofd.CofdSheet.Item} - */ -proto.models.proto.cofd.CofdSheet.Item.deserializeBinaryFromReader = function(msg, reader) { - while (reader.nextField()) { - if (reader.isEndGroup()) { - break; - } - var field = reader.getFieldNumber(); - switch (field) { - case 1: - var value = /** @type {string} */ (reader.readString()); - msg.setName(value); - break; - case 2: - var value = /** @type {string} */ (reader.readString()); - msg.setDescription(value); - break; - case 3: - var value = /** @type {string} */ (reader.readString()); - msg.setRules(value); - break; - default: - reader.skipField(); - break; - } - } - return msg; -}; - - -/** - * Serializes the message to binary data (in protobuf wire format). - * @return {!Uint8Array} - */ -proto.models.proto.cofd.CofdSheet.Item.prototype.serializeBinary = function() { - var writer = new jspb.BinaryWriter(); - proto.models.proto.cofd.CofdSheet.Item.serializeBinaryToWriter(this, writer); - return writer.getResultBuffer(); -}; - - -/** - * Serializes the given message to binary data (in protobuf wire - * format), writing to the given BinaryWriter. - * @param {!proto.models.proto.cofd.CofdSheet.Item} message - * @param {!jspb.BinaryWriter} writer - * @suppress {unusedLocalVariables} f is only used for nested messages - */ -proto.models.proto.cofd.CofdSheet.Item.serializeBinaryToWriter = function(message, writer) { - var f = undefined; - f = message.getName(); - if (f.length > 0) { - writer.writeString( - 1, - f - ); - } - f = message.getDescription(); - if (f.length > 0) { - writer.writeString( - 2, - f - ); - } - f = message.getRules(); - if (f.length > 0) { - writer.writeString( - 3, - f - ); - } -}; - - -/** - * optional string name = 1; - * @return {string} - */ -proto.models.proto.cofd.CofdSheet.Item.prototype.getName = function() { - return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 1, "")); -}; - - -/** - * @param {string} value - * @return {!proto.models.proto.cofd.CofdSheet.Item} returns this - */ -proto.models.proto.cofd.CofdSheet.Item.prototype.setName = function(value) { - return jspb.Message.setProto3StringField(this, 1, value); -}; - - -/** - * optional string description = 2; - * @return {string} - */ -proto.models.proto.cofd.CofdSheet.Item.prototype.getDescription = function() { - return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 2, "")); -}; - - -/** - * @param {string} value - * @return {!proto.models.proto.cofd.CofdSheet.Item} returns this - */ -proto.models.proto.cofd.CofdSheet.Item.prototype.setDescription = function(value) { - return jspb.Message.setProto3StringField(this, 2, value); -}; - - -/** - * optional string rules = 3; - * @return {string} - */ -proto.models.proto.cofd.CofdSheet.Item.prototype.getRules = function() { - return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 3, "")); -}; - - -/** - * @param {string} value - * @return {!proto.models.proto.cofd.CofdSheet.Item} returns this - */ -proto.models.proto.cofd.CofdSheet.Item.prototype.setRules = function(value) { - return jspb.Message.setProto3StringField(this, 3, value); -}; - - - - - -if (jspb.Message.GENERATE_TO_OBJECT) { -/** - * Creates an object representation of this proto. - * Field names that are reserved in JavaScript and will be renamed to pb_name. - * Optional fields that are not set will be set to undefined. - * To access a reserved field use, foo.pb_, eg, foo.pb_default. - * For the list of reserved names please see: - * net/proto2/compiler/js/internal/generator.cc#kKeyword. - * @param {boolean=} opt_includeInstance Deprecated. whether to include the - * JSPB instance for transitional soy proto support: - * http://goto/soy-param-migration - * @return {!Object} - */ -proto.models.proto.cofd.CofdSheet.Attack.prototype.toObject = function(opt_includeInstance) { - return proto.models.proto.cofd.CofdSheet.Attack.toObject(opt_includeInstance, this); -}; - - -/** - * Static version of the {@see toObject} method. - * @param {boolean|undefined} includeInstance Deprecated. Whether to include - * the JSPB instance for transitional soy proto support: - * http://goto/soy-param-migration - * @param {!proto.models.proto.cofd.CofdSheet.Attack} msg The msg instance to transform. - * @return {!Object} - * @suppress {unusedLocalVariables} f is only used for nested messages - */ -proto.models.proto.cofd.CofdSheet.Attack.toObject = function(includeInstance, msg) { - var f, obj = { - name: jspb.Message.getFieldWithDefault(msg, 1, ""), - dicePool: jspb.Message.getFieldWithDefault(msg, 2, 0), - damage: jspb.Message.getFieldWithDefault(msg, 3, 0), - range: jspb.Message.getFieldWithDefault(msg, 4, 0), - initiativeModifier: jspb.Message.getFieldWithDefault(msg, 5, 0), - size: jspb.Message.getFieldWithDefault(msg, 6, 0) - }; - - if (includeInstance) { - obj.$jspbMessageInstance = msg; - } - return obj; -}; -} - - -/** - * Deserializes binary data (in protobuf wire format). - * @param {jspb.ByteSource} bytes The bytes to deserialize. - * @return {!proto.models.proto.cofd.CofdSheet.Attack} - */ -proto.models.proto.cofd.CofdSheet.Attack.deserializeBinary = function(bytes) { - var reader = new jspb.BinaryReader(bytes); - var msg = new proto.models.proto.cofd.CofdSheet.Attack; - return proto.models.proto.cofd.CofdSheet.Attack.deserializeBinaryFromReader(msg, reader); -}; - - -/** - * Deserializes binary data (in protobuf wire format) from the - * given reader into the given message object. - * @param {!proto.models.proto.cofd.CofdSheet.Attack} msg The message object to deserialize into. - * @param {!jspb.BinaryReader} reader The BinaryReader to use. - * @return {!proto.models.proto.cofd.CofdSheet.Attack} - */ -proto.models.proto.cofd.CofdSheet.Attack.deserializeBinaryFromReader = function(msg, reader) { - while (reader.nextField()) { - if (reader.isEndGroup()) { - break; - } - var field = reader.getFieldNumber(); - switch (field) { - case 1: - var value = /** @type {string} */ (reader.readString()); - msg.setName(value); - break; - case 2: - var value = /** @type {number} */ (reader.readInt32()); - msg.setDicePool(value); - break; - case 3: - var value = /** @type {number} */ (reader.readInt32()); - msg.setDamage(value); - break; - case 4: - var value = /** @type {number} */ (reader.readInt32()); - msg.setRange(value); - break; - case 5: - var value = /** @type {number} */ (reader.readSint32()); - msg.setInitiativeModifier(value); - break; - case 6: - var value = /** @type {number} */ (reader.readInt32()); - msg.setSize(value); - break; - default: - reader.skipField(); - break; - } - } - return msg; -}; - - -/** - * Serializes the message to binary data (in protobuf wire format). - * @return {!Uint8Array} - */ -proto.models.proto.cofd.CofdSheet.Attack.prototype.serializeBinary = function() { - var writer = new jspb.BinaryWriter(); - proto.models.proto.cofd.CofdSheet.Attack.serializeBinaryToWriter(this, writer); - return writer.getResultBuffer(); -}; - - -/** - * Serializes the given message to binary data (in protobuf wire - * format), writing to the given BinaryWriter. - * @param {!proto.models.proto.cofd.CofdSheet.Attack} message - * @param {!jspb.BinaryWriter} writer - * @suppress {unusedLocalVariables} f is only used for nested messages - */ -proto.models.proto.cofd.CofdSheet.Attack.serializeBinaryToWriter = function(message, writer) { - var f = undefined; - f = message.getName(); - if (f.length > 0) { - writer.writeString( - 1, - f - ); - } - f = message.getDicePool(); - if (f !== 0) { - writer.writeInt32( - 2, - f - ); - } - f = message.getDamage(); - if (f !== 0) { - writer.writeInt32( - 3, - f - ); - } - f = message.getRange(); - if (f !== 0) { - writer.writeInt32( - 4, - f - ); - } - f = message.getInitiativeModifier(); - if (f !== 0) { - writer.writeSint32( - 5, - f - ); - } - f = message.getSize(); - if (f !== 0) { - writer.writeInt32( - 6, - f - ); - } -}; - - -/** - * optional string name = 1; - * @return {string} - */ -proto.models.proto.cofd.CofdSheet.Attack.prototype.getName = function() { - return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 1, "")); -}; - - -/** - * @param {string} value - * @return {!proto.models.proto.cofd.CofdSheet.Attack} returns this - */ -proto.models.proto.cofd.CofdSheet.Attack.prototype.setName = function(value) { - return jspb.Message.setProto3StringField(this, 1, value); -}; - - -/** - * optional int32 dice_pool = 2; - * @return {number} - */ -proto.models.proto.cofd.CofdSheet.Attack.prototype.getDicePool = function() { - return /** @type {number} */ (jspb.Message.getFieldWithDefault(this, 2, 0)); -}; - - -/** - * @param {number} value - * @return {!proto.models.proto.cofd.CofdSheet.Attack} returns this - */ -proto.models.proto.cofd.CofdSheet.Attack.prototype.setDicePool = function(value) { - return jspb.Message.setProto3IntField(this, 2, value); -}; - - -/** - * optional int32 damage = 3; - * @return {number} - */ -proto.models.proto.cofd.CofdSheet.Attack.prototype.getDamage = function() { - return /** @type {number} */ (jspb.Message.getFieldWithDefault(this, 3, 0)); -}; - - -/** - * @param {number} value - * @return {!proto.models.proto.cofd.CofdSheet.Attack} returns this - */ -proto.models.proto.cofd.CofdSheet.Attack.prototype.setDamage = function(value) { - return jspb.Message.setProto3IntField(this, 3, value); -}; - - -/** - * optional int32 range = 4; - * @return {number} - */ -proto.models.proto.cofd.CofdSheet.Attack.prototype.getRange = function() { - return /** @type {number} */ (jspb.Message.getFieldWithDefault(this, 4, 0)); -}; - - -/** - * @param {number} value - * @return {!proto.models.proto.cofd.CofdSheet.Attack} returns this - */ -proto.models.proto.cofd.CofdSheet.Attack.prototype.setRange = function(value) { - return jspb.Message.setProto3IntField(this, 4, value); -}; - - -/** - * optional sint32 initiative_modifier = 5; - * @return {number} - */ -proto.models.proto.cofd.CofdSheet.Attack.prototype.getInitiativeModifier = function() { - return /** @type {number} */ (jspb.Message.getFieldWithDefault(this, 5, 0)); -}; - - -/** - * @param {number} value - * @return {!proto.models.proto.cofd.CofdSheet.Attack} returns this - */ -proto.models.proto.cofd.CofdSheet.Attack.prototype.setInitiativeModifier = function(value) { - return jspb.Message.setProto3IntField(this, 5, value); -}; - - -/** - * optional int32 size = 6; - * @return {number} - */ -proto.models.proto.cofd.CofdSheet.Attack.prototype.getSize = function() { - return /** @type {number} */ (jspb.Message.getFieldWithDefault(this, 6, 0)); -}; - - -/** - * @param {number} value - * @return {!proto.models.proto.cofd.CofdSheet.Attack} returns this - */ -proto.models.proto.cofd.CofdSheet.Attack.prototype.setSize = function(value) { - return jspb.Message.setProto3IntField(this, 6, value); -}; - - -/** - * optional string name = 1; - * @return {string} - */ -proto.models.proto.cofd.CofdSheet.prototype.getName = function() { - return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 1, "")); -}; - - -/** - * @param {string} value - * @return {!proto.models.proto.cofd.CofdSheet} returns this - */ -proto.models.proto.cofd.CofdSheet.prototype.setName = function(value) { - return jspb.Message.setProto3StringField(this, 1, value); -}; - - -/** - * optional string player = 2; - * @return {string} - */ -proto.models.proto.cofd.CofdSheet.prototype.getPlayer = function() { - return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 2, "")); -}; - - -/** - * @param {string} value - * @return {!proto.models.proto.cofd.CofdSheet} returns this - */ -proto.models.proto.cofd.CofdSheet.prototype.setPlayer = function(value) { - return jspb.Message.setProto3StringField(this, 2, value); -}; - - -/** - * optional string campaign = 3; - * @return {string} - */ -proto.models.proto.cofd.CofdSheet.prototype.getCampaign = function() { - return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 3, "")); -}; - - -/** - * @param {string} value - * @return {!proto.models.proto.cofd.CofdSheet} returns this - */ -proto.models.proto.cofd.CofdSheet.prototype.setCampaign = function(value) { - return jspb.Message.setProto3StringField(this, 3, value); -}; - - -/** - * optional string description = 4; - * @return {string} - */ -proto.models.proto.cofd.CofdSheet.prototype.getDescription = function() { - return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 4, "")); -}; - - -/** - * @param {string} value - * @return {!proto.models.proto.cofd.CofdSheet} returns this - */ -proto.models.proto.cofd.CofdSheet.prototype.setDescription = function(value) { - return jspb.Message.setProto3StringField(this, 4, value); -}; - - -/** - * optional int32 strength = 6; - * @return {number} - */ -proto.models.proto.cofd.CofdSheet.prototype.getStrength = function() { - return /** @type {number} */ (jspb.Message.getFieldWithDefault(this, 6, 0)); -}; - - -/** - * @param {number} value - * @return {!proto.models.proto.cofd.CofdSheet} returns this - */ -proto.models.proto.cofd.CofdSheet.prototype.setStrength = function(value) { - return jspb.Message.setProto3IntField(this, 6, value); -}; - - -/** - * optional int32 dexterity = 7; - * @return {number} - */ -proto.models.proto.cofd.CofdSheet.prototype.getDexterity = function() { - return /** @type {number} */ (jspb.Message.getFieldWithDefault(this, 7, 0)); -}; - - -/** - * @param {number} value - * @return {!proto.models.proto.cofd.CofdSheet} returns this - */ -proto.models.proto.cofd.CofdSheet.prototype.setDexterity = function(value) { - return jspb.Message.setProto3IntField(this, 7, value); -}; - - -/** - * optional int32 stamina = 8; - * @return {number} - */ -proto.models.proto.cofd.CofdSheet.prototype.getStamina = function() { - return /** @type {number} */ (jspb.Message.getFieldWithDefault(this, 8, 0)); -}; - - -/** - * @param {number} value - * @return {!proto.models.proto.cofd.CofdSheet} returns this - */ -proto.models.proto.cofd.CofdSheet.prototype.setStamina = function(value) { - return jspb.Message.setProto3IntField(this, 8, value); -}; - - -/** - * optional int32 intelligence = 9; - * @return {number} - */ -proto.models.proto.cofd.CofdSheet.prototype.getIntelligence = function() { - return /** @type {number} */ (jspb.Message.getFieldWithDefault(this, 9, 0)); -}; - - -/** - * @param {number} value - * @return {!proto.models.proto.cofd.CofdSheet} returns this - */ -proto.models.proto.cofd.CofdSheet.prototype.setIntelligence = function(value) { - return jspb.Message.setProto3IntField(this, 9, value); -}; - - -/** - * optional int32 wits = 10; - * @return {number} - */ -proto.models.proto.cofd.CofdSheet.prototype.getWits = function() { - return /** @type {number} */ (jspb.Message.getFieldWithDefault(this, 10, 0)); -}; - - -/** - * @param {number} value - * @return {!proto.models.proto.cofd.CofdSheet} returns this - */ -proto.models.proto.cofd.CofdSheet.prototype.setWits = function(value) { - return jspb.Message.setProto3IntField(this, 10, value); -}; - - -/** - * optional int32 resolve = 11; - * @return {number} - */ -proto.models.proto.cofd.CofdSheet.prototype.getResolve = function() { - return /** @type {number} */ (jspb.Message.getFieldWithDefault(this, 11, 0)); -}; - - -/** - * @param {number} value - * @return {!proto.models.proto.cofd.CofdSheet} returns this - */ -proto.models.proto.cofd.CofdSheet.prototype.setResolve = function(value) { - return jspb.Message.setProto3IntField(this, 11, value); -}; - - -/** - * optional int32 presence = 12; - * @return {number} - */ -proto.models.proto.cofd.CofdSheet.prototype.getPresence = function() { - return /** @type {number} */ (jspb.Message.getFieldWithDefault(this, 12, 0)); -}; - - -/** - * @param {number} value - * @return {!proto.models.proto.cofd.CofdSheet} returns this - */ -proto.models.proto.cofd.CofdSheet.prototype.setPresence = function(value) { - return jspb.Message.setProto3IntField(this, 12, value); -}; - - -/** - * optional int32 manipulation = 13; - * @return {number} - */ -proto.models.proto.cofd.CofdSheet.prototype.getManipulation = function() { - return /** @type {number} */ (jspb.Message.getFieldWithDefault(this, 13, 0)); -}; - - -/** - * @param {number} value - * @return {!proto.models.proto.cofd.CofdSheet} returns this - */ -proto.models.proto.cofd.CofdSheet.prototype.setManipulation = function(value) { - return jspb.Message.setProto3IntField(this, 13, value); -}; - - -/** - * optional int32 composure = 14; - * @return {number} - */ -proto.models.proto.cofd.CofdSheet.prototype.getComposure = function() { - return /** @type {number} */ (jspb.Message.getFieldWithDefault(this, 14, 0)); -}; - - -/** - * @param {number} value - * @return {!proto.models.proto.cofd.CofdSheet} returns this - */ -proto.models.proto.cofd.CofdSheet.prototype.setComposure = function(value) { - return jspb.Message.setProto3IntField(this, 14, value); -}; - - -/** - * map physical_skills = 16; - * @param {boolean=} opt_noLazyCreate Do not create the map if - * empty, instead returning `undefined` - * @return {!jspb.Map} - */ -proto.models.proto.cofd.CofdSheet.prototype.getPhysicalSkillsMap = function(opt_noLazyCreate) { - return /** @type {!jspb.Map} */ ( - jspb.Message.getMapField(this, 16, opt_noLazyCreate, - proto.models.proto.cofd.CofdSheet.Skill)); -}; - - -/** - * Clears values from the map. The map will be non-null. - * @return {!proto.models.proto.cofd.CofdSheet} returns this - */ -proto.models.proto.cofd.CofdSheet.prototype.clearPhysicalSkillsMap = function() { - this.getPhysicalSkillsMap().clear(); - return this;}; - - -/** - * map mental_skills = 17; - * @param {boolean=} opt_noLazyCreate Do not create the map if - * empty, instead returning `undefined` - * @return {!jspb.Map} - */ -proto.models.proto.cofd.CofdSheet.prototype.getMentalSkillsMap = function(opt_noLazyCreate) { - return /** @type {!jspb.Map} */ ( - jspb.Message.getMapField(this, 17, opt_noLazyCreate, - proto.models.proto.cofd.CofdSheet.Skill)); -}; - - -/** - * Clears values from the map. The map will be non-null. - * @return {!proto.models.proto.cofd.CofdSheet} returns this - */ -proto.models.proto.cofd.CofdSheet.prototype.clearMentalSkillsMap = function() { - this.getMentalSkillsMap().clear(); - return this;}; - - -/** - * map social_skills = 18; - * @param {boolean=} opt_noLazyCreate Do not create the map if - * empty, instead returning `undefined` - * @return {!jspb.Map} - */ -proto.models.proto.cofd.CofdSheet.prototype.getSocialSkillsMap = function(opt_noLazyCreate) { - return /** @type {!jspb.Map} */ ( - jspb.Message.getMapField(this, 18, opt_noLazyCreate, - proto.models.proto.cofd.CofdSheet.Skill)); -}; - - -/** - * Clears values from the map. The map will be non-null. - * @return {!proto.models.proto.cofd.CofdSheet} returns this - */ -proto.models.proto.cofd.CofdSheet.prototype.clearSocialSkillsMap = function() { - this.getSocialSkillsMap().clear(); - return this;}; - - -/** - * repeated Merit merits = 15; - * @return {!Array} - */ -proto.models.proto.cofd.CofdSheet.prototype.getMeritsList = function() { - return /** @type{!Array} */ ( - jspb.Message.getRepeatedWrapperField(this, proto.models.proto.cofd.CofdSheet.Merit, 15)); -}; - - -/** - * @param {!Array} value - * @return {!proto.models.proto.cofd.CofdSheet} returns this -*/ -proto.models.proto.cofd.CofdSheet.prototype.setMeritsList = function(value) { - return jspb.Message.setRepeatedWrapperField(this, 15, value); -}; - - -/** - * @param {!proto.models.proto.cofd.CofdSheet.Merit=} opt_value - * @param {number=} opt_index - * @return {!proto.models.proto.cofd.CofdSheet.Merit} - */ -proto.models.proto.cofd.CofdSheet.prototype.addMerits = function(opt_value, opt_index) { - return jspb.Message.addToRepeatedWrapperField(this, 15, opt_value, proto.models.proto.cofd.CofdSheet.Merit, opt_index); -}; - - -/** - * Clears the list making it empty but non-null. - * @return {!proto.models.proto.cofd.CofdSheet} returns this - */ -proto.models.proto.cofd.CofdSheet.prototype.clearMeritsList = function() { - return this.setMeritsList([]); -}; - - -/** - * repeated Condition conditions = 19; - * @return {!Array} - */ -proto.models.proto.cofd.CofdSheet.prototype.getConditionsList = function() { - return /** @type{!Array} */ ( - jspb.Message.getRepeatedWrapperField(this, proto.models.proto.cofd.CofdSheet.Condition, 19)); -}; - - -/** - * @param {!Array} value - * @return {!proto.models.proto.cofd.CofdSheet} returns this -*/ -proto.models.proto.cofd.CofdSheet.prototype.setConditionsList = function(value) { - return jspb.Message.setRepeatedWrapperField(this, 19, value); -}; - - -/** - * @param {!proto.models.proto.cofd.CofdSheet.Condition=} opt_value - * @param {number=} opt_index - * @return {!proto.models.proto.cofd.CofdSheet.Condition} - */ -proto.models.proto.cofd.CofdSheet.prototype.addConditions = function(opt_value, opt_index) { - return jspb.Message.addToRepeatedWrapperField(this, 19, opt_value, proto.models.proto.cofd.CofdSheet.Condition, opt_index); -}; - - -/** - * Clears the list making it empty but non-null. - * @return {!proto.models.proto.cofd.CofdSheet} returns this - */ -proto.models.proto.cofd.CofdSheet.prototype.clearConditionsList = function() { - return this.setConditionsList([]); -}; - - -/** - * optional int32 size = 20; - * @return {number} - */ -proto.models.proto.cofd.CofdSheet.prototype.getSize = function() { - return /** @type {number} */ (jspb.Message.getFieldWithDefault(this, 20, 0)); -}; - - -/** - * @param {number} value - * @return {!proto.models.proto.cofd.CofdSheet} returns this - */ -proto.models.proto.cofd.CofdSheet.prototype.setSize = function(value) { - return jspb.Message.setProto3IntField(this, 20, value); -}; - - -/** - * optional int32 health = 21; - * @return {number} - */ -proto.models.proto.cofd.CofdSheet.prototype.getHealth = function() { - return /** @type {number} */ (jspb.Message.getFieldWithDefault(this, 21, 0)); -}; - - -/** - * @param {number} value - * @return {!proto.models.proto.cofd.CofdSheet} returns this - */ -proto.models.proto.cofd.CofdSheet.prototype.setHealth = function(value) { - return jspb.Message.setProto3IntField(this, 21, value); -}; - - -/** - * optional int32 willpower = 22; - * @return {number} - */ -proto.models.proto.cofd.CofdSheet.prototype.getWillpower = function() { - return /** @type {number} */ (jspb.Message.getFieldWithDefault(this, 22, 0)); -}; - - -/** - * @param {number} value - * @return {!proto.models.proto.cofd.CofdSheet} returns this - */ -proto.models.proto.cofd.CofdSheet.prototype.setWillpower = function(value) { - return jspb.Message.setProto3IntField(this, 22, value); -}; - - -/** - * optional int32 experience_points = 23; - * @return {number} - */ -proto.models.proto.cofd.CofdSheet.prototype.getExperiencePoints = function() { - return /** @type {number} */ (jspb.Message.getFieldWithDefault(this, 23, 0)); -}; - - -/** - * @param {number} value - * @return {!proto.models.proto.cofd.CofdSheet} returns this - */ -proto.models.proto.cofd.CofdSheet.prototype.setExperiencePoints = function(value) { - return jspb.Message.setProto3IntField(this, 23, value); -}; - - -/** - * optional int32 beats = 24; - * @return {number} - */ -proto.models.proto.cofd.CofdSheet.prototype.getBeats = function() { - return /** @type {number} */ (jspb.Message.getFieldWithDefault(this, 24, 0)); -}; - - -/** - * @param {number} value - * @return {!proto.models.proto.cofd.CofdSheet} returns this - */ -proto.models.proto.cofd.CofdSheet.prototype.setBeats = function(value) { - return jspb.Message.setProto3IntField(this, 24, value); -}; - - -/** - * repeated Item items = 25; - * @return {!Array} - */ -proto.models.proto.cofd.CofdSheet.prototype.getItemsList = function() { - return /** @type{!Array} */ ( - jspb.Message.getRepeatedWrapperField(this, proto.models.proto.cofd.CofdSheet.Item, 25)); -}; - - -/** - * @param {!Array} value - * @return {!proto.models.proto.cofd.CofdSheet} returns this -*/ -proto.models.proto.cofd.CofdSheet.prototype.setItemsList = function(value) { - return jspb.Message.setRepeatedWrapperField(this, 25, value); -}; - - -/** - * @param {!proto.models.proto.cofd.CofdSheet.Item=} opt_value - * @param {number=} opt_index - * @return {!proto.models.proto.cofd.CofdSheet.Item} - */ -proto.models.proto.cofd.CofdSheet.prototype.addItems = function(opt_value, opt_index) { - return jspb.Message.addToRepeatedWrapperField(this, 25, opt_value, proto.models.proto.cofd.CofdSheet.Item, opt_index); -}; - - -/** - * Clears the list making it empty but non-null. - * @return {!proto.models.proto.cofd.CofdSheet} returns this - */ -proto.models.proto.cofd.CofdSheet.prototype.clearItemsList = function() { - return this.setItemsList([]); -}; - - -/** - * repeated Attack attacks = 26; - * @return {!Array} - */ -proto.models.proto.cofd.CofdSheet.prototype.getAttacksList = function() { - return /** @type{!Array} */ ( - jspb.Message.getRepeatedWrapperField(this, proto.models.proto.cofd.CofdSheet.Attack, 26)); -}; - - -/** - * @param {!Array} value - * @return {!proto.models.proto.cofd.CofdSheet} returns this -*/ -proto.models.proto.cofd.CofdSheet.prototype.setAttacksList = function(value) { - return jspb.Message.setRepeatedWrapperField(this, 26, value); -}; - - -/** - * @param {!proto.models.proto.cofd.CofdSheet.Attack=} opt_value - * @param {number=} opt_index - * @return {!proto.models.proto.cofd.CofdSheet.Attack} - */ -proto.models.proto.cofd.CofdSheet.prototype.addAttacks = function(opt_value, opt_index) { - return jspb.Message.addToRepeatedWrapperField(this, 26, opt_value, proto.models.proto.cofd.CofdSheet.Attack, opt_index); -}; - - -/** - * Clears the list making it empty but non-null. - * @return {!proto.models.proto.cofd.CofdSheet} returns this - */ -proto.models.proto.cofd.CofdSheet.prototype.clearAttacksList = function() { - return this.setAttacksList([]); -}; - - -/** - * map other_data = 27; - * @param {boolean=} opt_noLazyCreate Do not create the map if - * empty, instead returning `undefined` - * @return {!jspb.Map} - */ -proto.models.proto.cofd.CofdSheet.prototype.getOtherDataMap = function(opt_noLazyCreate) { - return /** @type {!jspb.Map} */ ( - jspb.Message.getMapField(this, 27, opt_noLazyCreate, - null)); -}; - - -/** - * Clears values from the map. The map will be non-null. - * @return {!proto.models.proto.cofd.CofdSheet} returns this - */ -proto.models.proto.cofd.CofdSheet.prototype.clearOtherDataMap = function() { - this.getOtherDataMap().clear(); - return this;}; - - -/** - * optional CoreFields core = 28; - * @return {?proto.models.proto.cofd.CoreFields} - */ -proto.models.proto.cofd.CofdSheet.prototype.getCore = function() { - return /** @type{?proto.models.proto.cofd.CoreFields} */ ( - jspb.Message.getWrapperField(this, proto.models.proto.cofd.CoreFields, 28)); -}; - - -/** - * @param {?proto.models.proto.cofd.CoreFields|undefined} value - * @return {!proto.models.proto.cofd.CofdSheet} returns this -*/ -proto.models.proto.cofd.CofdSheet.prototype.setCore = function(value) { - return jspb.Message.setOneofWrapperField(this, 28, proto.models.proto.cofd.CofdSheet.oneofGroups_[0], value); -}; - - -/** - * Clears the message field making it undefined. - * @return {!proto.models.proto.cofd.CofdSheet} returns this - */ -proto.models.proto.cofd.CofdSheet.prototype.clearCore = function() { - return this.setCore(undefined); -}; - - -/** - * Returns whether this field is set. - * @return {boolean} - */ -proto.models.proto.cofd.CofdSheet.prototype.hasCore = function() { - return jspb.Message.getField(this, 28) != null; -}; - - -/** - * optional MageFields mage = 29; - * @return {?proto.models.proto.cofd.MageFields} - */ -proto.models.proto.cofd.CofdSheet.prototype.getMage = function() { - return /** @type{?proto.models.proto.cofd.MageFields} */ ( - jspb.Message.getWrapperField(this, proto.models.proto.cofd.MageFields, 29)); -}; - - -/** - * @param {?proto.models.proto.cofd.MageFields|undefined} value - * @return {!proto.models.proto.cofd.CofdSheet} returns this -*/ -proto.models.proto.cofd.CofdSheet.prototype.setMage = function(value) { - return jspb.Message.setOneofWrapperField(this, 29, proto.models.proto.cofd.CofdSheet.oneofGroups_[0], value); -}; - - -/** - * Clears the message field making it undefined. - * @return {!proto.models.proto.cofd.CofdSheet} returns this - */ -proto.models.proto.cofd.CofdSheet.prototype.clearMage = function() { - return this.setMage(undefined); -}; - - -/** - * Returns whether this field is set. - * @return {boolean} - */ -proto.models.proto.cofd.CofdSheet.prototype.hasMage = function() { - return jspb.Message.getField(this, 29) != null; -}; - - -/** - * optional ChangelingFields changeling = 30; - * @return {?proto.models.proto.cofd.ChangelingFields} - */ -proto.models.proto.cofd.CofdSheet.prototype.getChangeling = function() { - return /** @type{?proto.models.proto.cofd.ChangelingFields} */ ( - jspb.Message.getWrapperField(this, proto.models.proto.cofd.ChangelingFields, 30)); -}; - - -/** - * @param {?proto.models.proto.cofd.ChangelingFields|undefined} value - * @return {!proto.models.proto.cofd.CofdSheet} returns this -*/ -proto.models.proto.cofd.CofdSheet.prototype.setChangeling = function(value) { - return jspb.Message.setOneofWrapperField(this, 30, proto.models.proto.cofd.CofdSheet.oneofGroups_[0], value); -}; - - -/** - * Clears the message field making it undefined. - * @return {!proto.models.proto.cofd.CofdSheet} returns this - */ -proto.models.proto.cofd.CofdSheet.prototype.clearChangeling = function() { - return this.setChangeling(undefined); -}; - - -/** - * Returns whether this field is set. - * @return {boolean} - */ -proto.models.proto.cofd.CofdSheet.prototype.hasChangeling = function() { - return jspb.Message.getField(this, 30) != null; -}; - - -goog.object.extend(exports, proto.models.proto.cofd); - - -/***/ }) - -}]); -//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9fcHJvdG8vY29mZF9hcGlfcGIuanMiLCJ3ZWJwYWNrOi8vLy4vX3Byb3RvL2NvZmRfcGIuanMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGNBQWMsbUJBQW1CO0FBQ2pDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSxXQUFXLG1CQUFPLENBQUMsOEVBQWlCO0FBQ3BDO0FBQ0E7O0FBRUEsY0FBYyxtQkFBTyxDQUFDLHlDQUFjO0FBQ3BDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLE9BQU87QUFDbEI7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVyxPQUFPO0FBQ2xCO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsT0FBTztBQUNsQjtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLE9BQU87QUFDbEI7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVyxPQUFPO0FBQ2xCO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FB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O0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsT0FBTztBQUNsQjtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLE9BQU87QUFDbEI7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVyxPQUFPO0FBQ2xCO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsT0FBTztBQUNsQjtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLE9BQU87QUFDbEI7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVyxPQUFPO0FBQ2xCO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsT0FBTztBQUNsQjtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLE9B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O0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNB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QUNBLG1CQUFtQixvQ0FBb0M7QUFDdkQ7QUFDQTs7O0FBR0E7QUFDQSxXQUFXLDhDQUE4QztBQUN6RCxZQUFZLG1DQUFtQztBQUMvQztBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTtBQUNBLFlBQVksbUNBQW1DO0FBQy9DO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQTtBQUNBO0FBQ0EsWUFBWTtBQUNaO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQTtBQUNBO0FBQ0EsWUFBWTtBQUNaO0FBQ0E7QUFDQSxtQkFBbUIsb0NBQW9DO0FBQ3ZEO0FBQ0E7OztBQUdBO0FBQ0EsV0FBVyw4Q0FBOEM7QUFDekQsWUFBWSxtQ0FBbUM7QUFDL0M7QUFDQTtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQSxZQUFZLG1DQUFtQztBQUMvQztBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTtBQUNBLFlBQVk7QUFDWjtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTtBQUNBLFlBQVk7QUFDWjtBQUNBO0FBQ0EsbUJBQW1CLDBDQUEwQztBQUM3RDtBQUNBOzs7QUFHQTtBQUNBLFdBQVcsb0RBQW9EO0FBQy9ELFlBQVksbUNBQW1DO0FBQy9DO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQTtBQUNBO0FBQ0EsWUFBWSxtQ0FBbUM7QUFDL0M7QUFDQTtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQSxZQUFZO0FBQ1o7QUFDQTtBQUNBO0FBQ0E7OztBQUdBIiwiZmlsZSI6Il9wcm90b19jb2ZkX2FwaV9wYl9qcy5idW5kbGUuanMiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBzb3VyY2U6IGNvZmRfYXBpLnByb3RvXG4vKipcbiAqIEBmaWxlb3ZlcnZpZXdcbiAqIEBlbmhhbmNlYWJsZVxuICogQHN1cHByZXNzIHttZXNzYWdlQ29udmVudGlvbnN9IEpTIENvbXBpbGVyIHJlcG9ydHMgYW4gZXJyb3IgaWYgYSB2YXJpYWJsZSBvclxuICogICAgIGZpZWxkIHN0YXJ0cyB3aXRoICdNU0dfJyBhbmQgaXNuJ3QgYSB0cmFuc2xhdGFibGUgbWVzc2FnZS5cbiAqIEBwdWJsaWNcbiAqL1xuLy8gR0VORVJBVEVEIENPREUgLS0gRE8gTk9UIEVESVQhXG4vKiBlc2xpbnQtZGlzYWJsZSAqL1xuLy8gQHRzLW5vY2hlY2tcblxudmFyIGpzcGIgPSByZXF1aXJlKCdnb29nbGUtcHJvdG9idWYnKTtcbnZhciBnb29nID0ganNwYjtcbnZhciBnbG9iYWwgPSBGdW5jdGlvbigncmV0dXJuIHRoaXMnKSgpO1xuXG52YXIgY29mZF9wYiA9IHJlcXVpcmUoJy4vY29mZF9wYi5qcycpO1xuZ29vZy5vYmplY3QuZXh0ZW5kKHByb3RvLCBjb2ZkX3BiKTtcbmdvb2cuZXhwb3J0U3ltYm9sKCdwcm90by5tb2RlbHMucHJvdG8uY29mZC5hcGkuQXR0cmlidXRlcycsIG51bGwsIGdsb2JhbCk7XG5nb29nLmV4cG9ydFN5bWJvbCgncHJvdG8ubW9kZWxzLnByb3RvLmNvZmQuYXBpLkJhc2ljSW5mbycsIG51bGwsIGdsb2JhbCk7XG5nb29nLmV4cG9ydFN5bWJvbCgncHJvdG8ubW9kZWxzLnByb3RvLmNvZmQuYXBpLkNvbmRpdGlvbicsIG51bGwsIGdsb2JhbCk7XG5nb29nLmV4cG9ydFN5bWJvbCgncHJvdG8ubW9kZWxzLnByb3RvLmNvZmQuYXBpLlNraWxsU3BlY2lhbGl6YXRpb25zVXBkYXRlJywgbnVsbCwgZ2xvYmFsKTtcbmdvb2cuZXhwb3J0U3ltYm9sKCdwcm90by5tb2RlbHMucHJvdG8uY29mZC5hcGkuU2tpbGxVcGRhdGUnLCBudWxsLCBnbG9iYWwpO1xuZ29vZy5leHBvcnRTeW1ib2woJ3Byb3RvLm1vZGVscy5wcm90by5jb2ZkLmFwaS5Ta2lsbHMnLCBudWxsLCBnbG9iYWwpO1xuZ29vZy5leHBvcnRTeW1ib2woJ3Byb3RvLm1vZGVscy5wcm90by5jb2ZkLmFwaS5VcGRhdGVBdHRyaWJ1dGVSZXF1ZXN0JywgbnVsbCwgZ2xvYmFsKTtcbmdvb2cuZXhwb3J0U3ltYm9sKCdwcm90by5tb2RlbHMucHJvdG8uY29mZC5hcGkuVXBkYXRlU2tpbGxWYWx1ZVJlcXVlc3QnLCBudWxsLCBnbG9iYWwpO1xuLyoqXG4gKiBHZW5lcmF0ZWQgYnkgSnNQYkNvZGVHZW5lcmF0b3IuXG4gKiBAcGFyYW0ge0FycmF5PX0gb3B0X2RhdGEgT3B0aW9uYWwgaW5pdGlhbCBkYXRhIGFycmF5LCB0eXBpY2FsbHkgZnJvbSBhXG4gKiBzZXJ2ZXIgcmVzcG9uc2UsIG9yIGNvbnN0cnVjdGVkIGRpcmVjdGx5IGluIEphdmFzY3JpcHQuIFRoZSBhcnJheSBpcyB1c2VkXG4gKiBpbiBwbGFjZSBhbmQgYmVjb21lcyBwYXJ0IG9mIHRoZSBjb25zdHJ1Y3RlZCBvYmplY3QuIEl0IGlzIG5vdCBjbG9uZWQuXG4gKiBJZiBubyBkYXRhIGlzIHByb3ZpZGVkLCB0aGUgY29uc3RydWN0ZWQgb2JqZWN0IHdpbGwgYmUgZW1wdHksIGJ1dCBzdGlsbFxuICogdmFsaWQuXG4gKiBAZXh0ZW5kcyB7anNwYi5NZXNzYWdlfVxuICogQGNvbnN0cnVjdG9yXG4gKi9cbnByb3RvLm1vZGVscy5wcm90by5jb2ZkLmFwaS5CYXNpY0luZm8gPSBmdW5jdGlvbihvcHRfZGF0YSkge1xuICBqc3BiLk1lc3NhZ2UuaW5pdGlhbGl6ZSh0aGlzLCBvcHRfZGF0YSwgMCwgLTEsIG51bGwsIG51bGwpO1xufTtcbmdvb2cuaW5oZXJpdHMocHJvdG8ubW9kZWxzLnByb3RvLmNvZmQuYXBpLkJhc2ljSW5mbywganNwYi5NZXNzYWdlKTtcbmlmIChnb29nLkRFQlVHICYmICFDT01QSUxFRCkge1xuICAvKipcbiAgICogQHB1YmxpY1xuICAgKiBAb3ZlcnJpZGVcbiAgICovXG4gIHByb3RvLm1vZGVscy5wcm90by5jb2ZkLmFwaS5CYXNpY0luZm8uZGlzcGxheU5hbWUgPSAncHJvdG8ubW9kZWxzLnByb3RvLmNvZmQuYXBpLkJhc2ljSW5mbyc7XG59XG4vKipcbiAqIEdlbmVyYXRlZCBieSBKc1BiQ29kZUdlbmVyYXRvci5cbiAqIEBwYXJhbSB7QXJyYXk9fSBvcHRfZGF0YSBPcHRpb25hbCBpbml0aWFsIGRhdGEgYXJyYXksIHR5cGljYWxseSBmcm9tIGFcbiAqIHNlcnZlciByZXNwb25zZSwgb3IgY29uc3RydWN0ZWQgZGlyZWN0bHkgaW4gSmF2YXNjcmlwdC4gVGhlIGFycmF5IGlzIHVzZWRcbiAqIGluIHBsYWNlIGFuZCBiZWNvbWVzIHBhcnQgb2YgdGhlIGNvbnN0cnVjdGVkIG9iamVjdC4gSXQgaXMgbm90IGNsb25lZC5cbiAqIElmIG5vIGRhdGEgaXMgcHJvdmlkZWQsIHRoZSBjb25zdHJ1Y3RlZCBvYmplY3Qgd2lsbCBiZSBlbXB0eSwgYnV0IHN0aWxsXG4gKiB2YWxpZC5cbiAqIEBleHRlbmRzIHtqc3BiLk1lc3NhZ2V9XG4gKiBAY29uc3RydWN0b3JcbiAqL1xucHJvdG8ubW9kZWxzLnByb3RvLmNvZmQuYXBpLkF0dHJpYnV0ZXMgPSBmdW5jdGlvbihvcHRfZGF0YSkge1xuICBqc3BiLk1lc3NhZ2UuaW5pdGlhbGl6ZSh0aGlzLCBvcHRfZGF0YSwgMCwgLTEsIG51bGwsIG51bGwpO1xufTtcbmdvb2cuaW5oZXJpdHMocHJvdG8ubW9kZWxzLnByb3RvLmNvZmQuYXBpLkF0dHJpYnV0ZXMsIGpzcGIuTWVzc2FnZSk7XG5pZiAoZ29vZy5ERUJVRyAmJiAhQ09NUElMRUQpIHtcbiAgLyoqXG4gICAqIEBwdWJsaWNcbiAgICogQG92ZXJyaWRlXG4gICAqL1xuICBwcm90by5tb2RlbHMucHJvdG8uY29mZC5hcGkuQXR0cmlidXRlcy5kaXNwbGF5TmFtZSA9ICdwcm90by5tb2RlbHMucHJvdG8uY29mZC5hcGkuQXR0cmlidXRlcyc7XG59XG4vKipcbiAqIEdlbmVyYXRlZCBieSBKc1BiQ29kZUdlbmVyYXRvci5cbiAqIEBwYXJhbSB7QXJyYXk9fSBvcHRfZGF0YSBPcHRpb25hbCBpbml0aWFsIGRhdGEgYXJyYXksIHR5cGljYWxseSBmcm9tIGFcbiAqIHNlcnZlciByZXNwb25zZSwgb3IgY29uc3RydWN0ZWQgZGlyZWN0bHkgaW4gSmF2YXNjcmlwdC4gVGhlIGFycmF5IGlzIHVzZWRcbiAqIGluIHBsYWNlIGFuZCBiZWNvbWVzIHBhcnQgb2YgdGhlIGNvbnN0cnVjdGVkIG9iamVjdC4gSXQgaXMgbm90IGNsb25lZC5cbiAqIElmIG5vIGRhdGEgaXMgcHJvdmlkZWQsIHRoZSBjb25zdHJ1Y3RlZCBvYmplY3Qgd2lsbCBiZSBlbXB0eSwgYnV0IHN0aWxsXG4gKiB2YWxpZC5cbiAqIEBleHRlbmRzIHtqc3BiLk1lc3NhZ2V9XG4gKiBAY29uc3RydWN0b3JcbiAqL1xucHJvdG8ubW9kZWxzLnByb3RvLmNvZmQuYXBpLlVwZGF0ZUF0dHJpYnV0ZVJlcXVlc3QgPSBmdW5jdGlvbihvcHRfZGF0YSkge1xuICBqc3BiLk1lc3NhZ2UuaW5pdGlhbGl6ZSh0aGlzLCBvcHRfZGF0YSwgMCwgLTEsIG51bGwsIG51bGwpO1xufTtcbmdvb2cuaW5oZXJpdHMocHJvdG8ubW9kZWxzLnByb3RvLmNvZmQuYXBpLlVwZGF0ZUF0dHJpYnV0ZVJlcXVlc3QsIGpzcGIuTWVzc2FnZSk7XG5pZiAoZ29vZy5ERUJVRyAmJiAhQ09NUElMRUQpIHtcbiAgLyoqXG4gICAqIEBwdWJsaWNcbiAgICogQG92ZXJyaWRlXG4gICAqL1xuICBwcm90by5tb2RlbHMucHJvdG8uY29mZC5hcGkuVXBkYXRlQXR0cmlidXRlUmVxdWVzdC5kaXNwbGF5TmFtZSA9ICdwcm90by5tb2RlbHMucHJvdG8uY29mZC5hcGkuVXBkYXRlQXR0cmlidXRlUmVxdWVzdCc7XG59XG4vKipcbiAqIEdlbmVyYXRlZCBieSBKc1BiQ29kZUdlbmVyYXRvci5cbiAqIEBwYXJhbSB7QXJyYXk9fSBvcHRfZGF0YSBPcHRpb25hbCBpbml0aWFsIGRhdGEgYXJyYXksIHR5cGljYWxseSBmcm9tIGFcbiAqIHNlcnZlciByZXNwb25zZSwgb3IgY29uc3RydWN0ZWQgZGlyZWN0bHkgaW4gSmF2YXNjcmlwdC4gVGhlIGFycmF5IGlzIHVzZWRcbiAqIGluIHBsYWNlIGFuZCBiZWNvbWVzIHBhcnQgb2YgdGhlIGNvbnN0cnVjdGVkIG9iamVjdC4gSXQgaXMgbm90IGNsb25lZC5cbiAqIElmIG5vIGRhdGEgaXMgcHJvdmlkZWQsIHRoZSBjb25zdHJ1Y3RlZCBvYmplY3Qgd2lsbCBiZSBlbXB0eSwgYnV0IHN0aWxsXG4gKiB2YWxpZC5cbiAqIEBleHRlbmRzIHtqc3BiLk1lc3NhZ2V9XG4gKiBAY29uc3RydWN0b3JcbiAqL1xucHJvdG8ubW9kZWxzLnByb3RvLmNvZmQuYXBpLlNraWxscyA9IGZ1bmN0aW9uKG9wdF9kYXRhKSB7XG4gIGpzcGIuTWVzc2FnZS5pbml0aWFsaXplKHRoaXMsIG9wdF9kYXRhLCAwLCAtMSwgcHJvdG8ubW9kZWxzLnByb3RvLmNvZmQuYXBpLlNraWxscy5yZXBlYXRlZEZpZWxkc18sIG51bGwpO1xufTtcbmdvb2cuaW5oZXJpdHMocHJvdG8ubW9kZWxzLnByb3RvLmNvZmQuYXBpLlNraWxscywganNwYi5NZXNzYWdlKTtcbmlmIChnb29nLkRFQlVHICYmICFDT01QSUxFRCkge1xuICAvKipcbiAgICogQHB1YmxpY1xuICAgKiBAb3ZlcnJpZGVcbiAgICovXG4gIHByb3RvLm1vZGVscy5wcm90by5jb2ZkLmFwaS5Ta2lsbHMuZGlzcGxheU5hbWUgPSAncHJvdG8ubW9kZWxzLnByb3RvLmNvZmQuYXBpLlNraWxscyc7XG59XG4vKipcbiAqIEdlbmVyYXRlZCBieSBKc1BiQ29kZUdlbmVyYXRvci5cbiAqIEBwYXJhbSB7QXJyYXk9fSBvcHRfZGF0YSBPcHRpb25hbCBpbml0aWFsIGRhdGEgYXJyYXksIHR5cGljYWxseSBmcm9tIGFcbiAqIHNlcnZlciByZXNwb25zZSwgb3IgY29uc3RydWN0ZWQgZGlyZWN0bHkgaW4gSmF2YXNjcmlwdC4gVGhlIGFycmF5IGlzIHVzZWRcbiAqIGluIHBsYWNlIGFuZCBiZWNvbWVzIHBhcnQgb2YgdGhlIGNvbnN0cnVjdGVkIG9iamVjdC4gSXQgaXMgbm90IGNsb25lZC5cbiAqIElmIG5vIGRhdGEgaXMgcHJvdmlkZWQsIHRoZSBjb25zdHJ1Y3RlZCBvYmplY3Qgd2lsbCBiZSBlbXB0eSwgYnV0IHN0aWxsXG4gKiB2YWxpZC5cbiAqIEBleHRlbmRzIHtqc3BiLk1lc3NhZ2V9XG4gKiBAY29uc3RydWN0b3JcbiAqL1xucHJvdG8ubW9kZWxzLnByb3RvLmNvZmQuYXBpLlNraWxsVXBkYXRlID0gZnVuY3Rpb24ob3B0X2RhdGEpIHtcbiAganNwYi5NZXNzYWdlLmluaXRpYWxpemUodGhpcywgb3B0X2RhdGEsIDAsIC0xLCBudWxsLCBudWxsKTtcbn07XG5nb29nLmluaGVyaXRzKHByb3RvLm1vZGVscy5wcm90by5jb2ZkLmFwaS5Ta2lsbFVwZGF0ZSwganNwYi5NZXNzYWdlKTtcbmlmIChnb29nLkRFQlVHICYmICFDT01QSUxFRCkge1xuICAvKipcbiAgICogQHB1YmxpY1xuICAgKiBAb3ZlcnJpZGVcbiAgICovXG4gIHByb3RvLm1vZGVscy5wcm90by5jb2ZkLmFwaS5Ta2lsbFVwZGF0ZS5kaXNwbGF5TmFtZSA9ICdwcm90by5tb2RlbHMucHJvdG8uY29mZC5hcGkuU2tpbGxVcGRhdGUnO1xufVxuLyoqXG4gKiBHZW5lcmF0ZWQgYnkgSnNQYkNvZGVHZW5lcmF0b3IuXG4gKiBAcGFyYW0ge0FycmF5PX0gb3B0X2RhdGEgT3B0aW9uYWwgaW5pdGlhbCBkYXRhIGFycmF5LCB0eXBpY2FsbHkgZnJvbSBhXG4gKiBzZXJ2ZXIgcmVzcG9uc2UsIG9yIGNvbnN0cnVjdGVkIGRpcmVjdGx5IGluIEphdmFzY3JpcHQuIFRoZSBhcnJheSBpcyB1c2VkXG4gKiBpbiBwbGFjZSBhbmQgYmVjb21lcyBwYXJ0IG9mIHRoZSBjb25zdHJ1Y3RlZCBvYmplY3QuIEl0IGlzIG5vdCBjbG9uZWQuXG4gKiBJZiBubyBkYXRhIGlzIHByb3ZpZGVkLCB0aGUgY29uc3RydWN0ZWQgb2JqZWN0IHdpbGwgYmUgZW1wdHksIGJ1dCBzdGlsbFxuICogdmFsaWQuXG4gKiBAZXh0ZW5kcyB7anNwYi5NZXNzYWdlfVxuICogQGNvbnN0cnVjdG9yXG4gKi9cbnByb3RvLm1vZGVscy5wcm90by5jb2ZkLmFwaS5VcGRhdGVTa2lsbFZhbHVlUmVxdWVzdCA9IGZ1bmN0aW9uKG9wdF9kYXRhKSB7XG4gIGpzcGIuTWVzc2FnZS5pbml0aWFsaXplKHRoaXMsIG9wdF9kYXRhLCAwLCAtMSwgbnVsbCwgbnVsbCk7XG59O1xuZ29vZy5pbmhlcml0cyhwcm90by5tb2RlbHMucHJvdG8uY29mZC5hcGkuVXBkYXRlU2tpbGxWYWx1ZVJlcXVlc3QsIGpzcGIuTWVzc2FnZSk7XG5pZiAoZ29vZy5ERUJVRyAmJiAhQ09NUElMRUQpIHtcbiAgLyoqXG4gICAqIEBwdWJsaWNcbiAgICogQG92ZXJyaWRlXG4gICAqL1xuICBwcm90by5tb2RlbHMucHJvdG8uY29mZC5hcGkuVXBkYXRlU2tpbGxWYWx1ZVJlcXVlc3QuZGlzcGxheU5hbWUgPSAncHJvdG8ubW9kZWxzLnByb3RvLmNvZmQuYXBpLlVwZGF0ZVNraWxsVmFsdWVSZXF1ZXN0Jztcbn1cbi8qKlxuICogR2VuZXJhdGVkIGJ5IEpzUGJDb2RlR2VuZXJhdG9yLlxuICogQHBhcmFtIHtBcnJheT19IG9wdF9kYXRhIE9wdGlvbmFsIGluaXRpYWwgZGF0YSBhcnJheSwgdHlwaWNhbGx5IGZyb20gYVxuICogc2VydmVyIHJlc3BvbnNlLCBvciBjb25zdHJ1Y3RlZCBkaXJlY3RseSBpbiBKYXZhc2NyaXB0LiBUaGUgYXJyYXkgaXMgdXNlZFxuICogaW4gcGxhY2UgYW5kIGJlY29tZXMgcGFydCBvZiB0aGUgY29uc3RydWN0ZWQgb2JqZWN0LiBJdCBpcyBub3QgY2xvbmVkLlxuICogSWYgbm8gZGF0YSBpcyBwcm92aWRlZCwgdGhlIGNvbnN0cnVjdGVkIG9iamVjdCB3aWxsIGJlIGVtcHR5LCBidXQgc3RpbGxcbiAqIHZhbGlkLlxuICogQGV4dGVuZHMge2pzcGIuTWVzc2FnZX1cbiAqIEBjb25zdHJ1Y3RvclxuICovXG5wcm90by5tb2RlbHMucHJvdG8uY29mZC5hcGkuU2tpbGxTcGVjaWFsaXphdGlvbnNVcGRhdGUgPSBmdW5jdGlvbihvcHRfZGF0YSkge1xuICBqc3BiLk1lc3NhZ2UuaW5pdGlhbGl6ZSh0aGlzLCBvcHRfZGF0YSwgMCwgLTEsIHByb3RvLm1vZGVscy5wcm90by5jb2ZkLmFwaS5Ta2lsbFNwZWNpYWxpemF0aW9uc1VwZGF0ZS5yZXBlYXRlZEZpZWxkc18sIG51bGwpO1xufTtcbmdvb2cuaW5oZXJpdHMocHJvdG8ubW9kZWxzLnByb3RvLmNvZmQuYXBpLlNraWxsU3BlY2lhbGl6YXRpb25zVXBkYXRlLCBqc3BiLk1lc3NhZ2UpO1xuaWYgKGdvb2cuREVCVUcgJiYgIUNPTVBJTEVEKSB7XG4gIC8qKlxuICAgKiBAcHVibGljXG4gICAqIEBvdmVycmlkZVxuICAgKi9cbiAgcHJvdG8ubW9kZWxzLnByb3RvLmNvZmQuYXBpLlNraWxsU3BlY2lhbGl6YXRpb25zVXBkYXRlLmRpc3BsYXlOYW1lID0gJ3Byb3RvLm1vZGVscy5wcm90by5jb2ZkLmFwaS5Ta2lsbFNwZWNpYWxpemF0aW9uc1VwZGF0ZSc7XG59XG4vKipcbiAqIEdlbmVyYXRlZCBieSBKc1BiQ29kZUdlbmVyYXRvci5cbiAqIEBwYXJhbSB7QXJyYXk9fSBvcHRfZGF0YSBPcHRpb25hbCBpbml0aWFsIGRhdGEgYXJyYXksIHR5cGljYWxseSBmcm9tIGFcbiAqIHNlcnZlciByZXNwb25zZSwgb3IgY29uc3RydWN0ZWQgZGlyZWN0bHkgaW4gSmF2YXNjcmlwdC4gVGhlIGFycmF5IGlzIHVzZWRcbiAqIGluIHBsYWNlIGFuZCBiZWNvbWVzIHBhcnQgb2YgdGhlIGNvbnN0cnVjdGVkIG9iamVjdC4gSXQgaXMgbm90IGNsb25lZC5cbiAqIElmIG5vIGRhdGEgaXMgcHJvdmlkZWQsIHRoZSBjb25zdHJ1Y3RlZCBvYmplY3Qgd2lsbCBiZSBlbXB0eSwgYnV0IHN0aWxsXG4gKiB2YWxpZC5cbiAqIEBleHRlbmRzIHtqc3BiLk1lc3NhZ2V9XG4gKiBAY29uc3RydWN0b3JcbiAqL1xucHJvdG8ubW9kZWxzLnByb3RvLmNvZmQuYXBpLkNvbmRpdGlvbiA9IGZ1bmN0aW9uKG9wdF9kYXRhKSB7XG4gIGpzcGIuTWVzc2FnZS5pbml0aWFsaXplKHRoaXMsIG9wdF9kYXRhLCAwLCAtMSwgbnVsbCwgbnVsbCk7XG59O1xuZ29vZy5pbmhlcml0cyhwcm90by5tb2RlbHMucHJvdG8uY29mZC5hcGkuQ29uZGl0aW9uLCBqc3BiLk1lc3NhZ2UpO1xuaWYgKGdvb2cuREVCVUcgJiYgIUNPTVBJTEVEKSB7XG4gIC8qKlxuICAgKiBAcHVibGljXG4gICAqIEBvdmVycmlkZVxuICAgKi9cbiAgcHJvdG8ubW9kZWxzLnByb3RvLmNvZmQuYXBpLkNvbmRpdGlvbi5kaXNwbGF5TmFtZSA9ICdwcm90by5tb2RlbHMucHJvdG8uY29mZC5hcGkuQ29uZGl0aW9uJztcbn1cblxuXG5cbmlmIChqc3BiLk1lc3NhZ2UuR0VORVJBVEVfVE9fT0JKRUNUKSB7XG4vKipcbiAqIENyZWF0ZXMgYW4gb2JqZWN0IHJlcHJlc2VudGF0aW9uIG9mIHRoaXMgcHJvdG8uXG4gKiBGaWVsZCBuYW1lcyB0aGF0IGFyZSByZXNlcnZlZCBpbiBKYXZhU2NyaXB0IGFuZCB3aWxsIGJlIHJlbmFtZWQgdG8gcGJfbmFtZS5cbiAqIE9wdGlvbmFsIGZpZWxkcyB0aGF0IGFyZSBub3Qgc2V0IHdpbGwgYmUgc2V0IHRvIHVuZGVmaW5lZC5cbiAqIFRvIGFjY2VzcyBhIHJlc2VydmVkIGZpZWxkIHVzZSwgZm9vLnBiXzxuYW1lPiwgZWcsIGZvby5wYl9kZWZhdWx0LlxuICogRm9yIHRoZSBsaXN0IG9mIHJlc2VydmVkIG5hbWVzIHBsZWFzZSBzZWU6XG4gKiAgICAgbmV0L3Byb3RvMi9jb21waWxlci9qcy9pbnRlcm5hbC9nZW5lcmF0b3IuY2Mja0tleXdvcmQuXG4gKiBAcGFyYW0ge2Jvb2xlYW49fSBvcHRfaW5jbHVkZUluc3RhbmNlIERlcHJlY2F0ZWQuIHdoZXRoZXIgdG8gaW5jbHVkZSB0aGVcbiAqICAgICBKU1BCIGluc3RhbmNlIGZvciB0cmFuc2l0aW9uYWwgc295IHByb3RvIHN1cHBvcnQ6XG4gKiAgICAgaHR0cDovL2dvdG8vc295LXBhcmFtLW1pZ3JhdGlvblxuICogQHJldHVybiB7IU9iamVjdH1cbiAqL1xucHJvdG8ubW9kZWxzLnByb3RvLmNvZmQuYXBpLkJhc2ljSW5mby5wcm90b3R5cGUudG9PYmplY3QgPSBmdW5jdGlvbihvcHRfaW5jbHVkZUluc3RhbmNlKSB7XG4gIHJldHVybiBwcm90by5tb2RlbHMucHJvdG8uY29mZC5hcGkuQmFzaWNJbmZvLnRvT2JqZWN0KG9wdF9pbmNsdWRlSW5zdGFuY2UsIHRoaXMpO1xufTtcblxuXG4vKipcbiAqIFN0YXRpYyB2ZXJzaW9uIG9mIHRoZSB7QHNlZSB0b09iamVjdH0gbWV0aG9kLlxuICogQHBhcmFtIHtib29sZWFufHVuZGVmaW5lZH0gaW5jbHVkZUluc3RhbmNlIERlcHJlY2F0ZWQuIFdoZXRoZXIgdG8gaW5jbHVkZVxuICogICAgIHRoZSBKU1BCIGluc3RhbmNlIGZvciB0cmFuc2l0aW9uYWwgc295IHByb3RvIHN1cHBvcnQ6XG4gKiAgICAgaHR0cDovL2dvdG8vc295LXBhcmFtLW1pZ3JhdGlvblxuICogQHBhcmFtIHshcHJvdG8ubW9kZWxzLnByb3RvLmNvZmQuYXBpLkJhc2ljSW5mb30gbXNnIFRoZSBtc2cgaW5zdGFuY2UgdG8gdHJhbnNmb3JtLlxuICogQHJldHVybiB7IU9iamVjdH1cbiAqIEBzdXBwcmVzcyB7dW51c2VkTG9jYWxWYXJpYWJsZXN9IGYgaXMgb25seSB1c2VkIGZvciBuZXN0ZWQgbWVzc2FnZXNcbiAqL1xucHJvdG8ubW9kZWxzLnByb3RvLmNvZmQuYXBpLkJhc2ljSW5mby50b09iamVjdCA9IGZ1bmN0aW9uKGluY2x1ZGVJbnN0YW5jZSwgbXNnKSB7XG4gIHZhciBmLCBvYmogPSB7XG4gICAgbmFtZToganNwYi5NZXNzYWdlLmdldEZpZWxkV2l0aERlZmF1bHQobXNnLCAxLCBcIlwiKSxcbiAgICBnZW5kZXI6IGpzcGIuTWVzc2FnZS5nZXRGaWVsZFdpdGhEZWZhdWx0KG1zZywgMiwgXCJcIiksXG4gICAgY29uY2VwdDoganNwYi5NZXNzYWdlLmdldEZpZWxkV2l0aERlZmF1bHQobXNnLCAzLCBcIlwiKSxcbiAgICBjaHJvbmljbGU6IGpzcGIuTWVzc2FnZS5nZXRGaWVsZFdpdGhEZWZhdWx0KG1zZywgNCwgXCJcIiksXG4gICAgYWdlOiBqc3BiLk1lc3NhZ2UuZ2V0RmllbGRXaXRoRGVmYXVsdChtc2csIDUsIDApXG4gIH07XG5cbiAgaWYgKGluY2x1ZGVJbnN0YW5jZSkge1xuICAgIG9iai4kanNwYk1lc3NhZ2VJbnN0YW5jZSA9IG1zZztcbiAgfVxuICByZXR1cm4gb2JqO1xufTtcbn1cblxuXG4vKipcbiAqIERlc2VyaWFsaXplcyBiaW5hcnkgZGF0YSAoaW4gcHJvdG9idWYgd2lyZSBmb3JtYXQpLlxuICogQHBhcmFtIHtqc3BiLkJ5dGVTb3VyY2V9IGJ5dGVzIFRoZSBieXRlcyB0byBkZXNlcmlhbGl6ZS5cbiAqIEByZXR1cm4geyFwcm90by5tb2RlbHMucHJvdG8uY29mZC5hcGkuQmFzaWNJbmZvfVxuICovXG5wcm90by5tb2RlbHMucHJvdG8uY29mZC5hcGkuQmFzaWNJbmZvLmRlc2VyaWFsaXplQmluYXJ5ID0gZnVuY3Rpb24oYnl0ZXMpIHtcbiAgdmFyIHJlYWRlciA9IG5ldyBqc3BiLkJpbmFyeVJlYWRlcihieXRlcyk7XG4gIHZhciBtc2cgPSBuZXcgcHJvdG8ubW9kZWxzLnByb3RvLmNvZmQuYXBpLkJhc2ljSW5mbztcbiAgcmV0dXJuIHByb3RvLm1vZGVscy5wcm90by5jb2ZkLmFwaS5CYXNpY0luZm8uZGVzZXJpYWxpemVCaW5hcnlGcm9tUmVhZGVyKG1zZywgcmVhZGVyKTtcbn07XG5cblxuLyoqXG4gKiBEZXNlcmlhbGl6ZXMgYmluYXJ5IGRhdGEgKGluIHByb3RvYnVmIHdpcmUgZm9ybWF0KSBmcm9tIHRoZVxuICogZ2l2ZW4gcmVhZGVyIGludG8gdGhlIGdpdmVuIG1lc3NhZ2Ugb2JqZWN0LlxuICogQHBhcmFtIHshcHJvdG8ubW9kZWxzLnByb3RvLmNvZmQuYXBpLkJhc2ljSW5mb30gbXNnIFRoZSBtZXNzYWdlIG9iamVjdCB0byBkZXNlcmlhbGl6ZSBpbnRvLlxuICogQHBhcmFtIHshanNwYi5CaW5hcnlSZWFkZXJ9IHJlYWRlciBUaGUgQmluYXJ5UmVhZGVyIHRvIHVzZS5cbiAqIEByZXR1cm4geyFwcm90by5tb2RlbHMucHJvdG8uY29mZC5hcGkuQmFzaWNJbmZvfVxuICovXG5wcm90by5tb2RlbHMucHJvdG8uY29mZC5hcGkuQmFzaWNJbmZvLmRlc2VyaWFsaXplQmluYXJ5RnJvbVJlYWRlciA9IGZ1bmN0aW9uKG1zZywgcmVhZGVyKSB7XG4gIHdoaWxlIChyZWFkZXIubmV4dEZpZWxkKCkpIHtcbiAgICBpZiAocmVhZGVyLmlzRW5kR3JvdXAoKSkge1xuICAgICAgYnJlYWs7XG4gICAgfVxuICAgIHZhciBmaWVsZCA9IHJlYWRlci5nZXRGaWVsZE51bWJlcigpO1xuICAgIHN3aXRjaCAoZmllbGQpIHtcbiAgICBjYXNlIDE6XG4gICAgICB2YXIgdmFsdWUgPSAvKiogQHR5cGUge3N0cmluZ30gKi8gKHJlYWRlci5yZWFkU3RyaW5nKCkpO1xuICAgICAgbXNnLnNldE5hbWUodmFsdWUpO1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSAyOlxuICAgICAgdmFyIHZhbHVlID0gLyoqIEB0eXBlIHtzdHJpbmd9ICovIChyZWFkZXIucmVhZFN0cmluZygpKTtcbiAgICAgIG1zZy5zZXRHZW5kZXIodmFsdWUpO1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSAzOlxuICAgICAgdmFyIHZhbHVlID0gLyoqIEB0eXBlIHtzdHJpbmd9ICovIChyZWFkZXIucmVhZFN0cmluZygpKTtcbiAgICAgIG1zZy5zZXRDb25jZXB0KHZhbHVlKTtcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgNDpcbiAgICAgIHZhciB2YWx1ZSA9IC8qKiBAdHlwZSB7c3RyaW5nfSAqLyAocmVhZGVyLnJlYWRTdHJpbmcoKSk7XG4gICAgICBtc2cuc2V0Q2hyb25pY2xlKHZhbHVlKTtcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgNTpcbiAgICAgIHZhciB2YWx1ZSA9IC8qKiBAdHlwZSB7bnVtYmVyfSAqLyAocmVhZGVyLnJlYWRJbnQzMigpKTtcbiAgICAgIG1zZy5zZXRBZ2UodmFsdWUpO1xuICAgICAgYnJlYWs7XG4gICAgZGVmYXVsdDpcbiAgICAgIHJlYWRlci5za2lwRmllbGQoKTtcbiAgICAgIGJyZWFrO1xuICAgIH1cbiAgfVxuICByZXR1cm4gbXNnO1xufTtcblxuXG4vKipcbiAqIFNlcmlhbGl6ZXMgdGhlIG1lc3NhZ2UgdG8gYmluYXJ5IGRhdGEgKGluIHByb3RvYnVmIHdpcmUgZm9ybWF0KS5cbiAqIEByZXR1cm4geyFVaW50OEFycmF5fVxuICovXG5wcm90by5tb2RlbHMucHJvdG8uY29mZC5hcGkuQmFzaWNJbmZvLnByb3RvdHlwZS5zZXJpYWxpemVCaW5hcnkgPSBmdW5jdGlvbigpIHtcbiAgdmFyIHdyaXRlciA9IG5ldyBqc3BiLkJpbmFyeVdyaXRlcigpO1xuICBwcm90by5tb2RlbHMucHJvdG8uY29mZC5hcGkuQmFzaWNJbmZvLnNlcmlhbGl6ZUJpbmFyeVRvV3JpdGVyKHRoaXMsIHdyaXRlcik7XG4gIHJldHVybiB3cml0ZXIuZ2V0UmVzdWx0QnVmZmVyKCk7XG59O1xuXG5cbi8qKlxuICogU2VyaWFsaXplcyB0aGUgZ2l2ZW4gbWVzc2FnZSB0byBiaW5hcnkgZGF0YSAoaW4gcHJvdG9idWYgd2lyZVxuICogZm9ybWF0KSwgd3JpdGluZyB0byB0aGUgZ2l2ZW4gQmluYXJ5V3JpdGVyLlxuICogQHBhcmFtIHshcHJvdG8ubW9kZWxzLnByb3RvLmNvZmQuYXBpLkJhc2ljSW5mb30gbWVzc2FnZVxuICogQHBhcmFtIHshanNwYi5CaW5hcnlXcml0ZXJ9IHdyaXRlclxuICogQHN1cHByZXNzIHt1bnVzZWRMb2NhbFZhcmlhYmxlc30gZiBpcyBvbmx5IHVzZWQgZm9yIG5lc3RlZCBtZXNzYWdlc1xuICovXG5wcm90by5tb2RlbHMucHJvdG8uY29mZC5hcGkuQmFzaWNJbmZvLnNlcmlhbGl6ZUJpbmFyeVRvV3JpdGVyID0gZnVuY3Rpb24obWVzc2FnZSwgd3JpdGVyKSB7XG4gIHZhciBmID0gdW5kZWZpbmVkO1xuICBmID0gbWVzc2FnZS5nZXROYW1lKCk7XG4gIGlmIChmLmxlbmd0aCA+IDApIHtcbiAgICB3cml0ZXIud3JpdGVTdHJpbmcoXG4gICAgICAxLFxuICAgICAgZlxuICAgICk7XG4gIH1cbiAgZiA9IG1lc3NhZ2UuZ2V0R2VuZGVyKCk7XG4gIGlmIChmLmxlbmd0aCA+IDApIHtcbiAgICB3cml0ZXIud3JpdGVTdHJpbmcoXG4gICAgICAyLFxuICAgICAgZlxuICAgICk7XG4gIH1cbiAgZiA9IG1lc3NhZ2UuZ2V0Q29uY2VwdCgpO1xuICBpZiAoZi5sZW5ndGggPiAwKSB7XG4gICAgd3JpdGVyLndyaXRlU3RyaW5nKFxuICAgICAgMyxcbiAgICAgIGZcbiAgICApO1xuICB9XG4gIGYgPSBtZXNzYWdlLmdldENocm9uaWNsZSgpO1xuICBpZiAoZi5sZW5ndGggPiAwKSB7XG4gICAgd3JpdGVyLndyaXRlU3RyaW5nKFxuICAgICAgNCxcbiAgICAgIGZcbiAgICApO1xuICB9XG4gIGYgPSBtZXNzYWdlLmdldEFnZSgpO1xuICBpZiAoZiAhPT0gMCkge1xuICAgIHdyaXRlci53cml0ZUludDMyKFxuICAgICAgNSxcbiAgICAgIGZcbiAgICApO1xuICB9XG59O1xuXG5cbi8qKlxuICogb3B0aW9uYWwgc3RyaW5nIG5hbWUgPSAxO1xuICogQHJldHVybiB7c3RyaW5nfVxuICovXG5wcm90by5tb2RlbHMucHJvdG8uY29mZC5hcGkuQmFzaWNJbmZvLnByb3RvdHlwZS5nZXROYW1lID0gZnVuY3Rpb24oKSB7XG4gIHJldHVybiAvKiogQHR5cGUge3N0cmluZ30gKi8gKGpzcGIuTWVzc2FnZS5nZXRGaWVsZFdpdGhEZWZhdWx0KHRoaXMsIDEsIFwiXCIpKTtcbn07XG5cblxuLyoqXG4gKiBAcGFyYW0ge3N0cmluZ30gdmFsdWVcbiAqIEByZXR1cm4geyFwcm90by5tb2RlbHMucHJvdG8uY29mZC5hcGkuQmFzaWNJbmZvfSByZXR1cm5zIHRoaXNcbiAqL1xucHJvdG8ubW9kZWxzLnByb3RvLmNvZmQuYXBpLkJhc2ljSW5mby5wcm90b3R5cGUuc2V0TmFtZSA9IGZ1bmN0aW9uKHZhbHVlKSB7XG4gIHJldHVybiBqc3BiLk1lc3NhZ2Uuc2V0UHJvdG8zU3RyaW5nRmllbGQodGhpcywgMSwgdmFsdWUpO1xufTtcblxuXG4vKipcbiAqIG9wdGlvbmFsIHN0cmluZyBnZW5kZXIgPSAyO1xuICogQHJldHVybiB7c3RyaW5nfVxuICovXG5wcm90by5tb2RlbHMucHJvdG8uY29mZC5hcGkuQmFzaWNJbmZvLnByb3RvdHlwZS5nZXRHZW5kZXIgPSBmdW5jdGlvbigpIHtcbiAgcmV0dXJuIC8qKiBAdHlwZSB7c3RyaW5nfSAqLyAoanNwYi5NZXNzYWdlLmdldEZpZWxkV2l0aERlZmF1bHQodGhpcywgMiwgXCJcIikpO1xufTtcblxuXG4vKipcbiAqIEBwYXJhbSB7c3RyaW5nfSB2YWx1ZVxuICogQHJldHVybiB7IXByb3RvLm1vZGVscy5wcm90by5jb2ZkLmFwaS5CYXNpY0luZm99IHJldHVybnMgdGhpc1xuICovXG5wcm90by5tb2RlbHMucHJvdG8uY29mZC5hcGkuQmFzaWNJbmZvLnByb3RvdHlwZS5zZXRHZW5kZXIgPSBmdW5jdGlvbih2YWx1ZSkge1xuICByZXR1cm4ganNwYi5NZXNzYWdlLnNldFByb3RvM1N0cmluZ0ZpZWxkKHRoaXMsIDIsIHZhbHVlKTtcbn07XG5cblxuLyoqXG4gKiBvcHRpb25hbCBzdHJpbmcgY29uY2VwdCA9IDM7XG4gKiBAcmV0dXJuIHtzdHJpbmd9XG4gKi9cbnByb3RvLm1vZGVscy5wcm90by5jb2ZkLmFwaS5CYXNpY0luZm8ucHJvdG90eXBlLmdldENvbmNlcHQgPSBmdW5jdGlvbigpIHtcbiAgcmV0dXJuIC8qKiBAdHlwZSB7c3RyaW5nfSAqLyAoanNwYi5NZXNzYWdlLmdldEZpZWxkV2l0aERlZmF1bHQodGhpcywgMywgXCJcIikpO1xufTtcblxuXG4vKipcbiAqIEBwYXJhbSB7c3RyaW5nfSB2YWx1ZVxuICogQHJldHVybiB7IXByb3RvLm1vZGVscy5wcm90by5jb2ZkLmFwaS5CYXNpY0luZm99IHJldHVybnMgdGhpc1xuICovXG5wcm90by5tb2RlbHMucHJvdG8uY29mZC5hcGkuQmFzaWNJbmZvLnByb3RvdHlwZS5zZXRDb25jZXB0ID0gZnVuY3Rpb24odmFsdWUpIHtcbiAgcmV0dXJuIGpzcGIuTWVzc2FnZS5zZXRQcm90bzNTdHJpbmdGaWVsZCh0aGlzLCAzLCB2YWx1ZSk7XG59O1xuXG5cbi8qKlxuICogb3B0aW9uYWwgc3RyaW5nIGNocm9uaWNsZSA9IDQ7XG4gKiBAcmV0dXJuIHtzdHJpbmd9XG4gKi9cbnByb3RvLm1vZGVscy5wcm90by5jb2ZkLmFwaS5CYXNpY0luZm8ucHJvdG90eXBlLmdldENocm9uaWNsZSA9IGZ1bmN0aW9uKCkge1xuICByZXR1cm4gLyoqIEB0eXBlIHtzdHJpbmd9ICovIChqc3BiLk1lc3NhZ2UuZ2V0RmllbGRXaXRoRGVmYXVsdCh0aGlzLCA0LCBcIlwiKSk7XG59O1xuXG5cbi8qKlxuICogQHBhcmFtIHtzdHJpbmd9IHZhbHVlXG4gKiBAcmV0dXJuIHshcHJvdG8ubW9kZWxzLnByb3RvLmNvZmQuYXBpLkJhc2ljSW5mb30gcmV0dXJucyB0aGlzXG4gKi9cbnByb3RvLm1vZGVscy5wcm90by5jb2ZkLmFwaS5CYXNpY0luZm8ucHJvdG90eXBlLnNldENocm9uaWNsZSA9IGZ1bmN0aW9uKHZhbHVlKSB7XG4gIHJldHVybiBqc3BiLk1lc3NhZ2Uuc2V0UHJvdG8zU3RyaW5nRmllbGQodGhpcywgNCwgdmFsdWUpO1xufTtcblxuXG4vKipcbiAqIG9wdGlvbmFsIGludDMyIGFnZSA9IDU7XG4gKiBAcmV0dXJuIHtudW1iZXJ9XG4gKi9cbnByb3RvLm1vZGVscy5wcm90by5jb2ZkLmFwaS5CYXNpY0luZm8ucHJvdG90eXBlLmdldEFnZSA9IGZ1bmN0aW9uKCkge1xuICByZXR1cm4gLyoqIEB0eXBlIHtudW1iZXJ9ICovIChqc3BiLk1lc3NhZ2UuZ2V0RmllbGRXaXRoRGVmYXVsdCh0aGlzLCA1LCAwKSk7XG59O1xuXG5cbi8qKlxuICogQHBhcmFtIHtudW1iZXJ9IHZhbHVlXG4gKiBAcmV0dXJuIHshcHJvdG8ubW9kZWxzLnByb3RvLmNvZmQuYXBpLkJhc2ljSW5mb30gcmV0dXJucyB0aGlzXG4gKi9cbnByb3RvLm1vZGVscy5wcm90by5jb2ZkLmFwaS5CYXNpY0luZm8ucHJvdG90eXBlLnNldEFnZSA9IGZ1bmN0aW9uKHZhbHVlKSB7XG4gIHJldHVybiBqc3BiLk1lc3NhZ2Uuc2V0UHJvdG8zSW50RmllbGQodGhpcywgNSwgdmFsdWUpO1xufTtcblxuXG5cblxuXG5pZiAoanNwYi5NZXNzYWdlLkdFTkVSQVRFX1RPX09CSkVDVCkge1xuLyoqXG4gKiBDcmVhdGVzIGFuIG9iamVjdCByZXByZXNlbnRhdGlvbiBvZiB0aGlzIHByb3RvLlxuICogRmllbGQgbmFtZXMgdGhhdCBhcmUgcmVzZXJ2ZWQgaW4gSmF2YVNjcmlwdCBhbmQgd2lsbCBiZSByZW5hbWVkIHRvIHBiX25hbWUuXG4gKiBPcHRpb25hbCBmaWVsZHMgdGhhdCBhcmUgbm90IHNldCB3aWxsIGJlIHNldCB0byB1bmRlZmluZWQuXG4gKiBUbyBhY2Nlc3MgYSByZXNlcnZlZCBmaWVsZCB1c2UsIGZvby5wYl88bmFtZT4sIGVnLCBmb28ucGJfZGVmYXVsdC5cbiAqIEZvciB0aGUgbGlzdCBvZiByZXNlcnZlZCBuYW1lcyBwbGVhc2Ugc2VlOlxuICogICAgIG5ldC9wcm90bzIvY29tcGlsZXIvanMvaW50ZXJuYWwvZ2VuZXJhdG9yLmNjI2tLZXl3b3JkLlxuICogQHBhcmFtIHtib29sZWFuPX0gb3B0X2luY2x1ZGVJbnN0YW5jZSBEZXByZWNhdGVkLiB3aGV0aGVyIHRvIGluY2x1ZGUgdGhlXG4gKiAgICAgSlNQQiBpbnN0YW5jZSBmb3IgdHJhbnNpdGlvbmFsIHNveSBwcm90byBzdXBwb3J0OlxuICogICAgIGh0dHA6Ly9nb3RvL3NveS1wYXJhbS1taWdyYXRpb25cbiAqIEByZXR1cm4geyFPYmplY3R9XG4gKi9cbnByb3RvLm1vZGVscy5wcm90by5jb2ZkLmFwaS5BdHRyaWJ1dGVzLnByb3RvdHlwZS50b09iamVjdCA9IGZ1bmN0aW9uKG9wdF9pbmNsdWRlSW5zdGFuY2UpIHtcbiAgcmV0dXJuIHByb3RvLm1vZGVscy5wcm90by5jb2ZkLmFwaS5BdHRyaWJ1dGVzLnRvT2JqZWN0KG9wdF9pbmNsdWRlSW5zdGFuY2UsIHRoaXMpO1xufTtcblxuXG4vKipcbiAqIFN0YXRpYyB2ZXJzaW9uIG9mIHRoZSB7QHNlZSB0b09iamVjdH0gbWV0aG9kLlxuICogQHBhcmFtIHtib29sZWFufHVuZGVmaW5lZH0gaW5jbHVkZUluc3RhbmNlIERlcHJlY2F0ZWQuIFdoZXRoZXIgdG8gaW5jbHVkZVxuICogICAgIHRoZSBKU1BCIGluc3RhbmNlIGZvciB0cmFuc2l0aW9uYWwgc295IHByb3RvIHN1cHBvcnQ6XG4gKiAgICAgaHR0cDovL2dvdG8vc295LXBhcmFtLW1pZ3JhdGlvblxuICogQHBhcmFtIHshcHJvdG8ubW9kZWxzLnByb3RvLmNvZmQuYXBpLkF0dHJpYnV0ZXN9IG1zZyBUaGUgbXNnIGluc3RhbmNlIHRvIHRyYW5zZm9ybS5cbiAqIEByZXR1cm4geyFPYmplY3R9XG4gKiBAc3VwcHJlc3Mge3VudXNlZExvY2FsVmFyaWFibGVzfSBmIGlzIG9ubHkgdXNlZCBmb3IgbmVzdGVkIG1lc3NhZ2VzXG4gKi9cbnByb3RvLm1vZGVscy5wcm90by5jb2ZkLmFwaS5BdHRyaWJ1dGVzLnRvT2JqZWN0ID0gZnVuY3Rpb24oaW5jbHVkZUluc3RhbmNlLCBtc2cpIHtcbiAgdmFyIGYsIG9iaiA9IHtcbiAgICBzdHJlbmd0aDoganNwYi5NZXNzYWdlLmdldEZpZWxkV2l0aERlZmF1bHQobXNnLCAxLCAwKSxcbiAgICBkZXh0ZXJpdHk6IGpzcGIuTWVzc2FnZS5nZXRGaWVsZFdpdGhEZWZhdWx0KG1zZywgMiwgMCksXG4gICAgc3RhbWluYToganNwYi5NZXNzYWdlLmdldEZpZWxkV2l0aERlZmF1bHQobXNnLCAzLCAwKSxcbiAgICBpbnRlbGxpZ2VuY2U6IGpzcGIuTWVzc2FnZS5nZXRGaWVsZFdpdGhEZWZhdWx0KG1zZywgNCwgMCksXG4gICAgd2l0czoganNwYi5NZXNzYWdlLmdldEZpZWxkV2l0aERlZmF1bHQobXNnLCA1LCAwKSxcbiAgICByZXNvbHZlOiBqc3BiLk1lc3NhZ2UuZ2V0RmllbGRXaXRoRGVmYXVsdChtc2csIDYsIDApLFxuICAgIHByZXNlbmNlOiBqc3BiLk1lc3NhZ2UuZ2V0RmllbGRXaXRoRGVmYXVsdChtc2csIDcsIDApLFxuICAgIG1hbmlwdWxhdGlvbjoganNwYi5NZXNzYWdlLmdldEZpZWxkV2l0aERlZmF1bHQobXNnLCA4LCAwKSxcbiAgICBjb21wb3N1cmU6IGpzcGIuTWVzc2FnZS5nZXRGaWVsZFdpdGhEZWZhdWx0KG1zZywgOSwgMClcbiAgfTtcblxuICBpZiAoaW5jbHVkZUluc3RhbmNlKSB7XG4gICAgb2JqLiRqc3BiTWVzc2FnZUluc3RhbmNlID0gbXNnO1xuICB9XG4gIHJldHVybiBvYmo7XG59O1xufVxuXG5cbi8qKlxuICogRGVzZXJpYWxpemVzIGJpbmFyeSBkYXRhIChpbiBwcm90b2J1ZiB3aXJlIGZvcm1hdCkuXG4gKiBAcGFyYW0ge2pzcGIuQnl0ZVNvdXJjZX0gYnl0ZXMgVGhlIGJ5dGVzIHRvIGRlc2VyaWFsaXplLlxuICogQHJldHVybiB7IXByb3RvLm1vZGVscy5wcm90by5jb2ZkLmFwaS5BdHRyaWJ1dGVzfVxuICovXG5wcm90by5tb2RlbHMucHJvdG8uY29mZC5hcGkuQXR0cmlidXRlcy5kZXNlcmlhbGl6ZUJpbmFyeSA9IGZ1bmN0aW9uKGJ5dGVzKSB7XG4gIHZhciByZWFkZXIgPSBuZXcganNwYi5CaW5hcnlSZWFkZXIoYnl0ZXMpO1xuICB2YXIgbXNnID0gbmV3IHByb3RvLm1vZGVscy5wcm90by5jb2ZkLmFwaS5BdHRyaWJ1dGVzO1xuICByZXR1cm4gcHJvdG8ubW9kZWxzLnByb3RvLmNvZmQuYXBpLkF0dHJpYnV0ZXMuZGVzZXJpYWxpemVCaW5hcnlGcm9tUmVhZGVyKG1zZywgcmVhZGVyKTtcbn07XG5cblxuLyoqXG4gKiBEZXNlcmlhbGl6ZXMgYmluYXJ5IGRhdGEgKGluIHByb3RvYnVmIHdpcmUgZm9ybWF0KSBmcm9tIHRoZVxuICogZ2l2ZW4gcmVhZGVyIGludG8gdGhlIGdpdmVuIG1lc3NhZ2Ugb2JqZWN0LlxuICogQHBhcmFtIHshcHJvdG8ubW9kZWxzLnByb3RvLmNvZmQuYXBpLkF0dHJpYnV0ZXN9IG1zZyBUaGUgbWVzc2FnZSBvYmplY3QgdG8gZGVzZXJpYWxpemUgaW50by5cbiAqIEBwYXJhbSB7IWpzcGIuQmluYXJ5UmVhZGVyfSByZWFkZXIgVGhlIEJpbmFyeVJlYWRlciB0byB1c2UuXG4gKiBAcmV0dXJuIHshcHJvdG8ubW9kZWxzLnByb3RvLmNvZmQuYXBpLkF0dHJpYnV0ZXN9XG4gKi9cbnByb3RvLm1vZGVscy5wcm90by5jb2ZkLmFwaS5BdHRyaWJ1dGVzLmRlc2VyaWFsaXplQmluYXJ5RnJvbVJlYWRlciA9IGZ1bmN0aW9uKG1zZywgcmVhZGVyKSB7XG4gIHdoaWxlIChyZWFkZXIubmV4dEZpZWxkKCkpIHtcbiAgICBpZiAocmVhZGVyLmlzRW5kR3JvdXAoKSkge1xuICAgICAgYnJlYWs7XG4gICAgfVxuICAgIHZhciBmaWVsZCA9IHJlYWRlci5nZXRGaWVsZE51bWJlcigpO1xuICAgIHN3aXRjaCAoZmllbGQpIHtcbiAgICBjYXNlIDE6XG4gICAgICB2YXIgdmFsdWUgPSAvKiogQHR5cGUge251bWJlcn0gKi8gKHJlYWRlci5yZWFkSW50MzIoKSk7XG4gICAgICBtc2cuc2V0U3RyZW5ndGgodmFsdWUpO1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSAyOlxuICAgICAgdmFyIHZhbHVlID0gLyoqIEB0eXBlIHtudW1iZXJ9ICovIChyZWFkZXIucmVhZEludDMyKCkpO1xuICAgICAgbXNnLnNldERleHRlcml0eSh2YWx1ZSk7XG4gICAgICBicmVhaztcbiAgICBjYXNlIDM6XG4gICAgICB2YXIgdmFsdWUgPSAvKiogQHR5cGUge251bWJlcn0gKi8gKHJlYWRlci5yZWFkSW50MzIoKSk7XG4gICAgICBtc2cuc2V0U3RhbWluYSh2YWx1ZSk7XG4gICAgICBicmVhaztcbiAgICBjYXNlIDQ6XG4gICAgICB2YXIgdmFsdWUgPSAvKiogQHR5cGUge251bWJlcn0gKi8gKHJlYWRlci5yZWFkSW50MzIoKSk7XG4gICAgICBtc2cuc2V0SW50ZWxsaWdlbmNlKHZhbHVlKTtcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgNTpcbiAgICAgIHZhciB2YWx1ZSA9IC8qKiBAdHlwZSB7bnVtYmVyfSAqLyAocmVhZGVyLnJlYWRJbnQzMigpKTtcbiAgICAgIG1zZy5zZXRXaXRzKHZhbHVlKTtcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgNjpcbiAgICAgIHZhciB2YWx1ZSA9IC8qKiBAdHlwZSB7bnVtYmVyfSAqLyAocmVhZGVyLnJlYWRJbnQzMigpKTtcbiAgICAgIG1zZy5zZXRSZXNvbHZlKHZhbHVlKTtcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgNzpcbiAgICAgIHZhciB2YWx1ZSA9IC8qKiBAdHlwZSB7bnVtYmVyfSAqLyAocmVhZGVyLnJlYWRJbnQzMigpKTtcbiAgICAgIG1zZy5zZXRQcmVzZW5jZSh2YWx1ZSk7XG4gICAgICBicmVhaztcbiAgICBjYXNlIDg6XG4gICAgICB2YXIgdmFsdWUgPSAvKiogQHR5cGUge251bWJlcn0gKi8gKHJlYWRlci5yZWFkSW50MzIoKSk7XG4gICAgICBtc2cuc2V0TWFuaXB1bGF0aW9uKHZhbHVlKTtcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgOTpcbiAgICAgIHZhciB2YWx1ZSA9IC8qKiBAdHlwZSB7bnVtYmVyfSAqLyAocmVhZGVyLnJlYWRJbnQzMigpKTtcbiAgICAgIG1zZy5zZXRDb21wb3N1cmUodmFsdWUpO1xuICAgICAgYnJlYWs7XG4gICAgZGVmYXVsdDpcbiAgICAgIHJlYWRlci5za2lwRmllbGQoKTtcbiAgICAgIGJyZWFrO1xuICAgIH1cbiAgfVxuICByZXR1cm4gbXNnO1xufTtcblxuXG4vKipcbiAqIFNlcmlhbGl6ZXMgdGhlIG1lc3NhZ2UgdG8gYmluYXJ5IGRhdGEgKGluIHByb3RvYnVmIHdpcmUgZm9ybWF0KS5cbiAqIEByZXR1cm4geyFVaW50OEFycmF5fVxuICovXG5wcm90by5tb2RlbHMucHJvdG8uY29mZC5hcGkuQXR0cmlidXRlcy5wcm90b3R5cGUuc2VyaWFsaXplQmluYXJ5ID0gZnVuY3Rpb24oKSB7XG4gIHZhciB3cml0ZXIgPSBuZXcganNwYi5CaW5hcnlXcml0ZXIoKTtcbiAgcHJvdG8ubW9kZWxzLnByb3RvLmNvZmQuYXBpLkF0dHJpYnV0ZXMuc2VyaWFsaXplQmluYXJ5VG9Xcml0ZXIodGhpcywgd3JpdGVyKTtcbiAgcmV0dXJuIHdyaXRlci5nZXRSZXN1bHRCdWZmZXIoKTtcbn07XG5cblxuLyoqXG4gKiBTZXJpYWxpemVzIHRoZSBnaXZlbiBtZXNzYWdlIHRvIGJpbmFyeSBkYXRhIChpbiBwcm90b2J1ZiB3aXJlXG4gKiBmb3JtYXQpLCB3cml0aW5nIHRvIHRoZSBnaXZlbiBCaW5hcnlXcml0ZXIuXG4gKiBAcGFyYW0geyFwcm90by5tb2RlbHMucHJvdG8uY29mZC5hcGkuQXR0cmlidXRlc30gbWVzc2FnZVxuICogQHBhcmFtIHshanNwYi5CaW5hcnlXcml0ZXJ9IHdyaXRlclxuICogQHN1cHByZXNzIHt1bnVzZWRMb2NhbFZhcmlhYmxlc30gZiBpcyBvbmx5IHVzZWQgZm9yIG5lc3RlZCBtZXNzYWdlc1xuICovXG5wcm90by5tb2RlbHMucHJvdG8uY29mZC5hcGkuQXR0cmlidXRlcy5zZXJpYWxpemVCaW5hcnlUb1dyaXRlciA9IGZ1bmN0aW9uKG1lc3NhZ2UsIHdyaXRlcikge1xuICB2YXIgZiA9IHVuZGVmaW5lZDtcbiAgZiA9IG1lc3NhZ2UuZ2V0U3RyZW5ndGgoKTtcbiAgaWYgKGYgIT09IDApIHtcbiAgICB3cml0ZXIud3JpdGVJbnQzMihcbiAgICAgIDEsXG4gICAgICBmXG4gICAgKTtcbiAgfVxuICBmID0gbWVzc2FnZS5nZXREZXh0ZXJpdHkoKTtcbiAgaWYgKGYgIT09IDApIHtcbiAgICB3cml0ZXIud3JpdGVJbnQzMihcbiAgICAgIDIsXG4gICAgICBmXG4gICAgKTtcbiAgfVxuICBmID0gbWVzc2FnZS5nZXRTdGFtaW5hKCk7XG4gIGlmIChmICE9PSAwKSB7XG4gICAgd3JpdGVyLndyaXRlSW50MzIoXG4gICAgICAzLFxuICAgICAgZlxuICAgICk7XG4gIH1cbiAgZiA9IG1lc3NhZ2UuZ2V0SW50ZWxsaWdlbmNlKCk7XG4gIGlmIChmICE9PSAwKSB7XG4gICAgd3JpdGVyLndyaXRlSW50MzIoXG4gICAgICA0LFxuICAgICAgZlxuICAgICk7XG4gIH1cbiAgZiA9IG1lc3NhZ2UuZ2V0V2l0cygpO1xuICBpZiAoZiAhPT0gMCkge1xuICAgIHdyaXRlci53cml0ZUludDMyKFxuICAgICAgNSxcbiAgICAgIGZcbiAgICApO1xuICB9XG4gIGYgPSBtZXNzYWdlLmdldFJlc29sdmUoKTtcbiAgaWYgKGYgIT09IDApIHtcbiAgICB3cml0ZXIud3JpdGVJbnQzMihcbiAgICAgIDYsXG4gICAgICBmXG4gICAgKTtcbiAgfVxuICBmID0gbWVzc2FnZS5nZXRQcmVzZW5jZSgpO1xuICBpZiAoZiAhPT0gMCkge1xuICAgIHdyaXRlci53cml0ZUludDMyKFxuICAgICAgNyxcbiAgICAgIGZcbiAgICApO1xuICB9XG4gIGYgPSBtZXNzYWdlLmdldE1hbmlwdWxhdGlvbigpO1xuICBpZiAoZiAhPT0gMCkge1xuICAgIHdyaXRlci53cml0ZUludDMyKFxuICAgICAgOCxcbiAgICAgIGZcbiAgICApO1xuICB9XG4gIGYgPSBtZXNzYWdlLmdldENvbXBvc3VyZSgpO1xuICBpZiAoZiAhPT0gMCkge1xuICAgIHdyaXRlci53cml0ZUludDMyKFxuICAgICAgOSxcbiAgICAgIGZcbiAgICApO1xuICB9XG59O1xuXG5cbi8qKlxuICogb3B0aW9uYWwgaW50MzIgc3RyZW5ndGggPSAxO1xuICogQHJldHVybiB7bnVtYmVyfVxuICovXG5wcm90by5tb2RlbHMucHJvdG8uY29mZC5hcGkuQXR0cmlidXRlcy5wcm90b3R5cGUuZ2V0U3RyZW5ndGggPSBmdW5jdGlvbigpIHtcbiAgcmV0dXJuIC8qKiBAdHlwZSB7bnVtYmVyfSAqLyAoanNwYi5NZXNzYWdlLmdldEZpZWxkV2l0aERlZmF1bHQodGhpcywgMSwgMCkpO1xufTtcblxuXG4vKipcbiAqIEBwYXJhbSB7bnVtYmVyfSB2YWx1ZVxuICogQHJldHVybiB7IXByb3RvLm1vZGVscy5wcm90by5jb2ZkLmFwaS5BdHRyaWJ1dGVzfSByZXR1cm5zIHRoaXNcbiAqL1xucHJvdG8ubW9kZWxzLnByb3RvLmNvZmQuYXBpLkF0dHJpYnV0ZXMucHJvdG90eXBlLnNldFN0cmVuZ3RoID0gZnVuY3Rpb24odmFsdWUpIHtcbiAgcmV0dXJuIGpzcGIuTWVzc2FnZS5zZXRQcm90bzNJbnRGaWVsZCh0aGlzLCAxLCB2YWx1ZSk7XG59O1xuXG5cbi8qKlxuICogb3B0aW9uYWwgaW50MzIgZGV4dGVyaXR5ID0gMjtcbiAqIEByZXR1cm4ge251bWJlcn1cbiAqL1xucHJvdG8ubW9kZWxzLnByb3RvLmNvZmQuYXBpLkF0dHJpYnV0ZXMucHJvdG90eXBlLmdldERleHRlcml0eSA9IGZ1bmN0aW9uKCkge1xuICByZXR1cm4gLyoqIEB0eXBlIHtudW1iZXJ9ICovIChqc3BiLk1lc3NhZ2UuZ2V0RmllbGRXaXRoRGVmYXVsdCh0aGlzLCAyLCAwKSk7XG59O1xuXG5cbi8qKlxuICogQHBhcmFtIHtudW1iZXJ9IHZhbHVlXG4gKiBAcmV0dXJuIHshcHJvdG8ubW9kZWxzLnByb3RvLmNvZmQuYXBpLkF0dHJpYnV0ZXN9IHJldHVybnMgdGhpc1xuICovXG5wcm90by5tb2RlbHMucHJvdG8uY29mZC5hcGkuQXR0cmlidXRlcy5wcm90b3R5cGUuc2V0RGV4dGVyaXR5ID0gZnVuY3Rpb24odmFsdWUpIHtcbiAgcmV0dXJuIGpzcGIuTWVzc2FnZS5zZXRQcm90bzNJbnRGaWVsZCh0aGlzLCAyLCB2YWx1ZSk7XG59O1xuXG5cbi8qKlxuICogb3B0aW9uYWwgaW50MzIgc3RhbWluYSA9IDM7XG4gKiBAcmV0dXJuIHtudW1iZXJ9XG4gKi9cbnByb3RvLm1vZGVscy5wcm90by5jb2ZkLmFwaS5BdHRyaWJ1dGVzLnByb3RvdHlwZS5nZXRTdGFtaW5hID0gZnVuY3Rpb24oKSB7XG4gIHJldHVybiAvKiogQHR5cGUge251bWJlcn0gKi8gKGpzcGIuTWVzc2FnZS5nZXRGaWVsZFdpdGhEZWZhdWx0KHRoaXMsIDMsIDApKTtcbn07XG5cblxuLyoqXG4gKiBAcGFyYW0ge251bWJlcn0gdmFsdWVcbiAqIEByZXR1cm4geyFwcm90by5tb2RlbHMucHJvdG8uY29mZC5hcGkuQXR0cmlidXRlc30gcmV0dXJucyB0aGlzXG4gKi9cbnByb3RvLm1vZGVscy5wcm90by5jb2ZkLmFwaS5BdHRyaWJ1dGVzLnByb3RvdHlwZS5zZXRTdGFtaW5hID0gZnVuY3Rpb24odmFsdWUpIHtcbiAgcmV0dXJuIGpzcGIuTWVzc2FnZS5zZXRQcm90bzNJbnRGaWVsZCh0aGlzLCAzLCB2YWx1ZSk7XG59O1xuXG5cbi8qKlxuICogb3B0aW9uYWwgaW50MzIgaW50ZWxsaWdlbmNlID0gNDtcbiAqIEByZXR1cm4ge251bWJlcn1cbiAqL1xucHJvdG8ubW9kZWxzLnByb3RvLmNvZmQuYXBpLkF0dHJpYnV0ZXMucHJvdG90eXBlLmdldEludGVsbGlnZW5jZSA9IGZ1bmN0aW9uKCkge1xuICByZXR1cm4gLyoqIEB0eXBlIHtudW1iZXJ9ICovIChqc3BiLk1lc3NhZ2UuZ2V0RmllbGRXaXRoRGVmYXVsdCh0aGlzLCA0LCAwKSk7XG59O1xuXG5cbi8qKlxuICogQHBhcmFtIHtudW1iZXJ9IHZhbHVlXG4gKiBAcmV0dXJuIHshcHJvdG8ubW9kZWxzLnByb3RvLmNvZmQuYXBpLkF0dHJpYnV0ZXN9IHJldHVybnMgdGhpc1xuICovXG5wcm90by5tb2RlbHMucHJvdG8uY29mZC5hcGkuQXR0cmlidXRlcy5wcm90b3R5cGUuc2V0SW50ZWxsaWdlbmNlID0gZnVuY3Rpb24odmFsdWUpIHtcbiAgcmV0dXJuIGpzcGIuTWVzc2FnZS5zZXRQcm90bzNJbnRGaWVsZCh0aGlzLCA0LCB2YWx1ZSk7XG59O1xuXG5cbi8qKlxuICogb3B0aW9uYWwgaW50MzIgd2l0cyA9IDU7XG4gKiBAcmV0dXJuIHtudW1iZXJ9XG4gKi9cbnByb3RvLm1vZGVscy5wcm90by5jb2ZkLmFwaS5BdHRyaWJ1dGVzLnByb3RvdHlwZS5nZXRXaXRzID0gZnVuY3Rpb24oKSB7XG4gIHJldHVybiAvKiogQHR5cGUge251bWJlcn0gKi8gKGpzcGIuTWVzc2FnZS5nZXRGaWVsZFdpdGhEZWZhdWx0KHRoaXMsIDUsIDApKTtcbn07XG5cblxuLyoqXG4gKiBAcGFyYW0ge251bWJlcn0gdmFsdWVcbiAqIEByZXR1cm4geyFwcm90by5tb2RlbHMucHJvdG8uY29mZC5hcGkuQXR0cmlidXRlc30gcmV0dXJucyB0aGlzXG4gKi9cbnByb3RvLm1vZGVscy5wcm90by5jb2ZkLmFwaS5BdHRyaWJ1dGVzLnByb3RvdHlwZS5zZXRXaXRzID0gZnVuY3Rpb24odmFsdWUpIHtcbiAgcmV0dXJuIGpzcGIuTWVzc2FnZS5zZXRQcm90bzNJbnRGaWVsZCh0aGlzLCA1LCB2YWx1ZSk7XG59O1xuXG5cbi8qKlxuICogb3B0aW9uYWwgaW50MzIgcmVzb2x2ZSA9IDY7XG4gKiBAcmV0dXJuIHtudW1iZXJ9XG4gKi9cbnByb3RvLm1vZGVscy5wcm90by5jb2ZkLmFwaS5BdHRyaWJ1dGVzLnByb3RvdHlwZS5nZXRSZXNvbHZlID0gZnVuY3Rpb24oKSB7XG4gIHJldHVybiAvKiogQHR5cGUge251bWJlcn0gKi8gKGpzcGIuTWVzc2FnZS5nZXRGaWVsZFdpdGhEZWZhdWx0KHRoaXMsIDYsIDApKTtcbn07XG5cblxuLyoqXG4gKiBAcGFyYW0ge251bWJlcn0gdmFsdWVcbiAqIEByZXR1cm4geyFwcm90by5tb2RlbHMucHJvdG8uY29mZC5hcGkuQXR0cmlidXRlc30gcmV0dXJucyB0aGlzXG4gKi9cbnByb3RvLm1vZGVscy5wcm90by5jb2ZkLmFwaS5BdHRyaWJ1dGVzLnByb3RvdHlwZS5zZXRSZXNvbHZlID0gZnVuY3Rpb24odmFsdWUpIHtcbiAgcmV0dXJuIGpzcGIuTWVzc2FnZS5zZXRQcm90bzNJbnRGaWVsZCh0aGlzLCA2LCB2YWx1ZSk7XG59O1xuXG5cbi8qKlxuICogb3B0aW9uYWwgaW50MzIgcHJlc2VuY2UgPSA3O1xuICogQHJldHVybiB7bnVtYmVyfVxuICovXG5wcm90by5tb2RlbHMucHJvdG8uY29mZC5hcGkuQXR0cmlidXRlcy5wcm90b3R5cGUuZ2V0UHJlc2VuY2UgPSBmdW5jdGlvbigpIHtcbiAgcmV0dXJuIC8qKiBAdHlwZSB7bnVtYmVyfSAqLyAoanNwYi5NZXNzYWdlLmdldEZpZWxkV2l0aERlZmF1bHQodGhpcywgNywgMCkpO1xufTtcblxuXG4vKipcbiAqIEBwYXJhbSB7bnVtYmVyfSB2YWx1ZVxuICogQHJldHVybiB7IXByb3RvLm1vZGVscy5wcm90by5jb2ZkLmFwaS5BdHRyaWJ1dGVzfSByZXR1cm5zIHRoaXNcbiAqL1xucHJvdG8ubW9kZWxzLnByb3RvLmNvZmQuYXBpLkF0dHJpYnV0ZXMucHJvdG90eXBlLnNldFByZXNlbmNlID0gZnVuY3Rpb24odmFsdWUpIHtcbiAgcmV0dXJuIGpzcGIuTWVzc2FnZS5zZXRQcm90bzNJbnRGaWVsZCh0aGlzLCA3LCB2YWx1ZSk7XG59O1xuXG5cbi8qKlxuICogb3B0aW9uYWwgaW50MzIgbWFuaXB1bGF0aW9uID0gODtcbiAqIEByZXR1cm4ge251bWJlcn1cbiAqL1xucHJvdG8ubW9kZWxzLnByb3RvLmNvZmQuYXBpLkF0dHJpYnV0ZXMucHJvdG90eXBlLmdldE1hbmlwdWxhdGlvbiA9IGZ1bmN0aW9uKCkge1xuICByZXR1cm4gLyoqIEB0eXBlIHtudW1iZXJ9ICovIChqc3BiLk1lc3NhZ2UuZ2V0RmllbGRXaXRoRGVmYXVsdCh0aGlzLCA4LCAwKSk7XG59O1xuXG5cbi8qKlxuICogQHBhcmFtIHtudW1iZXJ9IHZhbHVlXG4gKiBAcmV0dXJuIHshcHJvdG8ubW9kZWxzLnByb3RvLmNvZmQuYXBpLkF0dHJpYnV0ZXN9IHJldHVybnMgdGhpc1xuICovXG5wcm90by5tb2RlbHMucHJvdG8uY29mZC5hcGkuQXR0cmlidXRlcy5wcm90b3R5cGUuc2V0TWFuaXB1bGF0aW9uID0gZnVuY3Rpb24odmFsdWUpIHtcbiAgcmV0dXJuIGpzcGIuTWVzc2FnZS5zZXRQcm90bzNJbnRGaWVsZCh0aGlzLCA4LCB2YWx1ZSk7XG59O1xuXG5cbi8qKlxuICogb3B0aW9uYWwgaW50MzIgY29tcG9zdXJlID0gOTtcbiAqIEByZXR1cm4ge251bWJlcn1cbiAqL1xucHJvdG8ubW9kZWxzLnByb3RvLmNvZmQuYXBpLkF0dHJpYnV0ZXMucHJvdG90eXBlLmdldENvbXBvc3VyZSA9IGZ1bmN0aW9uKCkge1xuICByZXR1cm4gLyoqIEB0eXBlIHtudW1iZXJ9ICovIChqc3BiLk1lc3NhZ2UuZ2V0RmllbGRXaXRoRGVmYXVsdCh0aGlzLCA5LCAwKSk7XG59O1xuXG5cbi8qKlxuICogQHBhcmFtIHtudW1iZXJ9IHZhbHVlXG4gKiBAcmV0dXJuIHshcHJvdG8ubW9kZWxzLnByb3RvLmNvZmQuYXBpLkF0dHJpYnV0ZXN9IHJldHVybnMgdGhpc1xuICovXG5wcm90by5tb2RlbHMucHJvdG8uY29mZC5hcGkuQXR0cmlidXRlcy5wcm90b3R5cGUuc2V0Q29tcG9zdXJlID0gZnVuY3Rpb24odmFsdWUpIHtcbiAgcmV0dXJuIGpzcGIuTWVzc2FnZS5zZXRQcm90bzNJbnRGaWVsZCh0aGlzLCA5LCB2YWx1ZSk7XG59O1xuXG5cblxuXG5cbmlmIChqc3BiLk1lc3NhZ2UuR0VORVJBVEVfVE9fT0JKRUNUKSB7XG4vKipcbiAqIENyZWF0ZXMgYW4gb2JqZWN0IHJlcHJlc2VudGF0aW9uIG9mIHRoaXMgcHJvdG8uXG4gKiBGaWVsZCBuYW1lcyB0aGF0IGFyZSByZXNlcnZlZCBpbiBKYXZhU2NyaXB0IGFuZCB3aWxsIGJlIHJlbmFtZWQgdG8gcGJfbmFtZS5cbiAqIE9wdGlvbmFsIGZpZWxkcyB0aGF0IGFyZSBub3Qgc2V0IHdpbGwgYmUgc2V0IHRvIHVuZGVmaW5lZC5cbiAqIFRvIGFjY2VzcyBhIHJlc2VydmVkIGZpZWxkIHVzZSwgZm9vLnBiXzxuYW1lPiwgZWcsIGZvby5wYl9kZWZhdWx0LlxuICogRm9yIHRoZSBsaXN0IG9mIHJlc2VydmVkIG5hbWVzIHBsZWFzZSBzZWU6XG4gKiAgICAgbmV0L3Byb3RvMi9jb21waWxlci9qcy9pbnRlcm5hbC9nZW5lcmF0b3IuY2Mja0tleXdvcmQuXG4gKiBAcGFyYW0ge2Jvb2xlYW49fSBvcHRfaW5jbHVkZUluc3RhbmNlIERlcHJlY2F0ZWQuIHdoZXRoZXIgdG8gaW5jbHVkZSB0aGVcbiAqICAgICBKU1BCIGluc3RhbmNlIGZvciB0cmFuc2l0aW9uYWwgc295IHByb3RvIHN1cHBvcnQ6XG4gKiAgICAgaHR0cDovL2dvdG8vc295LXBhcmFtLW1pZ3JhdGlvblxuICogQHJldHVybiB7IU9iamVjdH1cbiAqL1xucHJvdG8ubW9kZWxzLnByb3RvLmNvZmQuYXBpLlVwZGF0ZUF0dHJpYnV0ZVJlcXVlc3QucHJvdG90eXBlLnRvT2JqZWN0ID0gZnVuY3Rpb24ob3B0X2luY2x1ZGVJbnN0YW5jZSkge1xuICByZXR1cm4gcHJvdG8ubW9kZWxzLnByb3RvLmNvZmQuYXBpLlVwZGF0ZUF0dHJpYnV0ZVJlcXVlc3QudG9PYmplY3Qob3B0X2luY2x1ZGVJbnN0YW5jZSwgdGhpcyk7XG59O1xuXG5cbi8qKlxuICogU3RhdGljIHZlcnNpb24gb2YgdGhlIHtAc2VlIHRvT2JqZWN0fSBtZXRob2QuXG4gKiBAcGFyYW0ge2Jvb2xlYW58dW5kZWZpbmVkfSBpbmNsdWRlSW5zdGFuY2UgRGVwcmVjYXRlZC4gV2hldGhlciB0byBpbmNsdWRlXG4gKiAgICAgdGhlIEpTUEIgaW5zdGFuY2UgZm9yIHRyYW5zaXRpb25hbCBzb3kgcHJvdG8gc3VwcG9ydDpcbiAqICAgICBodHRwOi8vZ290by9zb3ktcGFyYW0tbWlncmF0aW9uXG4gKiBAcGFyYW0geyFwcm90by5tb2RlbHMucHJvdG8uY29mZC5hcGkuVXBkYXRlQXR0cmlidXRlUmVxdWVzdH0gbXNnIFRoZSBtc2cgaW5zdGFuY2UgdG8gdHJhbnNmb3JtLlxuICogQHJldHVybiB7IU9iamVjdH1cbiAqIEBzdXBwcmVzcyB7dW51c2VkTG9jYWxWYXJpYWJsZXN9IGYgaXMgb25seSB1c2VkIGZvciBuZXN0ZWQgbWVzc2FnZXNcbiAqL1xucHJvdG8ubW9kZWxzLnByb3RvLmNvZmQuYXBpLlVwZGF0ZUF0dHJpYnV0ZVJlcXVlc3QudG9PYmplY3QgPSBmdW5jdGlvbihpbmNsdWRlSW5zdGFuY2UsIG1zZykge1xuICB2YXIgZiwgb2JqID0ge1xuICAgIGNoYXJhY3RlclVzZXJuYW1lOiBqc3BiLk1lc3NhZ2UuZ2V0RmllbGRXaXRoRGVmYXVsdChtc2csIDEsIFwiXCIpLFxuICAgIGNoYXJhY3RlcklkOiBqc3BiLk1lc3NhZ2UuZ2V0RmllbGRXaXRoRGVmYXVsdChtc2csIDIsIDApLFxuICAgIGF0dHJpYnV0ZU5hbWU6IGpzcGIuTWVzc2FnZS5nZXRGaWVsZFdpdGhEZWZhdWx0KG1zZywgMywgXCJcIiksXG4gICAgYXR0cmlidXRlVmFsdWU6IGpzcGIuTWVzc2FnZS5nZXRGaWVsZFdpdGhEZWZhdWx0KG1zZywgNCwgMClcbiAgfTtcblxuICBpZiAoaW5jbHVkZUluc3RhbmNlKSB7XG4gICAgb2JqLiRqc3BiTWVzc2FnZUluc3RhbmNlID0gbXNnO1xuICB9XG4gIHJldHVybiBvYmo7XG59O1xufVxuXG5cbi8qKlxuICogRGVzZXJpYWxpemVzIGJpbmFyeSBkYXRhIChpbiBwcm90b2J1ZiB3aXJlIGZvcm1hdCkuXG4gKiBAcGFyYW0ge2pzcGIuQnl0ZVNvdXJjZX0gYnl0ZXMgVGhlIGJ5dGVzIHRvIGRlc2VyaWFsaXplLlxuICogQHJldHVybiB7IXByb3RvLm1vZGVscy5wcm90by5jb2ZkLmFwaS5VcGRhdGVBdHRyaWJ1dGVSZXF1ZXN0fVxuICovXG5wcm90by5tb2RlbHMucHJvdG8uY29mZC5hcGkuVXBkYXRlQXR0cmlidXRlUmVxdWVzdC5kZXNlcmlhbGl6ZUJpbmFyeSA9IGZ1bmN0aW9uKGJ5dGVzKSB7XG4gIHZhciByZWFkZXIgPSBuZXcganNwYi5CaW5hcnlSZWFkZXIoYnl0ZXMpO1xuICB2YXIgbXNnID0gbmV3IHByb3RvLm1vZGVscy5wcm90by5jb2ZkLmFwaS5VcGRhdGVBdHRyaWJ1dGVSZXF1ZXN0O1xuICByZXR1cm4gcHJvdG8ubW9kZWxzLnByb3RvLmNvZmQuYXBpLlVwZGF0ZUF0dHJpYnV0ZVJlcXVlc3QuZGVzZXJpYWxpemVCaW5hcnlGcm9tUmVhZGVyKG1zZywgcmVhZGVyKTtcbn07XG5cblxuLyoqXG4gKiBEZXNlcmlhbGl6ZXMgYmluYXJ5IGRhdGEgKGluIHByb3RvYnVmIHdpcmUgZm9ybWF0KSBmcm9tIHRoZVxuICogZ2l2ZW4gcmVhZGVyIGludG8gdGhlIGdpdmVuIG1lc3NhZ2Ugb2JqZWN0LlxuICogQHBhcmFtIHshcHJvdG8ubW9kZWxzLnByb3RvLmNvZmQuYXBpLlVwZGF0ZUF0dHJpYnV0ZVJlcXVlc3R9IG1zZyBUaGUgbWVzc2FnZSBvYmplY3QgdG8gZGVzZXJpYWxpemUgaW50by5cbiAqIEBwYXJhbSB7IWpzcGIuQmluYXJ5UmVhZGVyfSByZWFkZXIgVGhlIEJpbmFyeVJlYWRlciB0byB1c2UuXG4gKiBAcmV0dXJuIHshcHJvdG8ubW9kZWxzLnByb3RvLmNvZmQuYXBpLlVwZGF0ZUF0dHJpYnV0ZVJlcXVlc3R9XG4gKi9cbnByb3RvLm1vZGVscy5wcm90by5jb2ZkLmFwaS5VcGRhdGVBdHRyaWJ1dGVSZXF1ZXN0LmRlc2VyaWFsaXplQmluYXJ5RnJvbVJlYWRlciA9IGZ1bmN0aW9uKG1zZywgcmVhZGVyKSB7XG4gIHdoaWxlIChyZWFkZXIubmV4dEZpZWxkKCkpIHtcbiAgICBpZiAocmVhZGVyLmlzRW5kR3JvdXAoKSkge1xuICAgICAgYnJlYWs7XG4gICAgfVxuICAgIHZhciBmaWVsZCA9IHJlYWRlci5nZXRGaWVsZE51bWJlcigpO1xuICAgIHN3aXRjaCAoZmllbGQpIHtcbiAgICBjYXNlIDE6XG4gICAgICB2YXIgdmFsdWUgPSAvKiogQHR5cGUge3N0cmluZ30gKi8gKHJlYWRlci5yZWFkU3RyaW5nKCkpO1xuICAgICAgbXNnLnNldENoYXJhY3RlclVzZXJuYW1lKHZhbHVlKTtcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgMjpcbiAgICAgIHZhciB2YWx1ZSA9IC8qKiBAdHlwZSB7bnVtYmVyfSAqLyAocmVhZGVyLnJlYWRJbnQzMigpKTtcbiAgICAgIG1zZy5zZXRDaGFyYWN0ZXJJZCh2YWx1ZSk7XG4gICAgICBicmVhaztcbiAgICBjYXNlIDM6XG4gICAgICB2YXIgdmFsdWUgPSAvKiogQHR5cGUge3N0cmluZ30gKi8gKHJlYWRlci5yZWFkU3RyaW5nKCkpO1xuICAgICAgbXNnLnNldEF0dHJpYnV0ZU5hbWUodmFsdWUpO1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSA0OlxuICAgICAgdmFyIHZhbHVlID0gLyoqIEB0eXBlIHtudW1iZXJ9ICovIChyZWFkZXIucmVhZEludDMyKCkpO1xuICAgICAgbXNnLnNldEF0dHJpYnV0ZVZhbHVlKHZhbHVlKTtcbiAgICAgIGJyZWFrO1xuICAgIGRlZmF1bHQ6XG4gICAgICByZWFkZXIuc2tpcEZpZWxkKCk7XG4gICAgICBicmVhaztcbiAgICB9XG4gIH1cbiAgcmV0dXJuIG1zZztcbn07XG5cblxuLyoqXG4gKiBTZXJpYWxpemVzIHRoZSBtZXNzYWdlIHRvIGJpbmFyeSBkYXRhIChpbiBwcm90b2J1ZiB3aXJlIGZvcm1hdCkuXG4gKiBAcmV0dXJuIHshVWludDhBcnJheX1cbiAqL1xucHJvdG8ubW9kZWxzLnByb3RvLmNvZmQuYXBpLlVwZGF0ZUF0dHJpYnV0ZVJlcXVlc3QucHJvdG90eXBlLnNlcmlhbGl6ZUJpbmFyeSA9IGZ1bmN0aW9uKCkge1xuICB2YXIgd3JpdGVyID0gbmV3IGpzcGIuQmluYXJ5V3JpdGVyKCk7XG4gIHByb3RvLm1vZGVscy5wcm90by5jb2ZkLmFwaS5VcGRhdGVBdHRyaWJ1dGVSZXF1ZXN0LnNlcmlhbGl6ZUJpbmFyeVRvV3JpdGVyKHRoaXMsIHdyaXRlcik7XG4gIHJldHVybiB3cml0ZXIuZ2V0UmVzdWx0QnVmZmVyKCk7XG59O1xuXG5cbi8qKlxuICogU2VyaWFsaXplcyB0aGUgZ2l2ZW4gbWVzc2FnZSB0byBiaW5hcnkgZGF0YSAoaW4gcHJvdG9idWYgd2lyZVxuICogZm9ybWF0KSwgd3JpdGluZyB0byB0aGUgZ2l2ZW4gQmluYXJ5V3JpdGVyLlxuICogQHBhcmFtIHshcHJvdG8ubW9kZWxzLnByb3RvLmNvZmQuYXBpLlVwZGF0ZUF0dHJpYnV0ZVJlcXVlc3R9IG1lc3NhZ2VcbiAqIEBwYXJhbSB7IWpzcGIuQmluYXJ5V3JpdGVyfSB3cml0ZXJcbiAqIEBzdXBwcmVzcyB7dW51c2VkTG9jYWxWYXJpYWJsZXN9IGYgaXMgb25seSB1c2VkIGZvciBuZXN0ZWQgbWVzc2FnZXNcbiAqL1xucHJvdG8ubW9kZWxzLnByb3RvLmNvZmQuYXBpLlVwZGF0ZUF0dHJpYnV0ZVJlcXVlc3Quc2VyaWFsaXplQmluYXJ5VG9Xcml0ZXIgPSBmdW5jdGlvbihtZXNzYWdlLCB3cml0ZXIpIHtcbiAgdmFyIGYgPSB1bmRlZmluZWQ7XG4gIGYgPSBtZXNzYWdlLmdldENoYXJhY3RlclVzZXJuYW1lKCk7XG4gIGlmIChmLmxlbmd0aCA+IDApIHtcbiAgICB3cml0ZXIud3JpdGVTdHJpbmcoXG4gICAgICAxLFxuICAgICAgZlxuICAgICk7XG4gIH1cbiAgZiA9IG1lc3NhZ2UuZ2V0Q2hhcmFjdGVySWQoKTtcbiAgaWYgKGYgIT09IDApIHtcbiAgICB3cml0ZXIud3JpdGVJbnQzMihcbiAgICAgIDIsXG4gICAgICBmXG4gICAgKTtcbiAgfVxuICBmID0gbWVzc2FnZS5nZXRBdHRyaWJ1dGVOYW1lKCk7XG4gIGlmIChmLmxlbmd0aCA+IDApIHtcbiAgICB3cml0ZXIud3JpdGVTdHJpbmcoXG4gICAgICAzLFxuICAgICAgZlxuICAgICk7XG4gIH1cbiAgZiA9IG1lc3NhZ2UuZ2V0QXR0cmlidXRlVmFsdWUoKTtcbiAgaWYgKGYgIT09IDApIHtcbiAgICB3cml0ZXIud3JpdGVJbnQzMihcbiAgICAgIDQsXG4gICAgICBmXG4gICAgKTtcbiAgfVxufTtcblxuXG4vKipcbiAqIG9wdGlvbmFsIHN0cmluZyBjaGFyYWN0ZXJfdXNlcm5hbWUgPSAxO1xuICogQHJldHVybiB7c3RyaW5nfVxuICovXG5wcm90by5tb2RlbHMucHJvdG8uY29mZC5hcGkuVXBkYXRlQXR0cmlidXRlUmVxdWVzdC5wcm90b3R5cGUuZ2V0Q2hhcmFjdGVyVXNlcm5hbWUgPSBmdW5jdGlvbigpIHtcbiAgcmV0dXJuIC8qKiBAdHlwZSB7c3RyaW5nfSAqLyAoanNwYi5NZXNzYWdlLmdldEZpZWxkV2l0aERlZmF1bHQodGhpcywgMSwgXCJcIikpO1xufTtcblxuXG4vKipcbiAqIEBwYXJhbSB7c3RyaW5nfSB2YWx1ZVxuICogQHJldHVybiB7IXByb3RvLm1vZGVscy5wcm90by5jb2ZkLmFwaS5VcGRhdGVBdHRyaWJ1dGVSZXF1ZXN0fSByZXR1cm5zIHRoaXNcbiAqL1xucHJvdG8ubW9kZWxzLnByb3RvLmNvZmQuYXBpLlVwZGF0ZUF0dHJpYnV0ZVJlcXVlc3QucHJvdG90eXBlLnNldENoYXJhY3RlclVzZXJuYW1lID0gZnVuY3Rpb24odmFsdWUpIHtcbiAgcmV0dXJuIGpzcGIuTWVzc2FnZS5zZXRQcm90bzNTdHJpbmdGaWVsZCh0aGlzLCAxLCB2YWx1ZSk7XG59O1xuXG5cbi8qKlxuICogb3B0aW9uYWwgaW50MzIgY2hhcmFjdGVyX2lkID0gMjtcbiAqIEByZXR1cm4ge251bWJlcn1cbiAqL1xucHJvdG8ubW9kZWxzLnByb3RvLmNvZmQuYXBpLlVwZGF0ZUF0dHJpYnV0ZVJlcXVlc3QucHJvdG90eXBlLmdldENoYXJhY3RlcklkID0gZnVuY3Rpb24oKSB7XG4gIHJldHVybiAvKiogQHR5cGUge251bWJlcn0gKi8gKGpzcGIuTWVzc2FnZS5nZXRGaWVsZFdpdGhEZWZhdWx0KHRoaXMsIDIsIDApKTtcbn07XG5cblxuLyoqXG4gKiBAcGFyYW0ge251bWJlcn0gdmFsdWVcbiAqIEByZXR1cm4geyFwcm90by5tb2RlbHMucHJvdG8uY29mZC5hcGkuVXBkYXRlQXR0cmlidXRlUmVxdWVzdH0gcmV0dXJucyB0aGlzXG4gKi9cbnByb3RvLm1vZGVscy5wcm90by5jb2ZkLmFwaS5VcGRhdGVBdHRyaWJ1dGVSZXF1ZXN0LnByb3RvdHlwZS5zZXRDaGFyYWN0ZXJJZCA9IGZ1bmN0aW9uKHZhbHVlKSB7XG4gIHJldHVybiBqc3BiLk1lc3NhZ2Uuc2V0UHJvdG8zSW50RmllbGQodGhpcywgMiwgdmFsdWUpO1xufTtcblxuXG4vKipcbiAqIG9wdGlvbmFsIHN0cmluZyBhdHRyaWJ1dGVfbmFtZSA9IDM7XG4gKiBAcmV0dXJuIHtzdHJpbmd9XG4gKi9cbnByb3RvLm1vZGVscy5wcm90by5jb2ZkLmFwaS5VcGRhdGVBdHRyaWJ1dGVSZXF1ZXN0LnByb3RvdHlwZS5nZXRBdHRyaWJ1dGVOYW1lID0gZnVuY3Rpb24oKSB7XG4gIHJldHVybiAvKiogQHR5cGUge3N0cmluZ30gKi8gKGpzcGIuTWVzc2FnZS5nZXRGaWVsZFdpdGhEZWZhdWx0KHRoaXMsIDMsIFwiXCIpKTtcbn07XG5cblxuLyoqXG4gKiBAcGFyYW0ge3N0cmluZ30gdmFsdWVcbiAqIEByZXR1cm4geyFwcm90by5tb2RlbHMucHJvdG8uY29mZC5hcGkuVXBkYXRlQXR0cmlidXRlUmVxdWVzdH0gcmV0dXJucyB0aGlzXG4gKi9cbnByb3RvLm1vZGVscy5wcm90by5jb2ZkLmFwaS5VcGRhdGVBdHRyaWJ1dGVSZXF1ZXN0LnByb3RvdHlwZS5zZXRBdHRyaWJ1dGVOYW1lID0gZnVuY3Rpb24odmFsdWUpIHtcbiAgcmV0dXJuIGpzcGIuTWVzc2FnZS5zZXRQcm90bzNTdHJpbmdGaWVsZCh0aGlzLCAzLCB2YWx1ZSk7XG59O1xuXG5cbi8qKlxuICogb3B0aW9uYWwgaW50MzIgYXR0cmlidXRlX3ZhbHVlID0gNDtcbiAqIEByZXR1cm4ge251bWJlcn1cbiAqL1xucHJvdG8ubW9kZWxzLnByb3RvLmNvZmQuYXBpLlVwZGF0ZUF0dHJpYnV0ZVJlcXVlc3QucHJvdG90eXBlLmdldEF0dHJpYnV0ZVZhbHVlID0gZnVuY3Rpb24oKSB7XG4gIHJldHVybiAvKiogQHR5cGUge251bWJlcn0gKi8gKGpzcGIuTWVzc2FnZS5nZXRGaWVsZFdpdGhEZWZhdWx0KHRoaXMsIDQsIDApKTtcbn07XG5cblxuLyoqXG4gKiBAcGFyYW0ge251bWJlcn0gdmFsdWVcbiAqIEByZXR1cm4geyFwcm90by5tb2RlbHMucHJvdG8uY29mZC5hcGkuVXBkYXRlQXR0cmlidXRlUmVxdWVzdH0gcmV0dXJucyB0aGlzXG4gKi9cbnByb3RvLm1vZGVscy5wcm90by5jb2ZkLmFwaS5VcGRhdGVBdHRyaWJ1dGVSZXF1ZXN0LnByb3RvdHlwZS5zZXRBdHRyaWJ1dGVWYWx1ZSA9IGZ1bmN0aW9uKHZhbHVlKSB7XG4gIHJldHVybiBqc3BiLk1lc3NhZ2Uuc2V0UHJvdG8zSW50RmllbGQodGhpcywgNCwgdmFsdWUpO1xufTtcblxuXG5cbi8qKlxuICogTGlzdCBvZiByZXBlYXRlZCBmaWVsZHMgd2l0aGluIHRoaXMgbWVzc2FnZSB0eXBlLlxuICogQHByaXZhdGUgeyFBcnJheTxudW1iZXI+fVxuICogQGNvbnN0XG4gKi9cbnByb3RvLm1vZGVscy5wcm90by5jb2ZkLmFwaS5Ta2lsbHMucmVwZWF0ZWRGaWVsZHNfID0gWzEsMiwzXTtcblxuXG5cbmlmIChqc3BiLk1lc3NhZ2UuR0VORVJBVEVfVE9fT0JKRUNUKSB7XG4vKipcbiAqIENyZWF0ZXMgYW4gb2JqZWN0IHJlcHJlc2VudGF0aW9uIG9mIHRoaXMgcHJvdG8uXG4gKiBGaWVsZCBuYW1lcyB0aGF0IGFyZSByZXNlcnZlZCBpbiBKYXZhU2NyaXB0IGFuZCB3aWxsIGJlIHJlbmFtZWQgdG8gcGJfbmFtZS5cbiAqIE9wdGlvbmFsIGZpZWxkcyB0aGF0IGFyZSBub3Qgc2V0IHdpbGwgYmUgc2V0IHRvIHVuZGVmaW5lZC5cbiAqIFRvIGFjY2VzcyBhIHJlc2VydmVkIGZpZWxkIHVzZSwgZm9vLnBiXzxuYW1lPiwgZWcsIGZvby5wYl9kZWZhdWx0LlxuICogRm9yIHRoZSBsaXN0IG9mIHJlc2VydmVkIG5hbWVzIHBsZWFzZSBzZWU6XG4gKiAgICAgbmV0L3Byb3RvMi9jb21waWxlci9qcy9pbnRlcm5hbC9nZW5lcmF0b3IuY2Mja0tleXdvcmQuXG4gKiBAcGFyYW0ge2Jvb2xlYW49fSBvcHRfaW5jbHVkZUluc3RhbmNlIERlcHJlY2F0ZWQuIHdoZXRoZXIgdG8gaW5jbHVkZSB0aGVcbiAqICAgICBKU1BCIGluc3RhbmNlIGZvciB0cmFuc2l0aW9uYWwgc295IHByb3RvIHN1cHBvcnQ6XG4gKiAgICAgaHR0cDovL2dvdG8vc295LXBhcmFtLW1pZ3JhdGlvblxuICogQHJldHVybiB7IU9iamVjdH1cbiAqL1xucHJvdG8ubW9kZWxzLnByb3RvLmNvZmQuYXBpLlNraWxscy5wcm90b3R5cGUudG9PYmplY3QgPSBmdW5jdGlvbihvcHRfaW5jbHVkZUluc3RhbmNlKSB7XG4gIHJldHVybiBwcm90by5tb2RlbHMucHJvdG8uY29mZC5hcGkuU2tpbGxzLnRvT2JqZWN0KG9wdF9pbmNsdWRlSW5zdGFuY2UsIHRoaXMpO1xufTtcblxuXG4vKipcbiAqIFN0YXRpYyB2ZXJzaW9uIG9mIHRoZSB7QHNlZSB0b09iamVjdH0gbWV0aG9kLlxuICogQHBhcmFtIHtib29sZWFufHVuZGVmaW5lZH0gaW5jbHVkZUluc3RhbmNlIERlcHJlY2F0ZWQuIFdoZXRoZXIgdG8gaW5jbHVkZVxuICogICAgIHRoZSBKU1BCIGluc3RhbmNlIGZvciB0cmFuc2l0aW9uYWwgc295IHByb3RvIHN1cHBvcnQ6XG4gKiAgICAgaHR0cDovL2dvdG8vc295LXBhcmFtLW1pZ3JhdGlvblxuICogQHBhcmFtIHshcHJvdG8ubW9kZWxzLnByb3RvLmNvZmQuYXBpLlNraWxsc30gbXNnIFRoZSBtc2cgaW5zdGFuY2UgdG8gdHJhbnNmb3JtLlxuICogQHJldHVybiB7IU9iamVjdH1cbiAqIEBzdXBwcmVzcyB7dW51c2VkTG9jYWxWYXJpYWJsZXN9IGYgaXMgb25seSB1c2VkIGZvciBuZXN0ZWQgbWVzc2FnZXNcbiAqL1xucHJvdG8ubW9kZWxzLnByb3RvLmNvZmQuYXBpLlNraWxscy50b09iamVjdCA9IGZ1bmN0aW9uKGluY2x1ZGVJbnN0YW5jZSwgbXNnKSB7XG4gIHZhciBmLCBvYmogPSB7XG4gICAgcGh5c2ljYWxTa2lsbHNMaXN0OiBqc3BiLk1lc3NhZ2UudG9PYmplY3RMaXN0KG1zZy5nZXRQaHlzaWNhbFNraWxsc0xpc3QoKSxcbiAgICBjb2ZkX3BiLkNvZmRTaGVldC5Ta2lsbC50b09iamVjdCwgaW5jbHVkZUluc3RhbmNlKSxcbiAgICBtZW50YWxTa2lsbHNMaXN0OiBqc3BiLk1lc3NhZ2UudG9PYmplY3RMaXN0KG1zZy5nZXRNZW50YWxTa2lsbHNMaXN0KCksXG4gICAgY29mZF9wYi5Db2ZkU2hlZXQuU2tpbGwudG9PYmplY3QsIGluY2x1ZGVJbnN0YW5jZSksXG4gICAgc29jaWFsU2tpbGxzTGlzdDoganNwYi5NZXNzYWdlLnRvT2JqZWN0TGlzdChtc2cuZ2V0U29jaWFsU2tpbGxzTGlzdCgpLFxuICAgIGNvZmRfcGIuQ29mZFNoZWV0LlNraWxsLnRvT2JqZWN0LCBpbmNsdWRlSW5zdGFuY2UpXG4gIH07XG5cbiAgaWYgKGluY2x1ZGVJbnN0YW5jZSkge1xuICAgIG9iai4kanNwYk1lc3NhZ2VJbnN0YW5jZSA9IG1zZztcbiAgfVxuICByZXR1cm4gb2JqO1xufTtcbn1cblxuXG4vKipcbiAqIERlc2VyaWFsaXplcyBiaW5hcnkgZGF0YSAoaW4gcHJvdG9idWYgd2lyZSBmb3JtYXQpLlxuICogQHBhcmFtIHtqc3BiLkJ5dGVTb3VyY2V9IGJ5dGVzIFRoZSBieXRlcyB0byBkZXNlcmlhbGl6ZS5cbiAqIEByZXR1cm4geyFwcm90by5tb2RlbHMucHJvdG8uY29mZC5hcGkuU2tpbGxzfVxuICovXG5wcm90by5tb2RlbHMucHJvdG8uY29mZC5hcGkuU2tpbGxzLmRlc2VyaWFsaXplQmluYXJ5ID0gZnVuY3Rpb24oYnl0ZXMpIHtcbiAgdmFyIHJlYWRlciA9IG5ldyBqc3BiLkJpbmFyeVJlYWRlcihieXRlcyk7XG4gIHZhciBtc2cgPSBuZXcgcHJvdG8ubW9kZWxzLnByb3RvLmNvZmQuYXBpLlNraWxscztcbiAgcmV0dXJuIHByb3RvLm1vZGVscy5wcm90by5jb2ZkLmFwaS5Ta2lsbHMuZGVzZXJpYWxpemVCaW5hcnlGcm9tUmVhZGVyKG1zZywgcmVhZGVyKTtcbn07XG5cblxuLyoqXG4gKiBEZXNlcmlhbGl6ZXMgYmluYXJ5IGRhdGEgKGluIHByb3RvYnVmIHdpcmUgZm9ybWF0KSBmcm9tIHRoZVxuICogZ2l2ZW4gcmVhZGVyIGludG8gdGhlIGdpdmVuIG1lc3NhZ2Ugb2JqZWN0LlxuICogQHBhcmFtIHshcHJvdG8ubW9kZWxzLnByb3RvLmNvZmQuYXBpLlNraWxsc30gbXNnIFRoZSBtZXNzYWdlIG9iamVjdCB0byBkZXNlcmlhbGl6ZSBpbnRvLlxuICogQHBhcmFtIHshanNwYi5CaW5hcnlSZWFkZXJ9IHJlYWRlciBUaGUgQmluYXJ5UmVhZGVyIHRvIHVzZS5cbiAqIEByZXR1cm4geyFwcm90by5tb2RlbHMucHJvdG8uY29mZC5hcGkuU2tpbGxzfVxuICovXG5wcm90by5tb2RlbHMucHJvdG8uY29mZC5hcGkuU2tpbGxzLmRlc2VyaWFsaXplQmluYXJ5RnJvbVJlYWRlciA9IGZ1bmN0aW9uKG1zZywgcmVhZGVyKSB7XG4gIHdoaWxlIChyZWFkZXIubmV4dEZpZWxkKCkpIHtcbiAgICBpZiAocmVhZGVyLmlzRW5kR3JvdXAoKSkge1xuICAgICAgYnJlYWs7XG4gICAgfVxuICAgIHZhciBmaWVsZCA9IHJlYWRlci5nZXRGaWVsZE51bWJlcigpO1xuICAgIHN3aXRjaCAoZmllbGQpIHtcbiAgICBjYXNlIDE6XG4gICAgICB2YXIgdmFsdWUgPSBuZXcgY29mZF9wYi5Db2ZkU2hlZXQuU2tpbGw7XG4gICAgICByZWFkZXIucmVhZE1lc3NhZ2UodmFsdWUsY29mZF9wYi5Db2ZkU2hlZXQuU2tpbGwuZGVzZXJpYWxpemVCaW5hcnlGcm9tUmVhZGVyKTtcbiAgICAgIG1zZy5hZGRQaHlzaWNhbFNraWxscyh2YWx1ZSk7XG4gICAgICBicmVhaztcbiAgICBjYXNlIDI6XG4gICAgICB2YXIgdmFsdWUgPSBuZXcgY29mZF9wYi5Db2ZkU2hlZXQuU2tpbGw7XG4gICAgICByZWFkZXIucmVhZE1lc3NhZ2UodmFsdWUsY29mZF9wYi5Db2ZkU2hlZXQuU2tpbGwuZGVzZXJpYWxpemVCaW5hcnlGcm9tUmVhZGVyKTtcbiAgICAgIG1zZy5hZGRNZW50YWxTa2lsbHModmFsdWUpO1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSAzOlxuICAgICAgdmFyIHZhbHVlID0gbmV3IGNvZmRfcGIuQ29mZFNoZWV0LlNraWxsO1xuICAgICAgcmVhZGVyLnJlYWRNZXNzYWdlKHZhbHVlLGNvZmRfcGIuQ29mZFNoZWV0LlNraWxsLmRlc2VyaWFsaXplQmluYXJ5RnJvbVJlYWRlcik7XG4gICAgICBtc2cuYWRkU29jaWFsU2tpbGxzKHZhbHVlKTtcbiAgICAgIGJyZWFrO1xuICAgIGRlZmF1bHQ6XG4gICAgICByZWFkZXIuc2tpcEZpZWxkKCk7XG4gICAgICBicmVhaztcbiAgICB9XG4gIH1cbiAgcmV0dXJuIG1zZztcbn07XG5cblxuLyoqXG4gKiBTZXJpYWxpemVzIHRoZSBtZXNzYWdlIHRvIGJpbmFyeSBkYXRhIChpbiBwcm90b2J1ZiB3aXJlIGZvcm1hdCkuXG4gKiBAcmV0dXJuIHshVWludDhBcnJheX1cbiAqL1xucHJvdG8ubW9kZWxzLnByb3RvLmNvZmQuYXBpLlNraWxscy5wcm90b3R5cGUuc2VyaWFsaXplQmluYXJ5ID0gZnVuY3Rpb24oKSB7XG4gIHZhciB3cml0ZXIgPSBuZXcganNwYi5CaW5hcnlXcml0ZXIoKTtcbiAgcHJvdG8ubW9kZWxzLnByb3RvLmNvZmQuYXBpLlNraWxscy5zZXJpYWxpemVCaW5hcnlUb1dyaXRlcih0aGlzLCB3cml0ZXIpO1xuICByZXR1cm4gd3JpdGVyLmdldFJlc3VsdEJ1ZmZlcigpO1xufTtcblxuXG4vKipcbiAqIFNlcmlhbGl6ZXMgdGhlIGdpdmVuIG1lc3NhZ2UgdG8gYmluYXJ5IGRhdGEgKGluIHByb3RvYnVmIHdpcmVcbiAqIGZvcm1hdCksIHdyaXRpbmcgdG8gdGhlIGdpdmVuIEJpbmFyeVdyaXRlci5cbiAqIEBwYXJhbSB7IXByb3RvLm1vZGVscy5wcm90by5jb2ZkLmFwaS5Ta2lsbHN9IG1lc3NhZ2VcbiAqIEBwYXJhbSB7IWpzcGIuQmluYXJ5V3JpdGVyfSB3cml0ZXJcbiAqIEBzdXBwcmVzcyB7dW51c2VkTG9jYWxWYXJpYWJsZXN9IGYgaXMgb25seSB1c2VkIGZvciBuZXN0ZWQgbWVzc2FnZXNcbiAqL1xucHJvdG8ubW9kZWxzLnByb3RvLmNvZmQuYXBpLlNraWxscy5zZXJpYWxpemVCaW5hcnlUb1dyaXRlciA9IGZ1bmN0aW9uKG1lc3NhZ2UsIHdyaXRlcikge1xuICB2YXIgZiA9IHVuZGVmaW5lZDtcbiAgZiA9IG1lc3NhZ2UuZ2V0UGh5c2ljYWxTa2lsbHNMaXN0KCk7XG4gIGlmIChmLmxlbmd0aCA+IDApIHtcbiAgICB3cml0ZXIud3JpdGVSZXBlYXRlZE1lc3NhZ2UoXG4gICAgICAxLFxuICAgICAgZixcbiAgICAgIGNvZmRfcGIuQ29mZFNoZWV0LlNraWxsLnNlcmlhbGl6ZUJpbmFyeVRvV3JpdGVyXG4gICAgKTtcbiAgfVxuICBmID0gbWVzc2FnZS5nZXRNZW50YWxTa2lsbHNMaXN0KCk7XG4gIGlmIChmLmxlbmd0aCA+IDApIHtcbiAgICB3cml0ZXIud3JpdGVSZXBlYXRlZE1lc3NhZ2UoXG4gICAgICAyLFxuICAgICAgZixcbiAgICAgIGNvZmRfcGIuQ29mZFNoZWV0LlNraWxsLnNlcmlhbGl6ZUJpbmFyeVRvV3JpdGVyXG4gICAgKTtcbiAgfVxuICBmID0gbWVzc2FnZS5nZXRTb2NpYWxTa2lsbHNMaXN0KCk7XG4gIGlmIChmLmxlbmd0aCA+IDApIHtcbiAgICB3cml0ZXIud3JpdGVSZXBlYXRlZE1lc3NhZ2UoXG4gICAgICAzLFxuICAgICAgZixcbiAgICAgIGNvZmRfcGIuQ29mZFNoZWV0LlNraWxsLnNlcmlhbGl6ZUJpbmFyeVRvV3JpdGVyXG4gICAgKTtcbiAgfVxufTtcblxuXG4vKipcbiAqIHJlcGVhdGVkIG1vZGVscy5wcm90by5jb2ZkLkNvZmRTaGVldC5Ta2lsbCBwaHlzaWNhbF9za2lsbHMgPSAxO1xuICogQHJldHVybiB7IUFycmF5PCFwcm90by5tb2RlbHMucHJvdG8uY29mZC5Db2ZkU2hlZXQuU2tpbGw+fVxuICovXG5wcm90by5tb2RlbHMucHJvdG8uY29mZC5hcGkuU2tpbGxzLnByb3RvdHlwZS5nZXRQaHlzaWNhbFNraWxsc0xpc3QgPSBmdW5jdGlvbigpIHtcbiAgcmV0dXJuIC8qKiBAdHlwZXshQXJyYXk8IXByb3RvLm1vZGVscy5wcm90by5jb2ZkLkNvZmRTaGVldC5Ta2lsbD59ICovIChcbiAgICBqc3BiLk1lc3NhZ2UuZ2V0UmVwZWF0ZWRXcmFwcGVyRmllbGQodGhpcywgY29mZF9wYi5Db2ZkU2hlZXQuU2tpbGwsIDEpKTtcbn07XG5cblxuLyoqXG4gKiBAcGFyYW0geyFBcnJheTwhcHJvdG8ubW9kZWxzLnByb3RvLmNvZmQuQ29mZFNoZWV0LlNraWxsPn0gdmFsdWVcbiAqIEByZXR1cm4geyFwcm90by5tb2RlbHMucHJvdG8uY29mZC5hcGkuU2tpbGxzfSByZXR1cm5zIHRoaXNcbiovXG5wcm90by5tb2RlbHMucHJvdG8uY29mZC5hcGkuU2tpbGxzLnByb3RvdHlwZS5zZXRQaHlzaWNhbFNraWxsc0xpc3QgPSBmdW5jdGlvbih2YWx1ZSkge1xuICByZXR1cm4ganNwYi5NZXNzYWdlLnNldFJlcGVhdGVkV3JhcHBlckZpZWxkKHRoaXMsIDEsIHZhbHVlKTtcbn07XG5cblxuLyoqXG4gKiBAcGFyYW0geyFwcm90by5tb2RlbHMucHJvdG8uY29mZC5Db2ZkU2hlZXQuU2tpbGw9fSBvcHRfdmFsdWVcbiAqIEBwYXJhbSB7bnVtYmVyPX0gb3B0X2luZGV4XG4gKiBAcmV0dXJuIHshcHJvdG8ubW9kZWxzLnByb3RvLmNvZmQuQ29mZFNoZWV0LlNraWxsfVxuICovXG5wcm90by5tb2RlbHMucHJvdG8uY29mZC5hcGkuU2tpbGxzLnByb3RvdHlwZS5hZGRQaHlzaWNhbFNraWxscyA9IGZ1bmN0aW9uKG9wdF92YWx1ZSwgb3B0X2luZGV4KSB7XG4gIHJldHVybiBqc3BiLk1lc3NhZ2UuYWRkVG9SZXBlYXRlZFdyYXBwZXJGaWVsZCh0aGlzLCAxLCBvcHRfdmFsdWUsIHByb3RvLm1vZGVscy5wcm90by5jb2ZkLkNvZmRTaGVldC5Ta2lsbCwgb3B0X2luZGV4KTtcbn07XG5cblxuLyoqXG4gKiBDbGVhcnMgdGhlIGxpc3QgbWFraW5nIGl0IGVtcHR5IGJ1dCBub24tbnVsbC5cbiAqIEByZXR1cm4geyFwcm90by5tb2RlbHMucHJvdG8uY29mZC5hcGkuU2tpbGxzfSByZXR1cm5zIHRoaXNcbiAqL1xucHJvdG8ubW9kZWxzLnByb3RvLmNvZmQuYXBpLlNraWxscy5wcm90b3R5cGUuY2xlYXJQaHlzaWNhbFNraWxsc0xpc3QgPSBmdW5jdGlvbigpIHtcbiAgcmV0dXJuIHRoaXMuc2V0UGh5c2ljYWxTa2lsbHNMaXN0KFtdKTtcbn07XG5cblxuLyoqXG4gKiByZXBlYXRlZCBtb2RlbHMucHJvdG8uY29mZC5Db2ZkU2hlZXQuU2tpbGwgbWVudGFsX3NraWxscyA9IDI7XG4gKiBAcmV0dXJuIHshQXJyYXk8IXByb3RvLm1vZGVscy5wcm90by5jb2ZkLkNvZmRTaGVldC5Ta2lsbD59XG4gKi9cbnByb3RvLm1vZGVscy5wcm90by5jb2ZkLmFwaS5Ta2lsbHMucHJvdG90eXBlLmdldE1lbnRhbFNraWxsc0xpc3QgPSBmdW5jdGlvbigpIHtcbiAgcmV0dXJuIC8qKiBAdHlwZXshQXJyYXk8IXByb3RvLm1vZGVscy5wcm90by5jb2ZkLkNvZmRTaGVldC5Ta2lsbD59ICovIChcbiAgICBqc3BiLk1lc3NhZ2UuZ2V0UmVwZWF0ZWRXcmFwcGVyRmllbGQodGhpcywgY29mZF9wYi5Db2ZkU2hlZXQuU2tpbGwsIDIpKTtcbn07XG5cblxuLyoqXG4gKiBAcGFyYW0geyFBcnJheTwhcHJvdG8ubW9kZWxzLnByb3RvLmNvZmQuQ29mZFNoZWV0LlNraWxsPn0gdmFsdWVcbiAqIEByZXR1cm4geyFwcm90by5tb2RlbHMucHJvdG8uY29mZC5hcGkuU2tpbGxzfSByZXR1cm5zIHRoaXNcbiovXG5wcm90by5tb2RlbHMucHJvdG8uY29mZC5hcGkuU2tpbGxzLnByb3RvdHlwZS5zZXRNZW50YWxTa2lsbHNMaXN0ID0gZnVuY3Rpb24odmFsdWUpIHtcbiAgcmV0dXJuIGpzcGIuTWVzc2FnZS5zZXRSZXBlYXRlZFdyYXBwZXJGaWVsZCh0aGlzLCAyLCB2YWx1ZSk7XG59O1xuXG5cbi8qKlxuICogQHBhcmFtIHshcHJvdG8ubW9kZWxzLnByb3RvLmNvZmQuQ29mZFNoZWV0LlNraWxsPX0gb3B0X3ZhbHVlXG4gKiBAcGFyYW0ge251bWJlcj19IG9wdF9pbmRleFxuICogQHJldHVybiB7IXByb3RvLm1vZGVscy5wcm90by5jb2ZkLkNvZmRTaGVldC5Ta2lsbH1cbiAqL1xucHJvdG8ubW9kZWxzLnByb3RvLmNvZmQuYXBpLlNraWxscy5wcm90b3R5cGUuYWRkTWVudGFsU2tpbGxzID0gZnVuY3Rpb24ob3B0X3ZhbHVlLCBvcHRfaW5kZXgpIHtcbiAgcmV0dXJuIGpzcGIuTWVzc2FnZS5hZGRUb1JlcGVhdGVkV3JhcHBlckZpZWxkKHRoaXMsIDIsIG9wdF92YWx1ZSwgcHJvdG8ubW9kZWxzLnByb3RvLmNvZmQuQ29mZFNoZWV0LlNraWxsLCBvcHRfaW5kZXgpO1xufTtcblxuXG4vKipcbiAqIENsZWFycyB0aGUgbGlzdCBtYWtpbmcgaXQgZW1wdHkgYnV0IG5vbi1udWxsLlxuICogQHJldHVybiB7IXByb3RvLm1vZGVscy5wcm90by5jb2ZkLmFwaS5Ta2lsbHN9IHJldHVybnMgdGhpc1xuICovXG5wcm90by5tb2RlbHMucHJvdG8uY29mZC5hcGkuU2tpbGxzLnByb3RvdHlwZS5jbGVhck1lbnRhbFNraWxsc0xpc3QgPSBmdW5jdGlvbigpIHtcbiAgcmV0dXJuIHRoaXMuc2V0TWVudGFsU2tpbGxzTGlzdChbXSk7XG59O1xuXG5cbi8qKlxuICogcmVwZWF0ZWQgbW9kZWxzLnByb3RvLmNvZmQuQ29mZFNoZWV0LlNraWxsIHNvY2lhbF9za2lsbHMgPSAzO1xuICogQHJldHVybiB7IUFycmF5PCFwcm90by5tb2RlbHMucHJvdG8uY29mZC5Db2ZkU2hlZXQuU2tpbGw+fVxuICovXG5wcm90by5tb2RlbHMucHJvdG8uY29mZC5hcGkuU2tpbGxzLnByb3RvdHlwZS5nZXRTb2NpYWxTa2lsbHNMaXN0ID0gZnVuY3Rpb24oKSB7XG4gIHJldHVybiAvKiogQHR5cGV7IUFycmF5PCFwcm90by5tb2RlbHMucHJvdG8uY29mZC5Db2ZkU2hlZXQuU2tpbGw+fSAqLyAoXG4gICAganNwYi5NZXNzYWdlLmdldFJlcGVhdGVkV3JhcHBlckZpZWxkKHRoaXMsIGNvZmRfcGIuQ29mZFNoZWV0LlNraWxsLCAzKSk7XG59O1xuXG5cbi8qKlxuICogQHBhcmFtIHshQXJyYXk8IXByb3RvLm1vZGVscy5wcm90by5jb2ZkLkNvZmRTaGVldC5Ta2lsbD59IHZhbHVlXG4gKiBAcmV0dXJuIHshcHJvdG8ubW9kZWxzLnByb3RvLmNvZmQuYXBpLlNraWxsc30gcmV0dXJucyB0aGlzXG4qL1xucHJvdG8ubW9kZWxzLnByb3RvLmNvZmQuYXBpLlNraWxscy5wcm90b3R5cGUuc2V0U29jaWFsU2tpbGxzTGlzdCA9IGZ1bmN0aW9uKHZhbHVlKSB7XG4gIHJldHVybiBqc3BiLk1lc3NhZ2Uuc2V0UmVwZWF0ZWRXcmFwcGVyRmllbGQodGhpcywgMywgdmFsdWUpO1xufTtcblxuXG4vKipcbiAqIEBwYXJhbSB7IXByb3RvLm1vZGVscy5wcm90by5jb2ZkLkNvZmRTaGVldC5Ta2lsbD19IG9wdF92YWx1ZVxuICogQHBhcmFtIHtudW1iZXI9fSBvcHRfaW5kZXhcbiAqIEByZXR1cm4geyFwcm90by5tb2RlbHMucHJvdG8uY29mZC5Db2ZkU2hlZXQuU2tpbGx9XG4gKi9cbnByb3RvLm1vZGVscy5wcm90by5jb2ZkLmFwaS5Ta2lsbHMucHJvdG90eXBlLmFkZFNvY2lhbFNraWxscyA9IGZ1bmN0aW9uKG9wdF92YWx1ZSwgb3B0X2luZGV4KSB7XG4gIHJldHVybiBqc3BiLk1lc3NhZ2UuYWRkVG9SZXBlYXRlZFdyYXBwZXJGaWVsZCh0aGlzLCAzLCBvcHRfdmFsdWUsIHByb3RvLm1vZGVscy5wcm90by5jb2ZkLkNvZmRTaGVldC5Ta2lsbCwgb3B0X2luZGV4KTtcbn07XG5cblxuLyoqXG4gKiBDbGVhcnMgdGhlIGxpc3QgbWFraW5nIGl0IGVtcHR5IGJ1dCBub24tbnVsbC5cbiAqIEByZXR1cm4geyFwcm90by5tb2RlbHMucHJvdG8uY29mZC5hcGkuU2tpbGxzfSByZXR1cm5zIHRoaXNcbiAqL1xucHJvdG8ubW9kZWxzLnByb3RvLmNvZmQuYXBpLlNraWxscy5wcm90b3R5cGUuY2xlYXJTb2NpYWxTa2lsbHNMaXN0ID0gZnVuY3Rpb24oKSB7XG4gIHJldHVybiB0aGlzLnNldFNvY2lhbFNraWxsc0xpc3QoW10pO1xufTtcblxuXG5cblxuXG5pZiAoanNwYi5NZXNzYWdlLkdFTkVSQVRFX1RPX09CSkVDVCkge1xuLyoqXG4gKiBDcmVhdGVzIGFuIG9iamVjdCByZXByZXNlbnRhdGlvbiBvZiB0aGlzIHByb3RvLlxuICogRmllbGQgbmFtZXMgdGhhdCBhcmUgcmVzZXJ2ZWQgaW4gSmF2YVNjcmlwdCBhbmQgd2lsbCBiZSByZW5hbWVkIHRvIHBiX25hbWUuXG4gKiBPcHRpb25hbCBmaWVsZHMgdGhhdCBhcmUgbm90IHNldCB3aWxsIGJlIHNldCB0byB1bmRlZmluZWQuXG4gKiBUbyBhY2Nlc3MgYSByZXNlcnZlZCBmaWVsZCB1c2UsIGZvby5wYl88bmFtZT4sIGVnLCBmb28ucGJfZGVmYXVsdC5cbiAqIEZvciB0aGUgbGlzdCBvZiByZXNlcnZlZCBuYW1lcyBwbGVhc2Ugc2VlOlxuICogICAgIG5ldC9wcm90bzIvY29tcGlsZXIvanMvaW50ZXJuYWwvZ2VuZXJhdG9yLmNjI2tLZXl3b3JkLlxuICogQHBhcmFtIHtib29sZWFuPX0gb3B0X2luY2x1ZGVJbnN0YW5jZSBEZXByZWNhdGVkLiB3aGV0aGVyIHRvIGluY2x1ZGUgdGhlXG4gKiAgICAgSlNQQiBpbnN0YW5jZSBmb3IgdHJhbnNpdGlvbmFsIHNveSBwcm90byBzdXBwb3J0OlxuICogICAgIGh0dHA6Ly9nb3RvL3NveS1wYXJhbS1taWdyYXRpb25cbiAqIEByZXR1cm4geyFPYmplY3R9XG4gKi9cbnByb3RvLm1vZGVscy5wcm90by5jb2ZkLmFwaS5Ta2lsbFVwZGF0ZS5wcm90b3R5cGUudG9PYmplY3QgPSBmdW5jdGlvbihvcHRfaW5jbHVkZUluc3RhbmNlKSB7XG4gIHJldHVybiBwcm90by5tb2RlbHMucHJvdG8uY29mZC5hcGkuU2tpbGxVcGRhdGUudG9PYmplY3Qob3B0X2luY2x1ZGVJbnN0YW5jZSwgdGhpcyk7XG59O1xuXG5cbi8qKlxuICogU3RhdGljIHZlcnNpb24gb2YgdGhlIHtAc2VlIHRvT2JqZWN0fSBtZXRob2QuXG4gKiBAcGFyYW0ge2Jvb2xlYW58dW5kZWZpbmVkfSBpbmNsdWRlSW5zdGFuY2UgRGVwcmVjYXRlZC4gV2hldGhlciB0byBpbmNsdWRlXG4gKiAgICAgdGhlIEpTUEIgaW5zdGFuY2UgZm9yIHRyYW5zaXRpb25hbCBzb3kgcHJvdG8gc3VwcG9ydDpcbiAqICAgICBodHRwOi8vZ290by9zb3ktcGFyYW0tbWlncmF0aW9uXG4gKiBAcGFyYW0geyFwcm90by5tb2RlbHMucHJvdG8uY29mZC5hcGkuU2tpbGxVcGRhdGV9IG1zZyBUaGUgbXNnIGluc3RhbmNlIHRvIHRyYW5zZm9ybS5cbiAqIEByZXR1cm4geyFPYmplY3R9XG4gKiBAc3VwcHJlc3Mge3VudXNlZExvY2FsVmFyaWFibGVzfSBmIGlzIG9ubHkgdXNlZCBmb3IgbmVzdGVkIG1lc3NhZ2VzXG4gKi9cbnByb3RvLm1vZGVscy5wcm90by5jb2ZkLmFwaS5Ta2lsbFVwZGF0ZS50b09iamVjdCA9IGZ1bmN0aW9uKGluY2x1ZGVJbnN0YW5jZSwgbXNnKSB7XG4gIHZhciBmLCBvYmogPSB7XG4gICAgbmFtZToganNwYi5NZXNzYWdlLmdldEZpZWxkV2l0aERlZmF1bHQobXNnLCAxLCBcIlwiKSxcbiAgICBza2lsbDogKGYgPSBtc2cuZ2V0U2tpbGwoKSkgJiYgY29mZF9wYi5Db2ZkU2hlZXQuU2tpbGwudG9PYmplY3QoaW5jbHVkZUluc3RhbmNlLCBmKVxuICB9O1xuXG4gIGlmIChpbmNsdWRlSW5zdGFuY2UpIHtcbiAgICBvYmouJGpzcGJNZXNzYWdlSW5zdGFuY2UgPSBtc2c7XG4gIH1cbiAgcmV0dXJuIG9iajtcbn07XG59XG5cblxuLyoqXG4gKiBEZXNlcmlhbGl6ZXMgYmluYXJ5IGRhdGEgKGluIHByb3RvYnVmIHdpcmUgZm9ybWF0KS5cbiAqIEBwYXJhbSB7anNwYi5CeXRlU291cmNlfSBieXRlcyBUaGUgYnl0ZXMgdG8gZGVzZXJpYWxpemUuXG4gKiBAcmV0dXJuIHshcHJvdG8ubW9kZWxzLnByb3RvLmNvZmQuYXBpLlNraWxsVXBkYXRlfVxuICovXG5wcm90by5tb2RlbHMucHJvdG8uY29mZC5hcGkuU2tpbGxVcGRhdGUuZGVzZXJpYWxpemVCaW5hcnkgPSBmdW5jdGlvbihieXRlcykge1xuICB2YXIgcmVhZGVyID0gbmV3IGpzcGIuQmluYXJ5UmVhZGVyKGJ5dGVzKTtcbiAgdmFyIG1zZyA9IG5ldyBwcm90by5tb2RlbHMucHJvdG8uY29mZC5hcGkuU2tpbGxVcGRhdGU7XG4gIHJldHVybiBwcm90by5tb2RlbHMucHJvdG8uY29mZC5hcGkuU2tpbGxVcGRhdGUuZGVzZXJpYWxpemVCaW5hcnlGcm9tUmVhZGVyKG1zZywgcmVhZGVyKTtcbn07XG5cblxuLyoqXG4gKiBEZXNlcmlhbGl6ZXMgYmluYXJ5IGRhdGEgKGluIHByb3RvYnVmIHdpcmUgZm9ybWF0KSBmcm9tIHRoZVxuICogZ2l2ZW4gcmVhZGVyIGludG8gdGhlIGdpdmVuIG1lc3NhZ2Ugb2JqZWN0LlxuICogQHBhcmFtIHshcHJvdG8ubW9kZWxzLnByb3RvLmNvZmQuYXBpLlNraWxsVXBkYXRlfSBtc2cgVGhlIG1lc3NhZ2Ugb2JqZWN0IHRvIGRlc2VyaWFsaXplIGludG8uXG4gKiBAcGFyYW0geyFqc3BiLkJpbmFyeVJlYWRlcn0gcmVhZGVyIFRoZSBCaW5hcnlSZWFkZXIgdG8gdXNlLlxuICogQHJldHVybiB7IXByb3RvLm1vZGVscy5wcm90by5jb2ZkLmFwaS5Ta2lsbFVwZGF0ZX1cbiAqL1xucHJvdG8ubW9kZWxzLnByb3RvLmNvZmQuYXBpLlNraWxsVXBkYXRlLmRlc2VyaWFsaXplQmluYXJ5RnJvbVJlYWRlciA9IGZ1bmN0aW9uKG1zZywgcmVhZGVyKSB7XG4gIHdoaWxlIChyZWFkZXIubmV4dEZpZWxkKCkpIHtcbiAgICBpZiAocmVhZGVyLmlzRW5kR3JvdXAoKSkge1xuICAgICAgYnJlYWs7XG4gICAgfVxuICAgIHZhciBmaWVsZCA9IHJlYWRlci5nZXRGaWVsZE51bWJlcigpO1xuICAgIHN3aXRjaCAoZmllbGQpIHtcbiAgICBjYXNlIDE6XG4gICAgICB2YXIgdmFsdWUgPSAvKiogQHR5cGUge3N0cmluZ30gKi8gKHJlYWRlci5yZWFkU3RyaW5nKCkpO1xuICAgICAgbXNnLnNldE5hbWUodmFsdWUpO1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSAyOlxuICAgICAgdmFyIHZhbHVlID0gbmV3IGNvZmRfcGIuQ29mZFNoZWV0LlNraWxsO1xuICAgICAgcmVhZGVyLnJlYWRNZXNzYWdlKHZhbHVlLGNvZmRfcGIuQ29mZFNoZWV0LlNraWxsLmRlc2VyaWFsaXplQmluYXJ5RnJvbVJlYWRlcik7XG4gICAgICBtc2cuc2V0U2tpbGwodmFsdWUpO1xuICAgICAgYnJlYWs7XG4gICAgZGVmYXVsdDpcbiAgICAgIHJlYWRlci5za2lwRmllbGQoKTtcbiAgICAgIGJyZWFrO1xuICAgIH1cbiAgfVxuICByZXR1cm4gbXNnO1xufTtcblxuXG4vKipcbiAqIFNlcmlhbGl6ZXMgdGhlIG1lc3NhZ2UgdG8gYmluYXJ5IGRhdGEgKGluIHByb3RvYnVmIHdpcmUgZm9ybWF0KS5cbiAqIEByZXR1cm4geyFVaW50OEFycmF5fVxuICovXG5wcm90by5tb2RlbHMucHJvdG8uY29mZC5hcGkuU2tpbGxVcGRhdGUucHJvdG90eXBlLnNlcmlhbGl6ZUJpbmFyeSA9IGZ1bmN0aW9uKCkge1xuICB2YXIgd3JpdGVyID0gbmV3IGpzcGIuQmluYXJ5V3JpdGVyKCk7XG4gIHByb3RvLm1vZGVscy5wcm90by5jb2ZkLmFwaS5Ta2lsbFVwZGF0ZS5zZXJpYWxpemVCaW5hcnlUb1dyaXRlcih0aGlzLCB3cml0ZXIpO1xuICByZXR1cm4gd3JpdGVyLmdldFJlc3VsdEJ1ZmZlcigpO1xufTtcblxuXG4vKipcbiAqIFNlcmlhbGl6ZXMgdGhlIGdpdmVuIG1lc3NhZ2UgdG8gYmluYXJ5IGRhdGEgKGluIHByb3RvYnVmIHdpcmVcbiAqIGZvcm1hdCksIHdyaXRpbmcgdG8gdGhlIGdpdmVuIEJpbmFyeVdyaXRlci5cbiAqIEBwYXJhbSB7IXByb3RvLm1vZGVscy5wcm90by5jb2ZkLmFwaS5Ta2lsbFVwZGF0ZX0gbWVzc2FnZVxuICogQHBhcmFtIHshanNwYi5CaW5hcnlXcml0ZXJ9IHdyaXRlclxuICogQHN1cHByZXNzIHt1bnVzZWRMb2NhbFZhcmlhYmxlc30gZiBpcyBvbmx5IHVzZWQgZm9yIG5lc3RlZCBtZXNzYWdlc1xuICovXG5wcm90by5tb2RlbHMucHJvdG8uY29mZC5hcGkuU2tpbGxVcGRhdGUuc2VyaWFsaXplQmluYXJ5VG9Xcml0ZXIgPSBmdW5jdGlvbihtZXNzYWdlLCB3cml0ZXIpIHtcbiAgdmFyIGYgPSB1bmRlZmluZWQ7XG4gIGYgPSBtZXNzYWdlLmdldE5hbWUoKTtcbiAgaWYgKGYubGVuZ3RoID4gMCkge1xuICAgIHdyaXRlci53cml0ZVN0cmluZyhcbiAgICAgIDEsXG4gICAgICBmXG4gICAgKTtcbiAgfVxuICBmID0gbWVzc2FnZS5nZXRTa2lsbCgpO1xuICBpZiAoZiAhPSBudWxsKSB7XG4gICAgd3JpdGVyLndyaXRlTWVzc2FnZShcbiAgICAgIDIsXG4gICAgICBmLFxuICAgICAgY29mZF9wYi5Db2ZkU2hlZXQuU2tpbGwuc2VyaWFsaXplQmluYXJ5VG9Xcml0ZXJcbiAgICApO1xuICB9XG59O1xuXG5cbi8qKlxuICogb3B0aW9uYWwgc3RyaW5nIG5hbWUgPSAxO1xuICogQHJldHVybiB7c3RyaW5nfVxuICovXG5wcm90by5tb2RlbHMucHJvdG8uY29mZC5hcGkuU2tpbGxVcGRhdGUucHJvdG90eXBlLmdldE5hbWUgPSBmdW5jdGlvbigpIHtcbiAgcmV0dXJuIC8qKiBAdHlwZSB7c3RyaW5nfSAqLyAoanNwYi5NZXNzYWdlLmdldEZpZWxkV2l0aERlZmF1bHQodGhpcywgMSwgXCJcIikpO1xufTtcblxuXG4vKipcbiAqIEBwYXJhbSB7c3RyaW5nfSB2YWx1ZVxuICogQHJldHVybiB7IXByb3RvLm1vZGVscy5wcm90by5jb2ZkLmFwaS5Ta2lsbFVwZGF0ZX0gcmV0dXJucyB0aGlzXG4gKi9cbnByb3RvLm1vZGVscy5wcm90by5jb2ZkLmFwaS5Ta2lsbFVwZGF0ZS5wcm90b3R5cGUuc2V0TmFtZSA9IGZ1bmN0aW9uKHZhbHVlKSB7XG4gIHJldHVybiBqc3BiLk1lc3NhZ2Uuc2V0UHJvdG8zU3RyaW5nRmllbGQodGhpcywgMSwgdmFsdWUpO1xufTtcblxuXG4vKipcbiAqIG9wdGlvbmFsIG1vZGVscy5wcm90by5jb2ZkLkNvZmRTaGVldC5Ta2lsbCBza2lsbCA9IDI7XG4gKiBAcmV0dXJuIHs/cHJvdG8ubW9kZWxzLnByb3RvLmNvZmQuQ29mZFNoZWV0LlNraWxsfVxuICovXG5wcm90by5tb2RlbHMucHJvdG8uY29mZC5hcGkuU2tpbGxVcGRhdGUucHJvdG90eXBlLmdldFNraWxsID0gZnVuY3Rpb24oKSB7XG4gIHJldHVybiAvKiogQHR5cGV7P3Byb3RvLm1vZGVscy5wcm90by5jb2ZkLkNvZmRTaGVldC5Ta2lsbH0gKi8gKFxuICAgIGpzcGIuTWVzc2FnZS5nZXRXcmFwcGVyRmllbGQodGhpcywgY29mZF9wYi5Db2ZkU2hlZXQuU2tpbGwsIDIpKTtcbn07XG5cblxuLyoqXG4gKiBAcGFyYW0gez9wcm90by5tb2RlbHMucHJvdG8uY29mZC5Db2ZkU2hlZXQuU2tpbGx8dW5kZWZpbmVkfSB2YWx1ZVxuICogQHJldHVybiB7IXByb3RvLm1vZGVscy5wcm90by5jb2ZkLmFwaS5Ta2lsbFVwZGF0ZX0gcmV0dXJucyB0aGlzXG4qL1xucHJvdG8ubW9kZWxzLnByb3RvLmNvZmQuYXBpLlNraWxsVXBkYXRlLnByb3RvdHlwZS5zZXRTa2lsbCA9IGZ1bmN0aW9uKHZhbHVlKSB7XG4gIHJldHVybiBqc3BiLk1lc3NhZ2Uuc2V0V3JhcHBlckZpZWxkKHRoaXMsIDIsIHZhbHVlKTtcbn07XG5cblxuLyoqXG4gKiBDbGVhcnMgdGhlIG1lc3NhZ2UgZmllbGQgbWFraW5nIGl0IHVuZGVmaW5lZC5cbiAqIEByZXR1cm4geyFwcm90by5tb2RlbHMucHJvdG8uY29mZC5hcGkuU2tpbGxVcGRhdGV9IHJldHVybnMgdGhpc1xuICovXG5wcm90by5tb2RlbHMucHJvdG8uY29mZC5hcGkuU2tpbGxVcGRhdGUucHJvdG90eXBlLmNsZWFyU2tpbGwgPSBmdW5jdGlvbigpIHtcbiAgcmV0dXJuIHRoaXMuc2V0U2tpbGwodW5kZWZpbmVkKTtcbn07XG5cblxuLyoqXG4gKiBSZXR1cm5zIHdoZXRoZXIgdGhpcyBmaWVsZCBpcyBzZXQuXG4gKiBAcmV0dXJuIHtib29sZWFufVxuICovXG5wcm90by5tb2RlbHMucHJvdG8uY29mZC5hcGkuU2tpbGxVcGRhdGUucHJvdG90eXBlLmhhc1NraWxsID0gZnVuY3Rpb24oKSB7XG4gIHJldHVybiBqc3BiLk1lc3NhZ2UuZ2V0RmllbGQodGhpcywgMikgIT0gbnVsbDtcbn07XG5cblxuXG5cblxuaWYgKGpzcGIuTWVzc2FnZS5HRU5FUkFURV9UT19PQkpFQ1QpIHtcbi8qKlxuICogQ3JlYXRlcyBhbiBvYmplY3QgcmVwcmVzZW50YXRpb24gb2YgdGhpcyBwcm90by5cbiAqIEZpZWxkIG5hbWVzIHRoYXQgYXJlIHJlc2VydmVkIGluIEphdmFTY3JpcHQgYW5kIHdpbGwgYmUgcmVuYW1lZCB0byBwYl9uYW1lLlxuICogT3B0aW9uYWwgZmllbGRzIHRoYXQgYXJlIG5vdCBzZXQgd2lsbCBiZSBzZXQgdG8gdW5kZWZpbmVkLlxuICogVG8gYWNjZXNzIGEgcmVzZXJ2ZWQgZmllbGQgdXNlLCBmb28ucGJfPG5hbWU+LCBlZywgZm9vLnBiX2RlZmF1bHQuXG4gKiBGb3IgdGhlIGxpc3Qgb2YgcmVzZXJ2ZWQgbmFtZXMgcGxlYXNlIHNlZTpcbiAqICAgICBuZXQvcHJvdG8yL2NvbXBpbGVyL2pzL2ludGVybmFsL2dlbmVyYXRvci5jYyNrS2V5d29yZC5cbiAqIEBwYXJhbSB7Ym9vbGVhbj19IG9wdF9pbmNsdWRlSW5zdGFuY2UgRGVwcmVjYXRlZC4gd2hldGhlciB0byBpbmNsdWRlIHRoZVxuICogICAgIEpTUEIgaW5zdGFuY2UgZm9yIHRyYW5zaXRpb25hbCBzb3kgcHJvdG8gc3VwcG9ydDpcbiAqICAgICBodHRwOi8vZ290by9zb3ktcGFyYW0tbWlncmF0aW9uXG4gKiBAcmV0dXJuIHshT2JqZWN0fVxuICovXG5wcm90by5tb2RlbHMucHJvdG8uY29mZC5hcGkuVXBkYXRlU2tpbGxWYWx1ZVJlcXVlc3QucHJvdG90eXBlLnRvT2JqZWN0ID0gZnVuY3Rpb24ob3B0X2luY2x1ZGVJbnN0YW5jZSkge1xuICByZXR1cm4gcHJvdG8ubW9kZWxzLnByb3RvLmNvZmQuYXBpLlVwZGF0ZVNraWxsVmFsdWVSZXF1ZXN0LnRvT2JqZWN0KG9wdF9pbmNsdWRlSW5zdGFuY2UsIHRoaXMpO1xufTtcblxuXG4vKipcbiAqIFN0YXRpYyB2ZXJzaW9uIG9mIHRoZSB7QHNlZSB0b09iamVjdH0gbWV0aG9kLlxuICogQHBhcmFtIHtib29sZWFufHVuZGVmaW5lZH0gaW5jbHVkZUluc3RhbmNlIERlcHJlY2F0ZWQuIFdoZXRoZXIgdG8gaW5jbHVkZVxuICogICAgIHRoZSBKU1BCIGluc3RhbmNlIGZvciB0cmFuc2l0aW9uYWwgc295IHByb3RvIHN1cHBvcnQ6XG4gKiAgICAgaHR0cDovL2dvdG8vc295LXBhcmFtLW1pZ3JhdGlvblxuICogQHBhcmFtIHshcHJvdG8ubW9kZWxzLnByb3RvLmNvZmQuYXBpLlVwZGF0ZVNraWxsVmFsdWVSZXF1ZXN0fSBtc2cgVGhlIG1zZyBpbnN0YW5jZSB0byB0cmFuc2Zvcm0uXG4gKiBAcmV0dXJuIHshT2JqZWN0fVxuICogQHN1cHByZXNzIHt1bnVzZWRMb2NhbFZhcmlhYmxlc30gZiBpcyBvbmx5IHVzZWQgZm9yIG5lc3RlZCBtZXNzYWdlc1xuICovXG5wcm90by5tb2RlbHMucHJvdG8uY29mZC5hcGkuVXBkYXRlU2tpbGxWYWx1ZVJlcXVlc3QudG9PYmplY3QgPSBmdW5jdGlvbihpbmNsdWRlSW5zdGFuY2UsIG1zZykge1xuICB2YXIgZiwgb2JqID0ge1xuICAgIGNoYXJhY3RlclVzZXJuYW1lOiBqc3BiLk1lc3NhZ2UuZ2V0RmllbGRXaXRoRGVmYXVsdChtc2csIDEsIFwiXCIpLFxuICAgIGNoYXJhY3RlcklkOiBqc3BiLk1lc3NhZ2UuZ2V0RmllbGRXaXRoRGVmYXVsdChtc2csIDIsIDApLFxuICAgIHNraWxsTmFtZToganNwYi5NZXNzYWdlLmdldEZpZWxkV2l0aERlZmF1bHQobXNnLCAzLCBcIlwiKSxcbiAgICBza2lsbFZhbHVlOiBqc3BiLk1lc3NhZ2UuZ2V0RmllbGRXaXRoRGVmYXVsdChtc2csIDQsIDApXG4gIH07XG5cbiAgaWYgKGluY2x1ZGVJbnN0YW5jZSkge1xuICAgIG9iai4kanNwYk1lc3NhZ2VJbnN0YW5jZSA9IG1zZztcbiAgfVxuICByZXR1cm4gb2JqO1xufTtcbn1cblxuXG4vKipcbiAqIERlc2VyaWFsaXplcyBiaW5hcnkgZGF0YSAoaW4gcHJvdG9idWYgd2lyZSBmb3JtYXQpLlxuICogQHBhcmFtIHtqc3BiLkJ5dGVTb3VyY2V9IGJ5dGVzIFRoZSBieXRlcyB0byBkZXNlcmlhbGl6ZS5cbiAqIEByZXR1cm4geyFwcm90by5tb2RlbHMucHJvdG8uY29mZC5hcGkuVXBkYXRlU2tpbGxWYWx1ZVJlcXVlc3R9XG4gKi9cbnByb3RvLm1vZGVscy5wcm90by5jb2ZkLmFwaS5VcGRhdGVTa2lsbFZhbHVlUmVxdWVzdC5kZXNlcmlhbGl6ZUJpbmFyeSA9IGZ1bmN0aW9uKGJ5dGVzKSB7XG4gIHZhciByZWFkZXIgPSBuZXcganNwYi5CaW5hcnlSZWFkZXIoYnl0ZXMpO1xuICB2YXIgbXNnID0gbmV3IHByb3RvLm1vZGVscy5wcm90by5jb2ZkLmFwaS5VcGRhdGVTa2lsbFZhbHVlUmVxdWVzdDtcbiAgcmV0dXJuIHByb3RvLm1vZGVscy5wcm90by5jb2ZkLmFwaS5VcGRhdGVTa2lsbFZhbHVlUmVxdWVzdC5kZXNlcmlhbGl6ZUJpbmFyeUZyb21SZWFkZXIobXNnLCByZWFkZXIpO1xufTtcblxuXG4vKipcbiAqIERlc2VyaWFsaXplcyBiaW5hcnkgZGF0YSAoaW4gcHJvdG9idWYgd2lyZSBmb3JtYXQpIGZyb20gdGhlXG4gKiBnaXZlbiByZWFkZXIgaW50byB0aGUgZ2l2ZW4gbWVzc2FnZSBvYmplY3QuXG4gKiBAcGFyYW0geyFwcm90by5tb2RlbHMucHJvdG8uY29mZC5hcGkuVXBkYXRlU2tpbGxWYWx1ZVJlcXVlc3R9IG1zZyBUaGUgbWVzc2FnZSBvYmplY3QgdG8gZGVzZXJpYWxpemUgaW50by5cbiAqIEBwYXJhbSB7IWpzcGIuQmluYXJ5UmVhZGVyfSByZWFkZXIgVGhlIEJpbmFyeVJlYWRlciB0byB1c2UuXG4gKiBAcmV0dXJuIHshcHJvdG8ubW9kZWxzLnByb3RvLmNvZmQuYXBpLlVwZGF0ZVNraWxsVmFsdWVSZXF1ZXN0fVxuICovXG5wcm90by5tb2RlbHMucHJvdG8uY29mZC5hcGkuVXBkYXRlU2tpbGxWYWx1ZVJlcXVlc3QuZGVzZXJpYWxpemVCaW5hcnlGcm9tUmVhZGVyID0gZnVuY3Rpb24obXNnLCByZWFkZXIpIHtcbiAgd2hpbGUgKHJlYWRlci5uZXh0RmllbGQoKSkge1xuICAgIGlmIChyZWFkZXIuaXNFbmRHcm91cCgpKSB7XG4gICAgICBicmVhaztcbiAgICB9XG4gICAgdmFyIGZpZWxkID0gcmVhZGVyLmdldEZpZWxkTnVtYmVyKCk7XG4gICAgc3dpdGNoIChmaWVsZCkge1xuICAgIGNhc2UgMTpcbiAgICAgIHZhciB2YWx1ZSA9IC8qKiBAdHlwZSB7c3RyaW5nfSAqLyAocmVhZGVyLnJlYWRTdHJpbmcoKSk7XG4gICAgICBtc2cuc2V0Q2hhcmFjdGVyVXNlcm5hbWUodmFsdWUpO1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSAyOlxuICAgICAgdmFyIHZhbHVlID0gLyoqIEB0eXBlIHtudW1iZXJ9ICovIChyZWFkZXIucmVhZEludDMyKCkpO1xuICAgICAgbXNnLnNldENoYXJhY3RlcklkKHZhbHVlKTtcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgMzpcbiAgICAgIHZhciB2YWx1ZSA9IC8qKiBAdHlwZSB7c3RyaW5nfSAqLyAocmVhZGVyLnJlYWRTdHJpbmcoKSk7XG4gICAgICBtc2cuc2V0U2tpbGxOYW1lKHZhbHVlKTtcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgNDpcbiAgICAgIHZhciB2YWx1ZSA9IC8qKiBAdHlwZSB7bnVtYmVyfSAqLyAocmVhZGVyLnJlYWRJbnQzMigpKTtcbiAgICAgIG1zZy5zZXRTa2lsbFZhbHVlKHZhbHVlKTtcbiAgICAgIGJyZWFrO1xuICAgIGRlZmF1bHQ6XG4gICAgICByZWFkZXIuc2tpcEZpZWxkKCk7XG4gICAgICBicmVhaztcbiAgICB9XG4gIH1cbiAgcmV0dXJuIG1zZztcbn07XG5cblxuLyoqXG4gKiBTZXJpYWxpemVzIHRoZSBtZXNzYWdlIHRvIGJpbmFyeSBkYXRhIChpbiBwcm90b2J1ZiB3aXJlIGZvcm1hdCkuXG4gKiBAcmV0dXJuIHshVWludDhBcnJheX1cbiAqL1xucHJvdG8ubW9kZWxzLnByb3RvLmNvZmQuYXBpLlVwZGF0ZVNraWxsVmFsdWVSZXF1ZXN0LnByb3RvdHlwZS5zZXJpYWxpemVCaW5hcnkgPSBmdW5jdGlvbigpIHtcbiAgdmFyIHdyaXRlciA9IG5ldyBqc3BiLkJpbmFyeVdyaXRlcigpO1xuICBwcm90by5tb2RlbHMucHJvdG8uY29mZC5hcGkuVXBkYXRlU2tpbGxWYWx1ZVJlcXVlc3Quc2VyaWFsaXplQmluYXJ5VG9Xcml0ZXIodGhpcywgd3JpdGVyKTtcbiAgcmV0dXJuIHdyaXRlci5nZXRSZXN1bHRCdWZmZXIoKTtcbn07XG5cblxuLyoqXG4gKiBTZXJpYWxpemVzIHRoZSBnaXZlbiBtZXNzYWdlIHRvIGJpbmFyeSBkYXRhIChpbiBwcm90b2J1ZiB3aXJlXG4gKiBmb3JtYXQpLCB3cml0aW5nIHRvIHRoZSBnaXZlbiBCaW5hcnlXcml0ZXIuXG4gKiBAcGFyYW0geyFwcm90by5tb2RlbHMucHJvdG8uY29mZC5hcGkuVXBkYXRlU2tpbGxWYWx1ZVJlcXVlc3R9IG1lc3NhZ2VcbiAqIEBwYXJhbSB7IWpzcGIuQmluYXJ5V3JpdGVyfSB3cml0ZXJcbiAqIEBzdXBwcmVzcyB7dW51c2VkTG9jYWxWYXJpYWJsZXN9IGYgaXMgb25seSB1c2VkIGZvciBuZXN0ZWQgbWVzc2FnZXNcbiAqL1xucHJvdG8ubW9kZWxzLnByb3RvLmNvZmQuYXBpLlVwZGF0ZVNraWxsVmFsdWVSZXF1ZXN0LnNlcmlhbGl6ZUJpbmFyeVRvV3JpdGVyID0gZnVuY3Rpb24obWVzc2FnZSwgd3JpdGVyKSB7XG4gIHZhciBmID0gdW5kZWZpbmVkO1xuICBmID0gbWVzc2FnZS5nZXRDaGFyYWN0ZXJVc2VybmFtZSgpO1xuICBpZiAoZi5sZW5ndGggPiAwKSB7XG4gICAgd3JpdGVyLndyaXRlU3RyaW5nKFxuICAgICAgMSxcbiAgICAgIGZcbiAgICApO1xuICB9XG4gIGYgPSBtZXNzYWdlLmdldENoYXJhY3RlcklkKCk7XG4gIGlmIChmICE9PSAwKSB7XG4gICAgd3JpdGVyLndyaXRlSW50MzIoXG4gICAgICAyLFxuICAgICAgZlxuICAgICk7XG4gIH1cbiAgZiA9IG1lc3NhZ2UuZ2V0U2tpbGxOYW1lKCk7XG4gIGlmIChmLmxlbmd0aCA+IDApIHtcbiAgICB3cml0ZXIud3JpdGVTdHJpbmcoXG4gICAgICAzLFxuICAgICAgZlxuICAgICk7XG4gIH1cbiAgZiA9IG1lc3NhZ2UuZ2V0U2tpbGxWYWx1ZSgpO1xuICBpZiAoZiAhPT0gMCkge1xuICAgIHdyaXRlci53cml0ZUludDMyKFxuICAgICAgNCxcbiAgICAgIGZcbiAgICApO1xuICB9XG59O1xuXG5cbi8qKlxuICogb3B0aW9uYWwgc3RyaW5nIGNoYXJhY3Rlcl91c2VybmFtZSA9IDE7XG4gKiBAcmV0dXJuIHtzdHJpbmd9XG4gKi9cbnByb3RvLm1vZGVscy5wcm90by5jb2ZkLmFwaS5VcGRhdGVTa2lsbFZhbHVlUmVxdWVzdC5wcm90b3R5cGUuZ2V0Q2hhcmFjdGVyVXNlcm5hbWUgPSBmdW5jdGlvbigpIHtcbiAgcmV0dXJuIC8qKiBAdHlwZSB7c3RyaW5nfSAqLyAoanNwYi5NZXNzYWdlLmdldEZpZWxkV2l0aERlZmF1bHQodGhpcywgMSwgXCJcIikpO1xufTtcblxuXG4vKipcbiAqIEBwYXJhbSB7c3RyaW5nfSB2YWx1ZVxuICogQHJldHVybiB7IXByb3RvLm1vZGVscy5wcm90by5jb2ZkLmFwaS5VcGRhdGVTa2lsbFZhbHVlUmVxdWVzdH0gcmV0dXJucyB0aGlzXG4gKi9cbnByb3RvLm1vZGVscy5wcm90by5jb2ZkLmFwaS5VcGRhdGVTa2lsbFZhbHVlUmVxdWVzdC5wcm90b3R5cGUuc2V0Q2hhcmFjdGVyVXNlcm5hbWUgPSBmdW5jdGlvbih2YWx1ZSkge1xuICByZXR1cm4ganNwYi5NZXNzYWdlLnNldFByb3RvM1N0cmluZ0ZpZWxkKHRoaXMsIDEsIHZhbHVlKTtcbn07XG5cblxuLyoqXG4gKiBvcHRpb25hbCBpbnQzMiBjaGFyYWN0ZXJfaWQgPSAyO1xuICogQHJldHVybiB7bnVtYmVyfVxuICovXG5wcm90by5tb2RlbHMucHJvdG8uY29mZC5hcGkuVXBkYXRlU2tpbGxWYWx1ZVJlcXVlc3QucHJvdG90eXBlLmdldENoYXJhY3RlcklkID0gZnVuY3Rpb24oKSB7XG4gIHJldHVybiAvKiogQHR5cGUge251bWJlcn0gKi8gKGpzcGIuTWVzc2FnZS5nZXRGaWVsZFdpdGhEZWZhdWx0KHRoaXMsIDIsIDApKTtcbn07XG5cblxuLyoqXG4gKiBAcGFyYW0ge251bWJlcn0gdmFsdWVcbiAqIEByZXR1cm4geyFwcm90by5tb2RlbHMucHJvdG8uY29mZC5hcGkuVXBkYXRlU2tpbGxWYWx1ZVJlcXVlc3R9IHJldHVybnMgdGhpc1xuICovXG5wcm90by5tb2RlbHMucHJvdG8uY29mZC5hcGkuVXBkYXRlU2tpbGxWYWx1ZVJlcXVlc3QucHJvdG90eXBlLnNldENoYXJhY3RlcklkID0gZnVuY3Rpb24odmFsdWUpIHtcbiAgcmV0dXJuIGpzcGIuTWVzc2FnZS5zZXRQcm90bzNJbnRGaWVsZCh0aGlzLCAyLCB2YWx1ZSk7XG59O1xuXG5cbi8qKlxuICogb3B0aW9uYWwgc3RyaW5nIHNraWxsX25hbWUgPSAzO1xuICogQHJldHVybiB7c3RyaW5nfVxuICovXG5wcm90by5tb2RlbHMucHJvdG8uY29mZC5hcGkuVXBkYXRlU2tpbGxWYWx1ZVJlcXVlc3QucHJvdG90eXBlLmdldFNraWxsTmFtZSA9IGZ1bmN0aW9uKCkge1xuICByZXR1cm4gLyoqIEB0eXBlIHtzdHJpbmd9ICovIChqc3BiLk1lc3NhZ2UuZ2V0RmllbGRXaXRoRGVmYXVsdCh0aGlzLCAzLCBcIlwiKSk7XG59O1xuXG5cbi8qKlxuICogQHBhcmFtIHtzdHJpbmd9IHZhbHVlXG4gKiBAcmV0dXJuIHshcHJvdG8ubW9kZWxzLnByb3RvLmNvZmQuYXBpLlVwZGF0ZVNraWxsVmFsdWVSZXF1ZXN0fSByZXR1cm5zIHRoaXNcbiAqL1xucHJvdG8ubW9kZWxzLnByb3RvLmNvZmQuYXBpLlVwZGF0ZVNraWxsVmFsdWVSZXF1ZXN0LnByb3RvdHlwZS5zZXRTa2lsbE5hbWUgPSBmdW5jdGlvbih2YWx1ZSkge1xuICByZXR1cm4ganNwYi5NZXNzYWdlLnNldFByb3RvM1N0cmluZ0ZpZWxkKHRoaXMsIDMsIHZhbHVlKTtcbn07XG5cblxuLyoqXG4gKiBvcHRpb25hbCBpbnQzMiBza2lsbF92YWx1ZSA9IDQ7XG4gKiBAcmV0dXJuIHtudW1iZXJ9XG4gKi9cbnByb3RvLm1vZGVscy5wcm90by5jb2ZkLmFwaS5VcGRhdGVTa2lsbFZhbHVlUmVxdWVzdC5wcm90b3R5cGUuZ2V0U2tpbGxWYWx1ZSA9IGZ1bmN0aW9uKCkge1xuICByZXR1cm4gLyoqIEB0eXBlIHtudW1iZXJ9ICovIChqc3BiLk1lc3NhZ2UuZ2V0RmllbGRXaXRoRGVmYXVsdCh0aGlzLCA0LCAwKSk7XG59O1xuXG5cbi8qKlxuICogQHBhcmFtIHtudW1iZXJ9IHZhbHVlXG4gKiBAcmV0dXJuIHshcHJvdG8ubW9kZWxzLnByb3RvLmNvZmQuYXBpLlVwZGF0ZVNraWxsVmFsdWVSZXF1ZXN0fSByZXR1cm5zIHRoaXNcbiAqL1xucHJvdG8ubW9kZWxzLnByb3RvLmNvZmQuYXBpLlVwZGF0ZVNraWxsVmFsdWVSZXF1ZXN0LnByb3RvdHlwZS5zZXRTa2lsbFZhbHVlID0gZnVuY3Rpb24odmFsdWUpIHtcbiAgcmV0dXJuIGpzcGIuTWVzc2FnZS5zZXRQcm90bzNJbnRGaWVsZCh0aGlzLCA0LCB2YWx1ZSk7XG59O1xuXG5cblxuLyoqXG4gKiBMaXN0IG9mIHJlcGVhdGVkIGZpZWxkcyB3aXRoaW4gdGhpcyBtZXNzYWdlIHR5cGUuXG4gKiBAcHJpdmF0ZSB7IUFycmF5PG51bWJlcj59XG4gKiBAY29uc3RcbiAqL1xucHJvdG8ubW9kZWxzLnByb3RvLmNvZmQuYXBpLlNraWxsU3BlY2lhbGl6YXRpb25zVXBkYXRlLnJlcGVhdGVkRmllbGRzXyA9IFsyXTtcblxuXG5cbmlmIChqc3BiLk1lc3NhZ2UuR0VORVJBVEVfVE9fT0JKRUNUKSB7XG4vKipcbiAqIENyZWF0ZXMgYW4gb2JqZWN0IHJlcHJlc2VudGF0aW9uIG9mIHRoaXMgcHJvdG8uXG4gKiBGaWVsZCBuYW1lcyB0aGF0IGFyZSByZXNlcnZlZCBpbiBKYXZhU2NyaXB0IGFuZCB3aWxsIGJlIHJlbmFtZWQgdG8gcGJfbmFtZS5cbiAqIE9wdGlvbmFsIGZpZWxkcyB0aGF0IGFyZSBub3Qgc2V0IHdpbGwgYmUgc2V0IHRvIHVuZGVmaW5lZC5cbiAqIFRvIGFjY2VzcyBhIHJlc2VydmVkIGZpZWxkIHVzZSwgZm9vLnBiXzxuYW1lPiwgZWcsIGZvby5wYl9kZWZhdWx0LlxuICogRm9yIHRoZSBsaXN0IG9mIHJlc2VydmVkIG5hbWVzIHBsZWFzZSBzZWU6XG4gKiAgICAgbmV0L3Byb3RvMi9jb21waWxlci9qcy9pbnRlcm5hbC9nZW5lcmF0b3IuY2Mja0tleXdvcmQuXG4gKiBAcGFyYW0ge2Jvb2xlYW49fSBvcHRfaW5jbHVkZUluc3RhbmNlIERlcHJlY2F0ZWQuIHdoZXRoZXIgdG8gaW5jbHVkZSB0aGVcbiAqICAgICBKU1BCIGluc3RhbmNlIGZvciB0cmFuc2l0aW9uYWwgc295IHByb3RvIHN1cHBvcnQ6XG4gKiAgICAgaHR0cDovL2dvdG8vc295LXBhcmFtLW1pZ3JhdGlvblxuICogQHJldHVybiB7IU9iamVjdH1cbiAqL1xucHJvdG8ubW9kZWxzLnByb3RvLmNvZmQuYXBpLlNraWxsU3BlY2lhbGl6YXRpb25zVXBkYXRlLnByb3RvdHlwZS50b09iamVjdCA9IGZ1bmN0aW9uKG9wdF9pbmNsdWRlSW5zdGFuY2UpIHtcbiAgcmV0dXJuIHByb3RvLm1vZGVscy5wcm90by5jb2ZkLmFwaS5Ta2lsbFNwZWNpYWxpemF0aW9uc1VwZGF0ZS50b09iamVjdChvcHRfaW5jbHVkZUluc3RhbmNlLCB0aGlzKTtcbn07XG5cblxuLyoqXG4gKiBTdGF0aWMgdmVyc2lvbiBvZiB0aGUge0BzZWUgdG9PYmplY3R9IG1ldGhvZC5cbiAqIEBwYXJhbSB7Ym9vbGVhbnx1bmRlZmluZWR9IGluY2x1ZGVJbnN0YW5jZSBEZXByZWNhdGVkLiBXaGV0aGVyIHRvIGluY2x1ZGVcbiAqICAgICB0aGUgSlNQQiBpbnN0YW5jZSBmb3IgdHJhbnNpdGlvbmFsIHNveSBwcm90byBzdXBwb3J0OlxuICogICAgIGh0dHA6Ly9nb3RvL3NveS1wYXJhbS1taWdyYXRpb25cbiAqIEBwYXJhbSB7IXByb3RvLm1vZGVscy5wcm90by5jb2ZkLmFwaS5Ta2lsbFNwZWNpYWxpemF0aW9uc1VwZGF0ZX0gbXNnIFRoZSBtc2cgaW5zdGFuY2UgdG8gdHJhbnNmb3JtLlxuICogQHJldHVybiB7IU9iamVjdH1cbiAqIEBzdXBwcmVzcyB7dW51c2VkTG9jYWxWYXJpYWJsZXN9IGYgaXMgb25seSB1c2VkIGZvciBuZXN0ZWQgbWVzc2FnZXNcbiAqL1xucHJvdG8ubW9kZWxzLnByb3RvLmNvZmQuYXBpLlNraWxsU3BlY2lhbGl6YXRpb25zVXBkYXRlLnRvT2JqZWN0ID0gZnVuY3Rpb24oaW5jbHVkZUluc3RhbmNlLCBtc2cpIHtcbiAgdmFyIGYsIG9iaiA9IHtcbiAgICBuYW1lOiBqc3BiLk1lc3NhZ2UuZ2V0RmllbGRXaXRoRGVmYXVsdChtc2csIDEsIFwiXCIpLFxuICAgIHNwZWNpYWxpemF0aW9uc0xpc3Q6IChmID0ganNwYi5NZXNzYWdlLmdldFJlcGVhdGVkRmllbGQobXNnLCAyKSkgPT0gbnVsbCA/IHVuZGVmaW5lZCA6IGZcbiAgfTtcblxuICBpZiAoaW5jbHVkZUluc3RhbmNlKSB7XG4gICAgb2JqLiRqc3BiTWVzc2FnZUluc3RhbmNlID0gbXNnO1xuICB9XG4gIHJldHVybiBvYmo7XG59O1xufVxuXG5cbi8qKlxuICogRGVzZXJpYWxpemVzIGJpbmFyeSBkYXRhIChpbiBwcm90b2J1ZiB3aXJlIGZvcm1hdCkuXG4gKiBAcGFyYW0ge2pzcGIuQnl0ZVNvdXJjZX0gYnl0ZXMgVGhlIGJ5dGVzIHRvIGRlc2VyaWFsaXplLlxuICogQHJldHVybiB7IXByb3RvLm1vZGVscy5wcm90by5jb2ZkLmFwaS5Ta2lsbFNwZWNpYWxpemF0aW9uc1VwZGF0ZX1cbiAqL1xucHJvdG8ubW9kZWxzLnByb3RvLmNvZmQuYXBpLlNraWxsU3BlY2lhbGl6YXRpb25zVXBkYXRlLmRlc2VyaWFsaXplQmluYXJ5ID0gZnVuY3Rpb24oYnl0ZXMpIHtcbiAgdmFyIHJlYWRlciA9IG5ldyBqc3BiLkJpbmFyeVJlYWRlcihieXRlcyk7XG4gIHZhciBtc2cgPSBuZXcgcHJvdG8ubW9kZWxzLnByb3RvLmNvZmQuYXBpLlNraWxsU3BlY2lhbGl6YXRpb25zVXBkYXRlO1xuICByZXR1cm4gcHJvdG8ubW9kZWxzLnByb3RvLmNvZmQuYXBpLlNraWxsU3BlY2lhbGl6YXRpb25zVXBkYXRlLmRlc2VyaWFsaXplQmluYXJ5RnJvbVJlYWRlcihtc2csIHJlYWRlcik7XG59O1xuXG5cbi8qKlxuICogRGVzZXJpYWxpemVzIGJpbmFyeSBkYXRhIChpbiBwcm90b2J1ZiB3aXJlIGZvcm1hdCkgZnJvbSB0aGVcbiAqIGdpdmVuIHJlYWRlciBpbnRvIHRoZSBnaXZlbiBtZXNzYWdlIG9iamVjdC5cbiAqIEBwYXJhbSB7IXByb3RvLm1vZGVscy5wcm90by5jb2ZkLmFwaS5Ta2lsbFNwZWNpYWxpemF0aW9uc1VwZGF0ZX0gbXNnIFRoZSBtZXNzYWdlIG9iamVjdCB0byBkZXNlcmlhbGl6ZSBpbnRvLlxuICogQHBhcmFtIHshanNwYi5CaW5hcnlSZWFkZXJ9IHJlYWRlciBUaGUgQmluYXJ5UmVhZGVyIHRvIHVzZS5cbiAqIEByZXR1cm4geyFwcm90by5tb2RlbHMucHJvdG8uY29mZC5hcGkuU2tpbGxTcGVjaWFsaXphdGlvbnNVcGRhdGV9XG4gKi9cbnByb3RvLm1vZGVscy5wcm90by5jb2ZkLmFwaS5Ta2lsbFNwZWNpYWxpemF0aW9uc1VwZGF0ZS5kZXNlcmlhbGl6ZUJpbmFyeUZyb21SZWFkZXIgPSBmdW5jdGlvbihtc2csIHJlYWRlcikge1xuICB3aGlsZSAocmVhZGVyLm5leHRGaWVsZCgpKSB7XG4gICAgaWYgKHJlYWRlci5pc0VuZEdyb3VwKCkpIHtcbiAgICAgIGJyZWFrO1xuICAgIH1cbiAgICB2YXIgZmllbGQgPSByZWFkZXIuZ2V0RmllbGROdW1iZXIoKTtcbiAgICBzd2l0Y2ggKGZpZWxkKSB7XG4gICAgY2FzZSAxOlxuICAgICAgdmFyIHZhbHVlID0gLyoqIEB0eXBlIHtzdHJpbmd9ICovIChyZWFkZXIucmVhZFN0cmluZygpKTtcbiAgICAgIG1zZy5zZXROYW1lKHZhbHVlKTtcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgMjpcbiAgICAgIHZhciB2YWx1ZSA9IC8qKiBAdHlwZSB7c3RyaW5nfSAqLyAocmVhZGVyLnJlYWRTdHJpbmcoKSk7XG4gICAgICBtc2cuYWRkU3BlY2lhbGl6YXRpb25zKHZhbHVlKTtcbiAgICAgIGJyZWFrO1xuICAgIGRlZmF1bHQ6XG4gICAgICByZWFkZXIuc2tpcEZpZWxkKCk7XG4gICAgICBicmVhaztcbiAgICB9XG4gIH1cbiAgcmV0dXJuIG1zZztcbn07XG5cblxuLyoqXG4gKiBTZXJpYWxpemVzIHRoZSBtZXNzYWdlIHRvIGJpbmFyeSBkYXRhIChpbiBwcm90b2J1ZiB3aXJlIGZvcm1hdCkuXG4gKiBAcmV0dXJuIHshVWludDhBcnJheX1cbiAqL1xucHJvdG8ubW9kZWxzLnByb3RvLmNvZmQuYXBpLlNraWxsU3BlY2lhbGl6YXRpb25zVXBkYXRlLnByb3RvdHlwZS5zZXJpYWxpemVCaW5hcnkgPSBmdW5jdGlvbigpIHtcbiAgdmFyIHdyaXRlciA9IG5ldyBqc3BiLkJpbmFyeVdyaXRlcigpO1xuICBwcm90by5tb2RlbHMucHJvdG8uY29mZC5hcGkuU2tpbGxTcGVjaWFsaXphdGlvbnNVcGRhdGUuc2VyaWFsaXplQmluYXJ5VG9Xcml0ZXIodGhpcywgd3JpdGVyKTtcbiAgcmV0dXJuIHdyaXRlci5nZXRSZXN1bHRCdWZmZXIoKTtcbn07XG5cblxuLyoqXG4gKiBTZXJpYWxpemVzIHRoZSBnaXZlbiBtZXNzYWdlIHRvIGJpbmFyeSBkYXRhIChpbiBwcm90b2J1ZiB3aXJlXG4gKiBmb3JtYXQpLCB3cml0aW5nIHRvIHRoZSBnaXZlbiBCaW5hcnlXcml0ZXIuXG4gKiBAcGFyYW0geyFwcm90by5tb2RlbHMucHJvdG8uY29mZC5hcGkuU2tpbGxTcGVjaWFsaXphdGlvbnNVcGRhdGV9IG1lc3NhZ2VcbiAqIEBwYXJhbSB7IWpzcGIuQmluYXJ5V3JpdGVyfSB3cml0ZXJcbiAqIEBzdXBwcmVzcyB7dW51c2VkTG9jYWxWYXJpYWJsZXN9IGYgaXMgb25seSB1c2VkIGZvciBuZXN0ZWQgbWVzc2FnZXNcbiAqL1xucHJvdG8ubW9kZWxzLnByb3RvLmNvZmQuYXBpLlNraWxsU3BlY2lhbGl6YXRpb25zVXBkYXRlLnNlcmlhbGl6ZUJpbmFyeVRvV3JpdGVyID0gZnVuY3Rpb24obWVzc2FnZSwgd3JpdGVyKSB7XG4gIHZhciBmID0gdW5kZWZpbmVkO1xuICBmID0gbWVzc2FnZS5nZXROYW1lKCk7XG4gIGlmIChmLmxlbmd0aCA+IDApIHtcbiAgICB3cml0ZXIud3JpdGVTdHJpbmcoXG4gICAgICAxLFxuICAgICAgZlxuICAgICk7XG4gIH1cbiAgZiA9IG1lc3NhZ2UuZ2V0U3BlY2lhbGl6YXRpb25zTGlzdCgpO1xuICBpZiAoZi5sZW5ndGggPiAwKSB7XG4gICAgd3JpdGVyLndyaXRlUmVwZWF0ZWRTdHJpbmcoXG4gICAgICAyLFxuICAgICAgZlxuICAgICk7XG4gIH1cbn07XG5cblxuLyoqXG4gKiBvcHRpb25hbCBzdHJpbmcgbmFtZSA9IDE7XG4gKiBAcmV0dXJuIHtzdHJpbmd9XG4gKi9cbnByb3RvLm1vZGVscy5wcm90by5jb2ZkLmFwaS5Ta2lsbFNwZWNpYWxpemF0aW9uc1VwZGF0ZS5wcm90b3R5cGUuZ2V0TmFtZSA9IGZ1bmN0aW9uKCkge1xuICByZXR1cm4gLyoqIEB0eXBlIHtzdHJpbmd9ICovIChqc3BiLk1lc3NhZ2UuZ2V0RmllbGRXaXRoRGVmYXVsdCh0aGlzLCAxLCBcIlwiKSk7XG59O1xuXG5cbi8qKlxuICogQHBhcmFtIHtzdHJpbmd9IHZhbHVlXG4gKiBAcmV0dXJuIHshcHJvdG8ubW9kZWxzLnByb3RvLmNvZmQuYXBpLlNraWxsU3BlY2lhbGl6YXRpb25zVXBkYXRlfSByZXR1cm5zIHRoaXNcbiAqL1xucHJvdG8ubW9kZWxzLnByb3RvLmNvZmQuYXBpLlNraWxsU3BlY2lhbGl6YXRpb25zVXBkYXRlLnByb3RvdHlwZS5zZXROYW1lID0gZnVuY3Rpb24odmFsdWUpIHtcbiAgcmV0dXJuIGpzcGIuTWVzc2FnZS5zZXRQcm90bzNTdHJpbmdGaWVsZCh0aGlzLCAxLCB2YWx1ZSk7XG59O1xuXG5cbi8qKlxuICogcmVwZWF0ZWQgc3RyaW5nIHNwZWNpYWxpemF0aW9ucyA9IDI7XG4gKiBAcmV0dXJuIHshQXJyYXk8c3RyaW5nPn1cbiAqL1xucHJvdG8ubW9kZWxzLnByb3RvLmNvZmQuYXBpLlNraWxsU3BlY2lhbGl6YXRpb25zVXBkYXRlLnByb3RvdHlwZS5nZXRTcGVjaWFsaXphdGlvbnNMaXN0ID0gZnVuY3Rpb24oKSB7XG4gIHJldHVybiAvKiogQHR5cGUgeyFBcnJheTxzdHJpbmc+fSAqLyAoanNwYi5NZXNzYWdlLmdldFJlcGVhdGVkRmllbGQodGhpcywgMikpO1xufTtcblxuXG4vKipcbiAqIEBwYXJhbSB7IUFycmF5PHN0cmluZz59IHZhbHVlXG4gKiBAcmV0dXJuIHshcHJvdG8ubW9kZWxzLnByb3RvLmNvZmQuYXBpLlNraWxsU3BlY2lhbGl6YXRpb25zVXBkYXRlfSByZXR1cm5zIHRoaXNcbiAqL1xucHJvdG8ubW9kZWxzLnByb3RvLmNvZmQuYXBpLlNraWxsU3BlY2lhbGl6YXRpb25zVXBkYXRlLnByb3RvdHlwZS5zZXRTcGVjaWFsaXphdGlvbnNMaXN0ID0gZnVuY3Rpb24odmFsdWUpIHtcbiAgcmV0dXJuIGpzcGIuTWVzc2FnZS5zZXRGaWVsZCh0aGlzLCAyLCB2YWx1ZSB8fCBbXSk7XG59O1xuXG5cbi8qKlxuICogQHBhcmFtIHtzdHJpbmd9IHZhbHVlXG4gKiBAcGFyYW0ge251bWJlcj19IG9wdF9pbmRleFxuICogQHJldHVybiB7IXByb3RvLm1vZGVscy5wcm90by5jb2ZkLmFwaS5Ta2lsbFNwZWNpYWxpemF0aW9uc1VwZGF0ZX0gcmV0dXJucyB0aGlzXG4gKi9cbnByb3RvLm1vZGVscy5wcm90by5jb2ZkLmFwaS5Ta2lsbFNwZWNpYWxpemF0aW9uc1VwZGF0ZS5wcm90b3R5cGUuYWRkU3BlY2lhbGl6YXRpb25zID0gZnVuY3Rpb24odmFsdWUsIG9wdF9pbmRleCkge1xuICByZXR1cm4ganNwYi5NZXNzYWdlLmFkZFRvUmVwZWF0ZWRGaWVsZCh0aGlzLCAyLCB2YWx1ZSwgb3B0X2luZGV4KTtcbn07XG5cblxuLyoqXG4gKiBDbGVhcnMgdGhlIGxpc3QgbWFraW5nIGl0IGVtcHR5IGJ1dCBub24tbnVsbC5cbiAqIEByZXR1cm4geyFwcm90by5tb2RlbHMucHJvdG8uY29mZC5hcGkuU2tpbGxTcGVjaWFsaXphdGlvbnNVcGRhdGV9IHJldHVybnMgdGhpc1xuICovXG5wcm90by5tb2RlbHMucHJvdG8uY29mZC5hcGkuU2tpbGxTcGVjaWFsaXphdGlvbnNVcGRhdGUucHJvdG90eXBlLmNsZWFyU3BlY2lhbGl6YXRpb25zTGlzdCA9IGZ1bmN0aW9uKCkge1xuICByZXR1cm4gdGhpcy5zZXRTcGVjaWFsaXphdGlvbnNMaXN0KFtdKTtcbn07XG5cblxuXG5cblxuaWYgKGpzcGIuTWVzc2FnZS5HRU5FUkFURV9UT19PQkpFQ1QpIHtcbi8qKlxuICogQ3JlYXRlcyBhbiBvYmplY3QgcmVwcmVzZW50YXRpb24gb2YgdGhpcyBwcm90by5cbiAqIEZpZWxkIG5hbWVzIHRoYXQgYXJlIHJlc2VydmVkIGluIEphdmFTY3JpcHQgYW5kIHdpbGwgYmUgcmVuYW1lZCB0byBwYl9uYW1lLlxuICogT3B0aW9uYWwgZmllbGRzIHRoYXQgYXJlIG5vdCBzZXQgd2lsbCBiZSBzZXQgdG8gdW5kZWZpbmVkLlxuICogVG8gYWNjZXNzIGEgcmVzZXJ2ZWQgZmllbGQgdXNlLCBmb28ucGJfPG5hbWU+LCBlZywgZm9vLnBiX2RlZmF1bHQuXG4gKiBGb3IgdGhlIGxpc3Qgb2YgcmVzZXJ2ZWQgbmFtZXMgcGxlYXNlIHNlZTpcbiAqICAgICBuZXQvcHJvdG8yL2NvbXBpbGVyL2pzL2ludGVybmFsL2dlbmVyYXRvci5jYyNrS2V5d29yZC5cbiAqIEBwYXJhbSB7Ym9vbGVhbj19IG9wdF9pbmNsdWRlSW5zdGFuY2UgRGVwcmVjYXRlZC4gd2hldGhlciB0byBpbmNsdWRlIHRoZVxuICogICAgIEpTUEIgaW5zdGFuY2UgZm9yIHRyYW5zaXRpb25hbCBzb3kgcHJvdG8gc3VwcG9ydDpcbiAqICAgICBodHRwOi8vZ290by9zb3ktcGFyYW0tbWlncmF0aW9uXG4gKiBAcmV0dXJuIHshT2JqZWN0fVxuICovXG5wcm90by5tb2RlbHMucHJvdG8uY29mZC5hcGkuQ29uZGl0aW9uLnByb3RvdHlwZS50b09iamVjdCA9IGZ1bmN0aW9uKG9wdF9pbmNsdWRlSW5zdGFuY2UpIHtcbiAgcmV0dXJuIHByb3RvLm1vZGVscy5wcm90by5jb2ZkLmFwaS5Db25kaXRpb24udG9PYmplY3Qob3B0X2luY2x1ZGVJbnN0YW5jZSwgdGhpcyk7XG59O1xuXG5cbi8qKlxuICogU3RhdGljIHZlcnNpb24gb2YgdGhlIHtAc2VlIHRvT2JqZWN0fSBtZXRob2QuXG4gKiBAcGFyYW0ge2Jvb2xlYW58dW5kZWZpbmVkfSBpbmNsdWRlSW5zdGFuY2UgRGVwcmVjYXRlZC4gV2hldGhlciB0byBpbmNsdWRlXG4gKiAgICAgdGhlIEpTUEIgaW5zdGFuY2UgZm9yIHRyYW5zaXRpb25hbCBzb3kgcHJvdG8gc3VwcG9ydDpcbiAqICAgICBodHRwOi8vZ290by9zb3ktcGFyYW0tbWlncmF0aW9uXG4gKiBAcGFyYW0geyFwcm90by5tb2RlbHMucHJvdG8uY29mZC5hcGkuQ29uZGl0aW9ufSBtc2cgVGhlIG1zZyBpbnN0YW5jZSB0byB0cmFuc2Zvcm0uXG4gKiBAcmV0dXJuIHshT2JqZWN0fVxuICogQHN1cHByZXNzIHt1bnVzZWRMb2NhbFZhcmlhYmxlc30gZiBpcyBvbmx5IHVzZWQgZm9yIG5lc3RlZCBtZXNzYWdlc1xuICovXG5wcm90by5tb2RlbHMucHJvdG8uY29mZC5hcGkuQ29uZGl0aW9uLnRvT2JqZWN0ID0gZnVuY3Rpb24oaW5jbHVkZUluc3RhbmNlLCBtc2cpIHtcbiAgdmFyIGYsIG9iaiA9IHtcbiAgICBuYW1lOiBqc3BiLk1lc3NhZ2UuZ2V0RmllbGRXaXRoRGVmYXVsdChtc2csIDEsIFwiXCIpXG4gIH07XG5cbiAgaWYgKGluY2x1ZGVJbnN0YW5jZSkge1xuICAgIG9iai4kanNwYk1lc3NhZ2VJbnN0YW5jZSA9IG1zZztcbiAgfVxuICByZXR1cm4gb2JqO1xufTtcbn1cblxuXG4vKipcbiAqIERlc2VyaWFsaXplcyBiaW5hcnkgZGF0YSAoaW4gcHJvdG9idWYgd2lyZSBmb3JtYXQpLlxuICogQHBhcmFtIHtqc3BiLkJ5dGVTb3VyY2V9IGJ5dGVzIFRoZSBieXRlcyB0byBkZXNlcmlhbGl6ZS5cbiAqIEByZXR1cm4geyFwcm90by5tb2RlbHMucHJvdG8uY29mZC5hcGkuQ29uZGl0aW9ufVxuICovXG5wcm90by5tb2RlbHMucHJvdG8uY29mZC5hcGkuQ29uZGl0aW9uLmRlc2VyaWFsaXplQmluYXJ5ID0gZnVuY3Rpb24oYnl0ZXMpIHtcbiAgdmFyIHJlYWRlciA9IG5ldyBqc3BiLkJpbmFyeVJlYWRlcihieXRlcyk7XG4gIHZhciBtc2cgPSBuZXcgcHJvdG8ubW9kZWxzLnByb3RvLmNvZmQuYXBpLkNvbmRpdGlvbjtcbiAgcmV0dXJuIHByb3RvLm1vZGVscy5wcm90by5jb2ZkLmFwaS5Db25kaXRpb24uZGVzZXJpYWxpemVCaW5hcnlGcm9tUmVhZGVyKG1zZywgcmVhZGVyKTtcbn07XG5cblxuLyoqXG4gKiBEZXNlcmlhbGl6ZXMgYmluYXJ5IGRhdGEgKGluIHByb3RvYnVmIHdpcmUgZm9ybWF0KSBmcm9tIHRoZVxuICogZ2l2ZW4gcmVhZGVyIGludG8gdGhlIGdpdmVuIG1lc3NhZ2Ugb2JqZWN0LlxuICogQHBhcmFtIHshcHJvdG8ubW9kZWxzLnByb3RvLmNvZmQuYXBpLkNvbmRpdGlvbn0gbXNnIFRoZSBtZXNzYWdlIG9iamVjdCB0byBkZXNlcmlhbGl6ZSBpbnRvLlxuICogQHBhcmFtIHshanNwYi5CaW5hcnlSZWFkZXJ9IHJlYWRlciBUaGUgQmluYXJ5UmVhZGVyIHRvIHVzZS5cbiAqIEByZXR1cm4geyFwcm90by5tb2RlbHMucHJvdG8uY29mZC5hcGkuQ29uZGl0aW9ufVxuICovXG5wcm90by5tb2RlbHMucHJvdG8uY29mZC5hcGkuQ29uZGl0aW9uLmRlc2VyaWFsaXplQmluYXJ5RnJvbVJlYWRlciA9IGZ1bmN0aW9uKG1zZywgcmVhZGVyKSB7XG4gIHdoaWxlIChyZWFkZXIubmV4dEZpZWxkKCkpIHtcbiAgICBpZiAocmVhZGVyLmlzRW5kR3JvdXAoKSkge1xuICAgICAgYnJlYWs7XG4gICAgfVxuICAgIHZhciBmaWVsZCA9IHJlYWRlci5nZXRGaWVsZE51bWJlcigpO1xuICAgIHN3aXRjaCAoZmllbGQpIHtcbiAgICBjYXNlIDE6XG4gICAgICB2YXIgdmFsdWUgPSAvKiogQHR5cGUge3N0cmluZ30gKi8gKHJlYWRlci5yZWFkU3RyaW5nKCkpO1xuICAgICAgbXNnLnNldE5hbWUodmFsdWUpO1xuICAgICAgYnJlYWs7XG4gICAgZGVmYXVsdDpcbiAgICAgIHJlYWRlci5za2lwRmllbGQoKTtcbiAgICAgIGJyZWFrO1xuICAgIH1cbiAgfVxuICByZXR1cm4gbXNnO1xufTtcblxuXG4vKipcbiAqIFNlcmlhbGl6ZXMgdGhlIG1lc3NhZ2UgdG8gYmluYXJ5IGRhdGEgKGluIHByb3RvYnVmIHdpcmUgZm9ybWF0KS5cbiAqIEByZXR1cm4geyFVaW50OEFycmF5fVxuICovXG5wcm90by5tb2RlbHMucHJvdG8uY29mZC5hcGkuQ29uZGl0aW9uLnByb3RvdHlwZS5zZXJpYWxpemVCaW5hcnkgPSBmdW5jdGlvbigpIHtcbiAgdmFyIHdyaXRlciA9IG5ldyBqc3BiLkJpbmFyeVdyaXRlcigpO1xuICBwcm90by5tb2RlbHMucHJvdG8uY29mZC5hcGkuQ29uZGl0aW9uLnNlcmlhbGl6ZUJpbmFyeVRvV3JpdGVyKHRoaXMsIHdyaXRlcik7XG4gIHJldHVybiB3cml0ZXIuZ2V0UmVzdWx0QnVmZmVyKCk7XG59O1xuXG5cbi8qKlxuICogU2VyaWFsaXplcyB0aGUgZ2l2ZW4gbWVzc2FnZSB0byBiaW5hcnkgZGF0YSAoaW4gcHJvdG9idWYgd2lyZVxuICogZm9ybWF0KSwgd3JpdGluZyB0byB0aGUgZ2l2ZW4gQmluYXJ5V3JpdGVyLlxuICogQHBhcmFtIHshcHJvdG8ubW9kZWxzLnByb3RvLmNvZmQuYXBpLkNvbmRpdGlvbn0gbWVzc2FnZVxuICogQHBhcmFtIHshanNwYi5CaW5hcnlXcml0ZXJ9IHdyaXRlclxuICogQHN1cHByZXNzIHt1bnVzZWRMb2NhbFZhcmlhYmxlc30gZiBpcyBvbmx5IHVzZWQgZm9yIG5lc3RlZCBtZXNzYWdlc1xuICovXG5wcm90by5tb2RlbHMucHJvdG8uY29mZC5hcGkuQ29uZGl0aW9uLnNlcmlhbGl6ZUJpbmFyeVRvV3JpdGVyID0gZnVuY3Rpb24obWVzc2FnZSwgd3JpdGVyKSB7XG4gIHZhciBmID0gdW5kZWZpbmVkO1xuICBmID0gbWVzc2FnZS5nZXROYW1lKCk7XG4gIGlmIChmLmxlbmd0aCA+IDApIHtcbiAgICB3cml0ZXIud3JpdGVTdHJpbmcoXG4gICAgICAxLFxuICAgICAgZlxuICAgICk7XG4gIH1cbn07XG5cblxuLyoqXG4gKiBvcHRpb25hbCBzdHJpbmcgbmFtZSA9IDE7XG4gKiBAcmV0dXJuIHtzdHJpbmd9XG4gKi9cbnByb3RvLm1vZGVscy5wcm90by5jb2ZkLmFwaS5Db25kaXRpb24ucHJvdG90eXBlLmdldE5hbWUgPSBmdW5jdGlvbigpIHtcbiAgcmV0dXJuIC8qKiBAdHlwZSB7c3RyaW5nfSAqLyAoanNwYi5NZXNzYWdlLmdldEZpZWxkV2l0aERlZmF1bHQodGhpcywgMSwgXCJcIikpO1xufTtcblxuXG4vKipcbiAqIEBwYXJhbSB7c3RyaW5nfSB2YWx1ZVxuICogQHJldHVybiB7IXByb3RvLm1vZGVscy5wcm90by5jb2ZkLmFwaS5Db25kaXRpb259IHJldHVybnMgdGhpc1xuICovXG5wcm90by5tb2RlbHMucHJvdG8uY29mZC5hcGkuQ29uZGl0aW9uLnByb3RvdHlwZS5zZXROYW1lID0gZnVuY3Rpb24odmFsdWUpIHtcbiAgcmV0dXJuIGpzcGIuTWVzc2FnZS5zZXRQcm90bzNTdHJpbmdGaWVsZCh0aGlzLCAxLCB2YWx1ZSk7XG59O1xuXG5cbmdvb2cub2JqZWN0LmV4dGVuZChleHBvcnRzLCBwcm90by5tb2RlbHMucHJvdG8uY29mZC5hcGkpO1xuIiwiLy8gc291cmNlOiBjb2ZkLnByb3RvXG4vKipcbiAqIEBmaWxlb3ZlcnZpZXdcbiAqIEBlbmhhbmNlYWJsZVxuICogQHN1cHByZXNzIHttZXNzYWdlQ29udmVudGlvbnN9IEpTIENvbXBpbGVyIHJlcG9ydHMgYW4gZXJyb3IgaWYgYSB2YXJpYWJsZSBvclxuICogICAgIGZpZWxkIHN0YXJ0cyB3aXRoICdNU0dfJyBhbmQgaXNuJ3QgYSB0cmFuc2xhdGFibGUgbWVzc2FnZS5cbiAqIEBwdWJsaWNcbiAqL1xuLy8gR0VORVJBVEVEIENPREUgLS0gRE8gTk9UIEVESVQhXG4vKiBlc2xpbnQtZGlzYWJsZSAqL1xuLy8gQHRzLW5vY2hlY2tcblxudmFyIGpzcGIgPSByZXF1aXJlKCdnb29nbGUtcHJvdG9idWYnKTtcbnZhciBnb29nID0ganNwYjtcbnZhciBnbG9iYWwgPSBGdW5jdGlvbigncmV0dXJuIHRoaXMnKSgpO1xuXG5nb29nLmV4cG9ydFN5bWJvbCgncHJvdG8ubW9kZWxzLnByb3RvLmNvZmQuQ2hhbmdlbGluZ0ZpZWxkcycsIG51bGwsIGdsb2JhbCk7XG5nb29nLmV4cG9ydFN5bWJvbCgncHJvdG8ubW9kZWxzLnByb3RvLmNvZmQuQ29mZFNoZWV0JywgbnVsbCwgZ2xvYmFsKTtcbmdvb2cuZXhwb3J0U3ltYm9sKCdwcm90by5tb2RlbHMucHJvdG8uY29mZC5Db2ZkU2hlZXQuQXR0YWNrJywgbnVsbCwgZ2xvYmFsKTtcbmdvb2cuZXhwb3J0U3ltYm9sKCdwcm90by5tb2RlbHMucHJvdG8uY29mZC5Db2ZkU2hlZXQuQ29uZGl0aW9uJywgbnVsbCwgZ2xvYmFsKTtcbmdvb2cuZXhwb3J0U3ltYm9sKCdwcm90by5tb2RlbHMucHJvdG8uY29mZC5Db2ZkU2hlZXQuSXRlbScsIG51bGwsIGdsb2JhbCk7XG5nb29nLmV4cG9ydFN5bWJvbCgncHJvdG8ubW9kZWxzLnByb3RvLmNvZmQuQ29mZFNoZWV0Lk1lcml0JywgbnVsbCwgZ2xvYmFsKTtcbmdvb2cuZXhwb3J0U3ltYm9sKCdwcm90by5tb2RlbHMucHJvdG8uY29mZC5Db2ZkU2hlZXQuU2tpbGwnLCBudWxsLCBnbG9iYWwpO1xuZ29vZy5leHBvcnRTeW1ib2woJ3Byb3RvLm1vZGVscy5wcm90by5jb2ZkLkNvZmRTaGVldC5TeXN0ZW1GaWVsZHNDYXNlJywgbnVsbCwgZ2xvYmFsKTtcbmdvb2cuZXhwb3J0U3ltYm9sKCdwcm90by5tb2RlbHMucHJvdG8uY29mZC5Db3JlRmllbGRzJywgbnVsbCwgZ2xvYmFsKTtcbmdvb2cuZXhwb3J0U3ltYm9sKCdwcm90by5tb2RlbHMucHJvdG8uY29mZC5NYWdlRmllbGRzJywgbnVsbCwgZ2xvYmFsKTtcbi8qKlxuICogR2VuZXJhdGVkIGJ5IEpzUGJDb2RlR2VuZXJhdG9yLlxuICogQHBhcmFtIHtBcnJheT19IG9wdF9kYXRhIE9wdGlvbmFsIGluaXRpYWwgZGF0YSBhcnJheSwgdHlwaWNhbGx5IGZyb20gYVxuICogc2VydmVyIHJlc3BvbnNlLCBvciBjb25zdHJ1Y3RlZCBkaXJlY3RseSBpbiBKYXZhc2NyaXB0LiBUaGUgYXJyYXkgaXMgdXNlZFxuICogaW4gcGxhY2UgYW5kIGJlY29tZXMgcGFydCBvZiB0aGUgY29uc3RydWN0ZWQgb2JqZWN0LiBJdCBpcyBub3QgY2xvbmVkLlxuICogSWYgbm8gZGF0YSBpcyBwcm92aWRlZCwgdGhlIGNvbnN0cnVjdGVkIG9iamVjdCB3aWxsIGJlIGVtcHR5LCBidXQgc3RpbGxcbiAqIHZhbGlkLlxuICogQGV4dGVuZHMge2pzcGIuTWVzc2FnZX1cbiAqIEBjb25zdHJ1Y3RvclxuICovXG5wcm90by5tb2RlbHMucHJvdG8uY29mZC5Db3JlRmllbGRzID0gZnVuY3Rpb24ob3B0X2RhdGEpIHtcbiAganNwYi5NZXNzYWdlLmluaXRpYWxpemUodGhpcywgb3B0X2RhdGEsIDAsIC0xLCBudWxsLCBudWxsKTtcbn07XG5nb29nLmluaGVyaXRzKHByb3RvLm1vZGVscy5wcm90by5jb2ZkLkNvcmVGaWVsZHMsIGpzcGIuTWVzc2FnZSk7XG5pZiAoZ29vZy5ERUJVRyAmJiAhQ09NUElMRUQpIHtcbiAgLyoqXG4gICAqIEBwdWJsaWNcbiAgICogQG92ZXJyaWRlXG4gICAqL1xuICBwcm90by5tb2RlbHMucHJvdG8uY29mZC5Db3JlRmllbGRzLmRpc3BsYXlOYW1lID0gJ3Byb3RvLm1vZGVscy5wcm90by5jb2ZkLkNvcmVGaWVsZHMnO1xufVxuLyoqXG4gKiBHZW5lcmF0ZWQgYnkgSnNQYkNvZGVHZW5lcmF0b3IuXG4gKiBAcGFyYW0ge0FycmF5PX0gb3B0X2RhdGEgT3B0aW9uYWwgaW5pdGlhbCBkYXRhIGFycmF5LCB0eXBpY2FsbHkgZnJvbSBhXG4gKiBzZXJ2ZXIgcmVzcG9uc2UsIG9yIGNvbnN0cnVjdGVkIGRpcmVjdGx5IGluIEphdmFzY3JpcHQuIFRoZSBhcnJheSBpcyB1c2VkXG4gKiBpbiBwbGFjZSBhbmQgYmVjb21lcyBwYXJ0IG9mIHRoZSBjb25zdHJ1Y3RlZCBvYmplY3QuIEl0IGlzIG5vdCBjbG9uZWQuXG4gKiBJZiBubyBkYXRhIGlzIHByb3ZpZGVkLCB0aGUgY29uc3RydWN0ZWQgb2JqZWN0IHdpbGwgYmUgZW1wdHksIGJ1dCBzdGlsbFxuICogdmFsaWQuXG4gKiBAZXh0ZW5kcyB7anNwYi5NZXNzYWdlfVxuICogQGNvbnN0cnVjdG9yXG4gKi9cbnByb3RvLm1vZGVscy5wcm90by5jb2ZkLk1hZ2VGaWVsZHMgPSBmdW5jdGlvbihvcHRfZGF0YSkge1xuICBqc3BiLk1lc3NhZ2UuaW5pdGlhbGl6ZSh0aGlzLCBvcHRfZGF0YSwgMCwgLTEsIG51bGwsIG51bGwpO1xufTtcbmdvb2cuaW5oZXJpdHMocHJvdG8ubW9kZWxzLnByb3RvLmNvZmQuTWFnZUZpZWxkcywganNwYi5NZXNzYWdlKTtcbmlmIChnb29nLkRFQlVHICYmICFDT01QSUxFRCkge1xuICAvKipcbiAgICogQHB1YmxpY1xuICAgKiBAb3ZlcnJpZGVcbiAgICovXG4gIHByb3RvLm1vZGVscy5wcm90by5jb2ZkLk1hZ2VGaWVsZHMuZGlzcGxheU5hbWUgPSAncHJvdG8ubW9kZWxzLnByb3RvLmNvZmQuTWFnZUZpZWxkcyc7XG59XG4vKipcbiAqIEdlbmVyYXRlZCBieSBKc1BiQ29kZUdlbmVyYXRvci5cbiAqIEBwYXJhbSB7QXJyYXk9fSBvcHRfZGF0YSBPcHRpb25hbCBpbml0aWFsIGRhdGEgYXJyYXksIHR5cGljYWxseSBmcm9tIGFcbiAqIHNlcnZlciByZXNwb25zZSwgb3IgY29uc3RydWN0ZWQgZGlyZWN0bHkgaW4gSmF2YXNjcmlwdC4gVGhlIGFycmF5IGlzIHVzZWRcbiAqIGluIHBsYWNlIGFuZCBiZWNvbWVzIHBhcnQgb2YgdGhlIGNvbnN0cnVjdGVkIG9iamVjdC4gSXQgaXMgbm90IGNsb25lZC5cbiAqIElmIG5vIGRhdGEgaXMgcHJvdmlkZWQsIHRoZSBjb25zdHJ1Y3RlZCBvYmplY3Qgd2lsbCBiZSBlbXB0eSwgYnV0IHN0aWxsXG4gKiB2YWxpZC5cbiAqIEBleHRlbmRzIHtqc3BiLk1lc3NhZ2V9XG4gKiBAY29uc3RydWN0b3JcbiAqL1xucHJvdG8ubW9kZWxzLnByb3RvLmNvZmQuQ2hhbmdlbGluZ0ZpZWxkcyA9IGZ1bmN0aW9uKG9wdF9kYXRhKSB7XG4gIGpzcGIuTWVzc2FnZS5pbml0aWFsaXplKHRoaXMsIG9wdF9kYXRhLCAwLCAtMSwgbnVsbCwgbnVsbCk7XG59O1xuZ29vZy5pbmhlcml0cyhwcm90by5tb2RlbHMucHJvdG8uY29mZC5DaGFuZ2VsaW5nRmllbGRzLCBqc3BiLk1lc3NhZ2UpO1xuaWYgKGdvb2cuREVCVUcgJiYgIUNPTVBJTEVEKSB7XG4gIC8qKlxuICAgKiBAcHVibGljXG4gICAqIEBvdmVycmlkZVxuICAgKi9cbiAgcHJvdG8ubW9kZWxzLnByb3RvLmNvZmQuQ2hhbmdlbGluZ0ZpZWxkcy5kaXNwbGF5TmFtZSA9ICdwcm90by5tb2RlbHMucHJvdG8uY29mZC5DaGFuZ2VsaW5nRmllbGRzJztcbn1cbi8qKlxuICogR2VuZXJhdGVkIGJ5IEpzUGJDb2RlR2VuZXJhdG9yLlxuICogQHBhcmFtIHtBcnJheT19IG9wdF9kYXRhIE9wdGlvbmFsIGluaXRpYWwgZGF0YSBhcnJheSwgdHlwaWNhbGx5IGZyb20gYVxuICogc2VydmVyIHJlc3BvbnNlLCBvciBjb25zdHJ1Y3RlZCBkaXJlY3RseSBpbiBKYXZhc2NyaXB0LiBUaGUgYXJyYXkgaXMgdXNlZFxuICogaW4gcGxhY2UgYW5kIGJlY29tZXMgcGFydCBvZiB0aGUgY29uc3RydWN0ZWQgb2JqZWN0LiBJdCBpcyBub3QgY2xvbmVkLlxuICogSWYgbm8gZGF0YSBpcyBwcm92aWRlZCwgdGhlIGNvbnN0cnVjdGVkIG9iamVjdCB3aWxsIGJlIGVtcHR5LCBidXQgc3RpbGxcbiAqIHZhbGlkLlxuICogQGV4dGVuZHMge2pzcGIuTWVzc2FnZX1cbiAqIEBjb25zdHJ1Y3RvclxuICovXG5wcm90by5tb2RlbHMucHJvdG8uY29mZC5Db2ZkU2hlZXQgPSBmdW5jdGlvbihvcHRfZGF0YSkge1xuICBqc3BiLk1lc3NhZ2UuaW5pdGlhbGl6ZSh0aGlzLCBvcHRfZGF0YSwgMCwgLTEsIHByb3RvLm1vZGVscy5wcm90by5jb2ZkLkNvZmRTaGVldC5yZXBlYXRlZEZpZWxkc18sIHByb3RvLm1vZGVscy5wcm90by5jb2ZkLkNvZmRTaGVldC5vbmVvZkdyb3Vwc18pO1xufTtcbmdvb2cuaW5oZXJpdHMocHJvdG8ubW9kZWxzLnByb3RvLmNvZmQuQ29mZFNoZWV0LCBqc3BiLk1lc3NhZ2UpO1xuaWYgKGdvb2cuREVCVUcgJiYgIUNPTVBJTEVEKSB7XG4gIC8qKlxuICAgKiBAcHVibGljXG4gICAqIEBvdmVycmlkZVxuICAgKi9cbiAgcHJvdG8ubW9kZWxzLnByb3RvLmNvZmQuQ29mZFNoZWV0LmRpc3BsYXlOYW1lID0gJ3Byb3RvLm1vZGVscy5wcm90by5jb2ZkLkNvZmRTaGVldCc7XG59XG4vKipcbiAqIEdlbmVyYXRlZCBieSBKc1BiQ29kZUdlbmVyYXRvci5cbiAqIEBwYXJhbSB7QXJyYXk9fSBvcHRfZGF0YSBPcHRpb25hbCBpbml0aWFsIGRhdGEgYXJyYXksIHR5cGljYWxseSBmcm9tIGFcbiAqIHNlcnZlciByZXNwb25zZSwgb3IgY29uc3RydWN0ZWQgZGlyZWN0bHkgaW4gSmF2YXNjcmlwdC4gVGhlIGFycmF5IGlzIHVzZWRcbiAqIGluIHBsYWNlIGFuZCBiZWNvbWVzIHBhcnQgb2YgdGhlIGNvbnN0cnVjdGVkIG9iamVjdC4gSXQgaXMgbm90IGNsb25lZC5cbiAqIElmIG5vIGRhdGEgaXMgcHJvdmlkZWQsIHRoZSBjb25zdHJ1Y3RlZCBvYmplY3Qgd2lsbCBiZSBlbXB0eSwgYnV0IHN0aWxsXG4gKiB2YWxpZC5cbiAqIEBleHRlbmRzIHtqc3BiLk1lc3NhZ2V9XG4gKiBAY29uc3RydWN0b3JcbiAqL1xucHJvdG8ubW9kZWxzLnByb3RvLmNvZmQuQ29mZFNoZWV0Lk1lcml0ID0gZnVuY3Rpb24ob3B0X2RhdGEpIHtcbiAganNwYi5NZXNzYWdlLmluaXRpYWxpemUodGhpcywgb3B0X2RhdGEsIDAsIC0xLCBudWxsLCBudWxsKTtcbn07XG5nb29nLmluaGVyaXRzKHByb3RvLm1vZGVscy5wcm90by5jb2ZkLkNvZmRTaGVldC5NZXJpdCwganNwYi5NZXNzYWdlKTtcbmlmIChnb29nLkRFQlVHICYmICFDT01QSUxFRCkge1xuICAvKipcbiAgICogQHB1YmxpY1xuICAgKiBAb3ZlcnJpZGVcbiAgICovXG4gIHByb3RvLm1vZGVscy5wcm90by5jb2ZkLkNvZmRTaGVldC5NZXJpdC5kaXNwbGF5TmFtZSA9ICdwcm90by5tb2RlbHMucHJvdG8uY29mZC5Db2ZkU2hlZXQuTWVyaXQnO1xufVxuLyoqXG4gKiBHZW5lcmF0ZWQgYnkgSnNQYkNvZGVHZW5lcmF0b3IuXG4gKiBAcGFyYW0ge0FycmF5PX0gb3B0X2RhdGEgT3B0aW9uYWwgaW5pdGlhbCBkYXRhIGFycmF5LCB0eXBpY2FsbHkgZnJvbSBhXG4gKiBzZXJ2ZXIgcmVzcG9uc2UsIG9yIGNvbnN0cnVjdGVkIGRpcmVjdGx5IGluIEphdmFzY3JpcHQuIFRoZSBhcnJheSBpcyB1c2VkXG4gKiBpbiBwbGFjZSBhbmQgYmVjb21lcyBwYXJ0IG9mIHRoZSBjb25zdHJ1Y3RlZCBvYmplY3QuIEl0IGlzIG5vdCBjbG9uZWQuXG4gKiBJZiBubyBkYXRhIGlzIHByb3ZpZGVkLCB0aGUgY29uc3RydWN0ZWQgb2JqZWN0IHdpbGwgYmUgZW1wdHksIGJ1dCBzdGlsbFxuICogdmFsaWQuXG4gKiBAZXh0ZW5kcyB7anNwYi5NZXNzYWdlfVxuICogQGNvbnN0cnVjdG9yXG4gKi9cbnByb3RvLm1vZGVscy5wcm90by5jb2ZkLkNvZmRTaGVldC5Db25kaXRpb24gPSBmdW5jdGlvbihvcHRfZGF0YSkge1xuICBqc3BiLk1lc3NhZ2UuaW5pdGlhbGl6ZSh0aGlzLCBvcHRfZGF0YSwgMCwgLTEsIG51bGwsIG51bGwpO1xufTtcbmdvb2cuaW5oZXJpdHMocHJvdG8ubW9kZWxzLnByb3RvLmNvZmQuQ29mZFNoZWV0LkNvbmRpdGlvbiwganNwYi5NZXNzYWdlKTtcbmlmIChnb29nLkRFQlVHICYmICFDT01QSUxFRCkge1xuICAvKipcbiAgICogQHB1YmxpY1xuICAgKiBAb3ZlcnJpZGVcbiAgICovXG4gIHByb3RvLm1vZGVscy5wcm90by5jb2ZkLkNvZmRTaGVldC5Db25kaXRpb24uZGlzcGxheU5hbWUgPSAncHJvdG8ubW9kZWxzLnByb3RvLmNvZmQuQ29mZFNoZWV0LkNvbmRpdGlvbic7XG59XG4vKipcbiAqIEdlbmVyYXRlZCBieSBKc1BiQ29kZUdlbmVyYXRvci5cbiAqIEBwYXJhbSB7QXJyYXk9fSBvcHRfZGF0YSBPcHRpb25hbCBpbml0aWFsIGRhdGEgYXJyYXksIHR5cGljYWxseSBmcm9tIGFcbiAqIHNlcnZlciByZXNwb25zZSwgb3IgY29uc3RydWN0ZWQgZGlyZWN0bHkgaW4gSmF2YXNjcmlwdC4gVGhlIGFycmF5IGlzIHVzZWRcbiAqIGluIHBsYWNlIGFuZCBiZWNvbWVzIHBhcnQgb2YgdGhlIGNvbnN0cnVjdGVkIG9iamVjdC4gSXQgaXMgbm90IGNsb25lZC5cbiAqIElmIG5vIGRhdGEgaXMgcHJvdmlkZWQsIHRoZSBjb25zdHJ1Y3RlZCBvYmplY3Qgd2lsbCBiZSBlbXB0eSwgYnV0IHN0aWxsXG4gKiB2YWxpZC5cbiAqIEBleHRlbmRzIHtqc3BiLk1lc3NhZ2V9XG4gKiBAY29uc3RydWN0b3JcbiAqL1xucHJvdG8ubW9kZWxzLnByb3RvLmNvZmQuQ29mZFNoZWV0LlNraWxsID0gZnVuY3Rpb24ob3B0X2RhdGEpIHtcbiAganNwYi5NZXNzYWdlLmluaXRpYWxpemUodGhpcywgb3B0X2RhdGEsIDAsIC0xLCBwcm90by5tb2RlbHMucHJvdG8uY29mZC5Db2ZkU2hlZXQuU2tpbGwucmVwZWF0ZWRGaWVsZHNfLCBudWxsKTtcbn07XG5nb29nLmluaGVyaXRzKHByb3RvLm1vZGVscy5wcm90by5jb2ZkLkNvZmRTaGVldC5Ta2lsbCwganNwYi5NZXNzYWdlKTtcbmlmIChnb29nLkRFQlVHICYmICFDT01QSUxFRCkge1xuICAvKipcbiAgICogQHB1YmxpY1xuICAgKiBAb3ZlcnJpZGVcbiAgICovXG4gIHByb3RvLm1vZGVscy5wcm90by5jb2ZkLkNvZmRTaGVldC5Ta2lsbC5kaXNwbGF5TmFtZSA9ICdwcm90by5tb2RlbHMucHJvdG8uY29mZC5Db2ZkU2hlZXQuU2tpbGwnO1xufVxuLyoqXG4gKiBHZW5lcmF0ZWQgYnkgSnNQYkNvZGVHZW5lcmF0b3IuXG4gKiBAcGFyYW0ge0FycmF5PX0gb3B0X2RhdGEgT3B0aW9uYWwgaW5pdGlhbCBkYXRhIGFycmF5LCB0eXBpY2FsbHkgZnJvbSBhXG4gKiBzZXJ2ZXIgcmVzcG9uc2UsIG9yIGNvbnN0cnVjdGVkIGRpcmVjdGx5IGluIEphdmFzY3JpcHQuIFRoZSBhcnJheSBpcyB1c2VkXG4gKiBpbiBwbGFjZSBhbmQgYmVjb21lcyBwYXJ0IG9mIHRoZSBjb25zdHJ1Y3RlZCBvYmplY3QuIEl0IGlzIG5vdCBjbG9uZWQuXG4gKiBJZiBubyBkYXRhIGlzIHByb3ZpZGVkLCB0aGUgY29uc3RydWN0ZWQgb2JqZWN0IHdpbGwgYmUgZW1wdHksIGJ1dCBzdGlsbFxuICogdmFsaWQuXG4gKiBAZXh0ZW5kcyB7anNwYi5NZXNzYWdlfVxuICogQGNvbnN0cnVjdG9yXG4gKi9cbnByb3RvLm1vZGVscy5wcm90by5jb2ZkLkNvZmRTaGVldC5JdGVtID0gZnVuY3Rpb24ob3B0X2RhdGEpIHtcbiAganNwYi5NZXNzYWdlLmluaXRpYWxpemUodGhpcywgb3B0X2RhdGEsIDAsIC0xLCBudWxsLCBudWxsKTtcbn07XG5nb29nLmluaGVyaXRzKHByb3RvLm1vZGVscy5wcm90by5jb2ZkLkNvZmRTaGVldC5JdGVtLCBqc3BiLk1lc3NhZ2UpO1xuaWYgKGdvb2cuREVCVUcgJiYgIUNPTVBJTEVEKSB7XG4gIC8qKlxuICAgKiBAcHVibGljXG4gICAqIEBvdmVycmlkZVxuICAgKi9cbiAgcHJvdG8ubW9kZWxzLnByb3RvLmNvZmQuQ29mZFNoZWV0Lkl0ZW0uZGlzcGxheU5hbWUgPSAncHJvdG8ubW9kZWxzLnByb3RvLmNvZmQuQ29mZFNoZWV0Lkl0ZW0nO1xufVxuLyoqXG4gKiBHZW5lcmF0ZWQgYnkgSnNQYkNvZGVHZW5lcmF0b3IuXG4gKiBAcGFyYW0ge0FycmF5PX0gb3B0X2RhdGEgT3B0aW9uYWwgaW5pdGlhbCBkYXRhIGFycmF5LCB0eXBpY2FsbHkgZnJvbSBhXG4gKiBzZXJ2ZXIgcmVzcG9uc2UsIG9yIGNvbnN0cnVjdGVkIGRpcmVjdGx5IGluIEphdmFzY3JpcHQuIFRoZSBhcnJheSBpcyB1c2VkXG4gKiBpbiBwbGFjZSBhbmQgYmVjb21lcyBwYXJ0IG9mIHRoZSBjb25zdHJ1Y3RlZCBvYmplY3QuIEl0IGlzIG5vdCBjbG9uZWQuXG4gKiBJZiBubyBkYXRhIGlzIHByb3ZpZGVkLCB0aGUgY29uc3RydWN0ZWQgb2JqZWN0IHdpbGwgYmUgZW1wdHksIGJ1dCBzdGlsbFxuICogdmFsaWQuXG4gKiBAZXh0ZW5kcyB7anNwYi5NZXNzYWdlfVxuICogQGNvbnN0cnVjdG9yXG4gKi9cbnByb3RvLm1vZGVscy5wcm90by5jb2ZkLkNvZmRTaGVldC5BdHRhY2sgPSBmdW5jdGlvbihvcHRfZGF0YSkge1xuICBqc3BiLk1lc3NhZ2UuaW5pdGlhbGl6ZSh0aGlzLCBvcHRfZGF0YSwgMCwgLTEsIG51bGwsIG51bGwpO1xufTtcbmdvb2cuaW5oZXJpdHMocHJvdG8ubW9kZWxzLnByb3RvLmNvZmQuQ29mZFNoZWV0LkF0dGFjaywganNwYi5NZXNzYWdlKTtcbmlmIChnb29nLkRFQlVHICYmICFDT01QSUxFRCkge1xuICAvKipcbiAgICogQHB1YmxpY1xuICAgKiBAb3ZlcnJpZGVcbiAgICovXG4gIHByb3RvLm1vZGVscy5wcm90by5jb2ZkLkNvZmRTaGVldC5BdHRhY2suZGlzcGxheU5hbWUgPSAncHJvdG8ubW9kZWxzLnByb3RvLmNvZmQuQ29mZFNoZWV0LkF0dGFjayc7XG59XG5cblxuXG5pZiAoanNwYi5NZXNzYWdlLkdFTkVSQVRFX1RPX09CSkVDVCkge1xuLyoqXG4gKiBDcmVhdGVzIGFuIG9iamVjdCByZXByZXNlbnRhdGlvbiBvZiB0aGlzIHByb3RvLlxuICogRmllbGQgbmFtZXMgdGhhdCBhcmUgcmVzZXJ2ZWQgaW4gSmF2YVNjcmlwdCBhbmQgd2lsbCBiZSByZW5hbWVkIHRvIHBiX25hbWUuXG4gKiBPcHRpb25hbCBmaWVsZHMgdGhhdCBhcmUgbm90IHNldCB3aWxsIGJlIHNldCB0byB1bmRlZmluZWQuXG4gKiBUbyBhY2Nlc3MgYSByZXNlcnZlZCBmaWVsZCB1c2UsIGZvby5wYl88bmFtZT4sIGVnLCBmb28ucGJfZGVmYXVsdC5cbiAqIEZvciB0aGUgbGlzdCBvZiByZXNlcnZlZCBuYW1lcyBwbGVhc2Ugc2VlOlxuICogICAgIG5ldC9wcm90bzIvY29tcGlsZXIvanMvaW50ZXJuYWwvZ2VuZXJhdG9yLmNjI2tLZXl3b3JkLlxuICogQHBhcmFtIHtib29sZWFuPX0gb3B0X2luY2x1ZGVJbnN0YW5jZSBEZXByZWNhdGVkLiB3aGV0aGVyIHRvIGluY2x1ZGUgdGhlXG4gKiAgICAgSlNQQiBpbnN0YW5jZSBmb3IgdHJhbnNpdGlvbmFsIHNveSBwcm90byBzdXBwb3J0OlxuICogICAgIGh0dHA6Ly9nb3RvL3NveS1wYXJhbS1taWdyYXRpb25cbiAqIEByZXR1cm4geyFPYmplY3R9XG4gKi9cbnByb3RvLm1vZGVscy5wcm90by5jb2ZkLkNvcmVGaWVsZHMucHJvdG90eXBlLnRvT2JqZWN0ID0gZnVuY3Rpb24ob3B0X2luY2x1ZGVJbnN0YW5jZSkge1xuICByZXR1cm4gcHJvdG8ubW9kZWxzLnByb3RvLmNvZmQuQ29yZUZpZWxkcy50b09iamVjdChvcHRfaW5jbHVkZUluc3RhbmNlLCB0aGlzKTtcbn07XG5cblxuLyoqXG4gKiBTdGF0aWMgdmVyc2lvbiBvZiB0aGUge0BzZWUgdG9PYmplY3R9IG1ldGhvZC5cbiAqIEBwYXJhbSB7Ym9vbGVhbnx1bmRlZmluZWR9IGluY2x1ZGVJbnN0YW5jZSBEZXByZWNhdGVkLiBXaGV0aGVyIHRvIGluY2x1ZGVcbiAqICAgICB0aGUgSlNQQiBpbnN0YW5jZSBmb3IgdHJhbnNpdGlvbmFsIHNveSBwcm90byBzdXBwb3J0OlxuICogICAgIGh0dHA6Ly9nb3RvL3NveS1wYXJhbS1taWdyYXRpb25cbiAqIEBwYXJhbSB7IXByb3RvLm1vZGVscy5wcm90by5jb2ZkLkNvcmVGaWVsZHN9IG1zZyBUaGUgbXNnIGluc3RhbmNlIHRvIHRyYW5zZm9ybS5cbiAqIEByZXR1cm4geyFPYmplY3R9XG4gKiBAc3VwcHJlc3Mge3VudXNlZExvY2FsVmFyaWFibGVzfSBmIGlzIG9ubHkgdXNlZCBmb3IgbmVzdGVkIG1lc3NhZ2VzXG4gKi9cbnByb3RvLm1vZGVscy5wcm90by5jb2ZkLkNvcmVGaWVsZHMudG9PYmplY3QgPSBmdW5jdGlvbihpbmNsdWRlSW5zdGFuY2UsIG1zZykge1xuICB2YXIgZiwgb2JqID0ge1xuICAgIGludGVncml0eToganNwYi5NZXNzYWdlLmdldEZpZWxkV2l0aERlZmF1bHQobXNnLCAxLCAwKVxuICB9O1xuXG4gIGlmIChpbmNsdWRlSW5zdGFuY2UpIHtcbiAgICBvYmouJGpzcGJNZXNzYWdlSW5zdGFuY2UgPSBtc2c7XG4gIH1cbiAgcmV0dXJuIG9iajtcbn07XG59XG5cblxuLyoqXG4gKiBEZXNlcmlhbGl6ZXMgYmluYXJ5IGRhdGEgKGluIHByb3RvYnVmIHdpcmUgZm9ybWF0KS5cbiAqIEBwYXJhbSB7anNwYi5CeXRlU291cmNlfSBieXRlcyBUaGUgYnl0ZXMgdG8gZGVzZXJpYWxpemUuXG4gKiBAcmV0dXJuIHshcHJvdG8ubW9kZWxzLnByb3RvLmNvZmQuQ29yZUZpZWxkc31cbiAqL1xucHJvdG8ubW9kZWxzLnByb3RvLmNvZmQuQ29yZUZpZWxkcy5kZXNlcmlhbGl6ZUJpbmFyeSA9IGZ1bmN0aW9uKGJ5dGVzKSB7XG4gIHZhciByZWFkZXIgPSBuZXcganNwYi5CaW5hcnlSZWFkZXIoYnl0ZXMpO1xuICB2YXIgbXNnID0gbmV3IHByb3RvLm1vZGVscy5wcm90by5jb2ZkLkNvcmVGaWVsZHM7XG4gIHJldHVybiBwcm90by5tb2RlbHMucHJvdG8uY29mZC5Db3JlRmllbGRzLmRlc2VyaWFsaXplQmluYXJ5RnJvbVJlYWRlcihtc2csIHJlYWRlcik7XG59O1xuXG5cbi8qKlxuICogRGVzZXJpYWxpemVzIGJpbmFyeSBkYXRhIChpbiBwcm90b2J1ZiB3aXJlIGZvcm1hdCkgZnJvbSB0aGVcbiAqIGdpdmVuIHJlYWRlciBpbnRvIHRoZSBnaXZlbiBtZXNzYWdlIG9iamVjdC5cbiAqIEBwYXJhbSB7IXByb3RvLm1vZGVscy5wcm90by5jb2ZkLkNvcmVGaWVsZHN9IG1zZyBUaGUgbWVzc2FnZSBvYmplY3QgdG8gZGVzZXJpYWxpemUgaW50by5cbiAqIEBwYXJhbSB7IWpzcGIuQmluYXJ5UmVhZGVyfSByZWFkZXIgVGhlIEJpbmFyeVJlYWRlciB0byB1c2UuXG4gKiBAcmV0dXJuIHshcHJvdG8ubW9kZWxzLnByb3RvLmNvZmQuQ29yZUZpZWxkc31cbiAqL1xucHJvdG8ubW9kZWxzLnByb3RvLmNvZmQuQ29yZUZpZWxkcy5kZXNlcmlhbGl6ZUJpbmFyeUZyb21SZWFkZXIgPSBmdW5jdGlvbihtc2csIHJlYWRlcikge1xuICB3aGlsZSAocmVhZGVyLm5leHRGaWVsZCgpKSB7XG4gICAgaWYgKHJlYWRlci5pc0VuZEdyb3VwKCkpIHtcbiAgICAgIGJyZWFrO1xuICAgIH1cbiAgICB2YXIgZmllbGQgPSByZWFkZXIuZ2V0RmllbGROdW1iZXIoKTtcbiAgICBzd2l0Y2ggKGZpZWxkKSB7XG4gICAgY2FzZSAxOlxuICAgICAgdmFyIHZhbHVlID0gLyoqIEB0eXBlIHtudW1iZXJ9ICovIChyZWFkZXIucmVhZEludDMyKCkpO1xuICAgICAgbXNnLnNldEludGVncml0eSh2YWx1ZSk7XG4gICAgICBicmVhaztcbiAgICBkZWZhdWx0OlxuICAgICAgcmVhZGVyLnNraXBGaWVsZCgpO1xuICAgICAgYnJlYWs7XG4gICAgfVxuICB9XG4gIHJldHVybiBtc2c7XG59O1xuXG5cbi8qKlxuICogU2VyaWFsaXplcyB0aGUgbWVzc2FnZSB0byBiaW5hcnkgZGF0YSAoaW4gcHJvdG9idWYgd2lyZSBmb3JtYXQpLlxuICogQHJldHVybiB7IVVpbnQ4QXJyYXl9XG4gKi9cbnByb3RvLm1vZGVscy5wcm90by5jb2ZkLkNvcmVGaWVsZHMucHJvdG90eXBlLnNlcmlhbGl6ZUJpbmFyeSA9IGZ1bmN0aW9uKCkge1xuICB2YXIgd3JpdGVyID0gbmV3IGpzcGIuQmluYXJ5V3JpdGVyKCk7XG4gIHByb3RvLm1vZGVscy5wcm90by5jb2ZkLkNvcmVGaWVsZHMuc2VyaWFsaXplQmluYXJ5VG9Xcml0ZXIodGhpcywgd3JpdGVyKTtcbiAgcmV0dXJuIHdyaXRlci5nZXRSZXN1bHRCdWZmZXIoKTtcbn07XG5cblxuLyoqXG4gKiBTZXJpYWxpemVzIHRoZSBnaXZlbiBtZXNzYWdlIHRvIGJpbmFyeSBkYXRhIChpbiBwcm90b2J1ZiB3aXJlXG4gKiBmb3JtYXQpLCB3cml0aW5nIHRvIHRoZSBnaXZlbiBCaW5hcnlXcml0ZXIuXG4gKiBAcGFyYW0geyFwcm90by5tb2RlbHMucHJvdG8uY29mZC5Db3JlRmllbGRzfSBtZXNzYWdlXG4gKiBAcGFyYW0geyFqc3BiLkJpbmFyeVdyaXRlcn0gd3JpdGVyXG4gKiBAc3VwcHJlc3Mge3VudXNlZExvY2FsVmFyaWFibGVzfSBmIGlzIG9ubHkgdXNlZCBmb3IgbmVzdGVkIG1lc3NhZ2VzXG4gKi9cbnByb3RvLm1vZGVscy5wcm90by5jb2ZkLkNvcmVGaWVsZHMuc2VyaWFsaXplQmluYXJ5VG9Xcml0ZXIgPSBmdW5jdGlvbihtZXNzYWdlLCB3cml0ZXIpIHtcbiAgdmFyIGYgPSB1bmRlZmluZWQ7XG4gIGYgPSBtZXNzYWdlLmdldEludGVncml0eSgpO1xuICBpZiAoZiAhPT0gMCkge1xuICAgIHdyaXRlci53cml0ZUludDMyKFxuICAgICAgMSxcbiAgICAgIGZcbiAgICApO1xuICB9XG59O1xuXG5cbi8qKlxuICogb3B0aW9uYWwgaW50MzIgaW50ZWdyaXR5ID0gMTtcbiAqIEByZXR1cm4ge251bWJlcn1cbiAqL1xucHJvdG8ubW9kZWxzLnByb3RvLmNvZmQuQ29yZUZpZWxkcy5wcm90b3R5cGUuZ2V0SW50ZWdyaXR5ID0gZnVuY3Rpb24oKSB7XG4gIHJldHVybiAvKiogQHR5cGUge251bWJlcn0gKi8gKGpzcGIuTWVzc2FnZS5nZXRGaWVsZFdpdGhEZWZhdWx0KHRoaXMsIDEsIDApKTtcbn07XG5cblxuLyoqXG4gKiBAcGFyYW0ge251bWJlcn0gdmFsdWVcbiAqIEByZXR1cm4geyFwcm90by5tb2RlbHMucHJvdG8uY29mZC5Db3JlRmllbGRzfSByZXR1cm5zIHRoaXNcbiAqL1xucHJvdG8ubW9kZWxzLnByb3RvLmNvZmQuQ29yZUZpZWxkcy5wcm90b3R5cGUuc2V0SW50ZWdyaXR5ID0gZnVuY3Rpb24odmFsdWUpIHtcbiAgcmV0dXJuIGpzcGIuTWVzc2FnZS5zZXRQcm90bzNJbnRGaWVsZCh0aGlzLCAxLCB2YWx1ZSk7XG59O1xuXG5cblxuXG5cbmlmIChqc3BiLk1lc3NhZ2UuR0VORVJBVEVfVE9fT0JKRUNUKSB7XG4vKipcbiAqIENyZWF0ZXMgYW4gb2JqZWN0IHJlcHJlc2VudGF0aW9uIG9mIHRoaXMgcHJvdG8uXG4gKiBGaWVsZCBuYW1lcyB0aGF0IGFyZSByZXNlcnZlZCBpbiBKYXZhU2NyaXB0IGFuZCB3aWxsIGJlIHJlbmFtZWQgdG8gcGJfbmFtZS5cbiAqIE9wdGlvbmFsIGZpZWxkcyB0aGF0IGFyZSBub3Qgc2V0IHdpbGwgYmUgc2V0IHRvIHVuZGVmaW5lZC5cbiAqIFRvIGFjY2VzcyBhIHJlc2VydmVkIGZpZWxkIHVzZSwgZm9vLnBiXzxuYW1lPiwgZWcsIGZvby5wYl9kZWZhdWx0LlxuICogRm9yIHRoZSBsaXN0IG9mIHJlc2VydmVkIG5hbWVzIHBsZWFzZSBzZWU6XG4gKiAgICAgbmV0L3Byb3RvMi9jb21waWxlci9qcy9pbnRlcm5hbC9nZW5lcmF0b3IuY2Mja0tleXdvcmQuXG4gKiBAcGFyYW0ge2Jvb2xlYW49fSBvcHRfaW5jbHVkZUluc3RhbmNlIERlcHJlY2F0ZWQuIHdoZXRoZXIgdG8gaW5jbHVkZSB0aGVcbiAqICAgICBKU1BCIGluc3RhbmNlIGZvciB0cmFuc2l0aW9uYWwgc295IHByb3RvIHN1cHBvcnQ6XG4gKiAgICAgaHR0cDovL2dvdG8vc295LXBhcmFtLW1pZ3JhdGlvblxuICogQHJldHVybiB7IU9iamVjdH1cbiAqL1xucHJvdG8ubW9kZWxzLnByb3RvLmNvZmQuTWFnZUZpZWxkcy5wcm90b3R5cGUudG9PYmplY3QgPSBmdW5jdGlvbihvcHRfaW5jbHVkZUluc3RhbmNlKSB7XG4gIHJldHVybiBwcm90by5tb2RlbHMucHJvdG8uY29mZC5NYWdlRmllbGRzLnRvT2JqZWN0KG9wdF9pbmNsdWRlSW5zdGFuY2UsIHRoaXMpO1xufTtcblxuXG4vKipcbiAqIFN0YXRpYyB2ZXJzaW9uIG9mIHRoZSB7QHNlZSB0b09iamVjdH0gbWV0aG9kLlxuICogQHBhcmFtIHtib29sZWFufHVuZGVmaW5lZH0gaW5jbHVkZUluc3RhbmNlIERlcHJlY2F0ZWQuIFdoZXRoZXIgdG8gaW5jbHVkZVxuICogICAgIHRoZSBKU1BCIGluc3RhbmNlIGZvciB0cmFuc2l0aW9uYWwgc295IHByb3RvIHN1cHBvcnQ6XG4gKiAgICAgaHR0cDovL2dvdG8vc295LXBhcmFtLW1pZ3JhdGlvblxuICogQHBhcmFtIHshcHJvdG8ubW9kZWxzLnByb3RvLmNvZmQuTWFnZUZpZWxkc30gbXNnIFRoZSBtc2cgaW5zdGFuY2UgdG8gdHJhbnNmb3JtLlxuICogQHJldHVybiB7IU9iamVjdH1cbiAqIEBzdXBwcmVzcyB7dW51c2VkTG9jYWxWYXJpYWJsZXN9IGYgaXMgb25seSB1c2VkIGZvciBuZXN0ZWQgbWVzc2FnZXNcbiAqL1xucHJvdG8ubW9kZWxzLnByb3RvLmNvZmQuTWFnZUZpZWxkcy50b09iamVjdCA9IGZ1bmN0aW9uKGluY2x1ZGVJbnN0YW5jZSwgbXNnKSB7XG4gIHZhciBmLCBvYmogPSB7XG4gICAgd2lkc29tOiBqc3BiLk1lc3NhZ2UuZ2V0RmllbGRXaXRoRGVmYXVsdChtc2csIDEsIDApXG4gIH07XG5cbiAgaWYgKGluY2x1ZGVJbnN0YW5jZSkge1xuICAgIG9iai4kanNwYk1lc3NhZ2VJbnN0YW5jZSA9IG1zZztcbiAgfVxuICByZXR1cm4gb2JqO1xufTtcbn1cblxuXG4vKipcbiAqIERlc2VyaWFsaXplcyBiaW5hcnkgZGF0YSAoaW4gcHJvdG9idWYgd2lyZSBmb3JtYXQpLlxuICogQHBhcmFtIHtqc3BiLkJ5dGVTb3VyY2V9IGJ5dGVzIFRoZSBieXRlcyB0byBkZXNlcmlhbGl6ZS5cbiAqIEByZXR1cm4geyFwcm90by5tb2RlbHMucHJvdG8uY29mZC5NYWdlRmllbGRzfVxuICovXG5wcm90by5tb2RlbHMucHJvdG8uY29mZC5NYWdlRmllbGRzLmRlc2VyaWFsaXplQmluYXJ5ID0gZnVuY3Rpb24oYnl0ZXMpIHtcbiAgdmFyIHJlYWRlciA9IG5ldyBqc3BiLkJpbmFyeVJlYWRlcihieXRlcyk7XG4gIHZhciBtc2cgPSBuZXcgcHJvdG8ubW9kZWxzLnByb3RvLmNvZmQuTWFnZUZpZWxkcztcbiAgcmV0dXJuIHByb3RvLm1vZGVscy5wcm90by5jb2ZkLk1hZ2VGaWVsZHMuZGVzZXJpYWxpemVCaW5hcnlGcm9tUmVhZGVyKG1zZywgcmVhZGVyKTtcbn07XG5cblxuLyoqXG4gKiBEZXNlcmlhbGl6ZXMgYmluYXJ5IGRhdGEgKGluIHByb3RvYnVmIHdpcmUgZm9ybWF0KSBmcm9tIHRoZVxuICogZ2l2ZW4gcmVhZGVyIGludG8gdGhlIGdpdmVuIG1lc3NhZ2Ugb2JqZWN0LlxuICogQHBhcmFtIHshcHJvdG8ubW9kZWxzLnByb3RvLmNvZmQuTWFnZUZpZWxkc30gbXNnIFRoZSBtZXNzYWdlIG9iamVjdCB0byBkZXNlcmlhbGl6ZSBpbnRvLlxuICogQHBhcmFtIHshanNwYi5CaW5hcnlSZWFkZXJ9IHJlYWRlciBUaGUgQmluYXJ5UmVhZGVyIHRvIHVzZS5cbiAqIEByZXR1cm4geyFwcm90by5tb2RlbHMucHJvdG8uY29mZC5NYWdlRmllbGRzfVxuICovXG5wcm90by5tb2RlbHMucHJvdG8uY29mZC5NYWdlRmllbGRzLmRlc2VyaWFsaXplQmluYXJ5RnJvbVJlYWRlciA9IGZ1bmN0aW9uKG1zZywgcmVhZGVyKSB7XG4gIHdoaWxlIChyZWFkZXIubmV4dEZpZWxkKCkpIHtcbiAgICBpZiAocmVhZGVyLmlzRW5kR3JvdXAoKSkge1xuICAgICAgYnJlYWs7XG4gICAgfVxuICAgIHZhciBmaWVsZCA9IHJlYWRlci5nZXRGaWVsZE51bWJlcigpO1xuICAgIHN3aXRjaCAoZmllbGQpIHtcbiAgICBjYXNlIDE6XG4gICAgICB2YXIgdmFsdWUgPSAvKiogQHR5cGUge251bWJlcn0gKi8gKHJlYWRlci5yZWFkSW50MzIoKSk7XG4gICAgICBtc2cuc2V0V2lkc29tKHZhbHVlKTtcbiAgICAgIGJyZWFrO1xuICAgIGRlZmF1bHQ6XG4gICAgICByZWFkZXIuc2tpcEZpZWxkKCk7XG4gICAgICBicmVhaztcbiAgICB9XG4gIH1cbiAgcmV0dXJuIG1zZztcbn07XG5cblxuLyoqXG4gKiBTZXJpYWxpemVzIHRoZSBtZXNzYWdlIHRvIGJpbmFyeSBkYXRhIChpbiBwcm90b2J1ZiB3aXJlIGZvcm1hdCkuXG4gKiBAcmV0dXJuIHshVWludDhBcnJheX1cbiAqL1xucHJvdG8ubW9kZWxzLnByb3RvLmNvZmQuTWFnZUZpZWxkcy5wcm90b3R5cGUuc2VyaWFsaXplQmluYXJ5ID0gZnVuY3Rpb24oKSB7XG4gIHZhciB3cml0ZXIgPSBuZXcganNwYi5CaW5hcnlXcml0ZXIoKTtcbiAgcHJvdG8ubW9kZWxzLnByb3RvLmNvZmQuTWFnZUZpZWxkcy5zZXJpYWxpemVCaW5hcnlUb1dyaXRlcih0aGlzLCB3cml0ZXIpO1xuICByZXR1cm4gd3JpdGVyLmdldFJlc3VsdEJ1ZmZlcigpO1xufTtcblxuXG4vKipcbiAqIFNlcmlhbGl6ZXMgdGhlIGdpdmVuIG1lc3NhZ2UgdG8gYmluYXJ5IGRhdGEgKGluIHByb3RvYnVmIHdpcmVcbiAqIGZvcm1hdCksIHdyaXRpbmcgdG8gdGhlIGdpdmVuIEJpbmFyeVdyaXRlci5cbiAqIEBwYXJhbSB7IXByb3RvLm1vZGVscy5wcm90by5jb2ZkLk1hZ2VGaWVsZHN9IG1lc3NhZ2VcbiAqIEBwYXJhbSB7IWpzcGIuQmluYXJ5V3JpdGVyfSB3cml0ZXJcbiAqIEBzdXBwcmVzcyB7dW51c2VkTG9jYWxWYXJpYWJsZXN9IGYgaXMgb25seSB1c2VkIGZvciBuZXN0ZWQgbWVzc2FnZXNcbiAqL1xucHJvdG8ubW9kZWxzLnByb3RvLmNvZmQuTWFnZUZpZWxkcy5zZXJpYWxpemVCaW5hcnlUb1dyaXRlciA9IGZ1bmN0aW9uKG1lc3NhZ2UsIHdyaXRlcikge1xuICB2YXIgZiA9IHVuZGVmaW5lZDtcbiAgZiA9IG1lc3NhZ2UuZ2V0V2lkc29tKCk7XG4gIGlmIChmICE9PSAwKSB7XG4gICAgd3JpdGVyLndyaXRlSW50MzIoXG4gICAgICAxLFxuICAgICAgZlxuICAgICk7XG4gIH1cbn07XG5cblxuLyoqXG4gKiBvcHRpb25hbCBpbnQzMiB3aWRzb20gPSAxO1xuICogQHJldHVybiB7bnVtYmVyfVxuICovXG5wcm90by5tb2RlbHMucHJvdG8uY29mZC5NYWdlRmllbGRzLnByb3RvdHlwZS5nZXRXaWRzb20gPSBmdW5jdGlvbigpIHtcbiAgcmV0dXJuIC8qKiBAdHlwZSB7bnVtYmVyfSAqLyAoanNwYi5NZXNzYWdlLmdldEZpZWxkV2l0aERlZmF1bHQodGhpcywgMSwgMCkpO1xufTtcblxuXG4vKipcbiAqIEBwYXJhbSB7bnVtYmVyfSB2YWx1ZVxuICogQHJldHVybiB7IXByb3RvLm1vZGVscy5wcm90by5jb2ZkLk1hZ2VGaWVsZHN9IHJldHVybnMgdGhpc1xuICovXG5wcm90by5tb2RlbHMucHJvdG8uY29mZC5NYWdlRmllbGRzLnByb3RvdHlwZS5zZXRXaWRzb20gPSBmdW5jdGlvbih2YWx1ZSkge1xuICByZXR1cm4ganNwYi5NZXNzYWdlLnNldFByb3RvM0ludEZpZWxkKHRoaXMsIDEsIHZhbHVlKTtcbn07XG5cblxuXG5cblxuaWYgKGpzcGIuTWVzc2FnZS5HRU5FUkFURV9UT19PQkpFQ1QpIHtcbi8qKlxuICogQ3JlYXRlcyBhbiBvYmplY3QgcmVwcmVzZW50YXRpb24gb2YgdGhpcyBwcm90by5cbiAqIEZpZWxkIG5hbWVzIHRoYXQgYXJlIHJlc2VydmVkIGluIEphdmFTY3JpcHQgYW5kIHdpbGwgYmUgcmVuYW1lZCB0byBwYl9uYW1lLlxuICogT3B0aW9uYWwgZmllbGRzIHRoYXQgYXJlIG5vdCBzZXQgd2lsbCBiZSBzZXQgdG8gdW5kZWZpbmVkLlxuICogVG8gYWNjZXNzIGEgcmVzZXJ2ZWQgZmllbGQgdXNlLCBmb28ucGJfPG5hbWU+LCBlZywgZm9vLnBiX2RlZmF1bHQuXG4gKiBGb3IgdGhlIGxpc3Qgb2YgcmVzZXJ2ZWQgbmFtZXMgcGxlYXNlIHNlZTpcbiAqICAgICBuZXQvcHJvdG8yL2NvbXBpbGVyL2pzL2ludGVybmFsL2dlbmVyYXRvci5jYyNrS2V5d29yZC5cbiAqIEBwYXJhbSB7Ym9vbGVhbj19IG9wdF9pbmNsdWRlSW5zdGFuY2UgRGVwcmVjYXRlZC4gd2hldGhlciB0byBpbmNsdWRlIHRoZVxuICogICAgIEpTUEIgaW5zdGFuY2UgZm9yIHRyYW5zaXRpb25hbCBzb3kgcHJvdG8gc3VwcG9ydDpcbiAqICAgICBodHRwOi8vZ290by9zb3ktcGFyYW0tbWlncmF0aW9uXG4gKiBAcmV0dXJuIHshT2JqZWN0fVxuICovXG5wcm90by5tb2RlbHMucHJvdG8uY29mZC5DaGFuZ2VsaW5nRmllbGRzLnByb3RvdHlwZS50b09iamVjdCA9IGZ1bmN0aW9uKG9wdF9pbmNsdWRlSW5zdGFuY2UpIHtcbiAgcmV0dXJuIHByb3RvLm1vZGVscy5wcm90by5jb2ZkLkNoYW5nZWxpbmdGaWVsZHMudG9PYmplY3Qob3B0X2luY2x1ZGVJbnN0YW5jZSwgdGhpcyk7XG59O1xuXG5cbi8qKlxuICogU3RhdGljIHZlcnNpb24gb2YgdGhlIHtAc2VlIHRvT2JqZWN0fSBtZXRob2QuXG4gKiBAcGFyYW0ge2Jvb2xlYW58dW5kZWZpbmVkfSBpbmNsdWRlSW5zdGFuY2UgRGVwcmVjYXRlZC4gV2hldGhlciB0byBpbmNsdWRlXG4gKiAgICAgdGhlIEpTUEIgaW5zdGFuY2UgZm9yIHRyYW5zaXRpb25hbCBzb3kgcHJvdG8gc3VwcG9ydDpcbiAqICAgICBodHRwOi8vZ290by9zb3ktcGFyYW0tbWlncmF0aW9uXG4gKiBAcGFyYW0geyFwcm90by5tb2RlbHMucHJvdG8uY29mZC5DaGFuZ2VsaW5nRmllbGRzfSBtc2cgVGhlIG1zZyBpbnN0YW5jZSB0byB0cmFuc2Zvcm0uXG4gKiBAcmV0dXJuIHshT2JqZWN0fVxuICogQHN1cHByZXNzIHt1bnVzZWRMb2NhbFZhcmlhYmxlc30gZiBpcyBvbmx5IHVzZWQgZm9yIG5lc3RlZCBtZXNzYWdlc1xuICovXG5wcm90by5tb2RlbHMucHJvdG8uY29mZC5DaGFuZ2VsaW5nRmllbGRzLnRvT2JqZWN0ID0gZnVuY3Rpb24oaW5jbHVkZUluc3RhbmNlLCBtc2cpIHtcbiAgdmFyIGYsIG9iaiA9IHtcbiAgICBjbGFyaXR5OiBqc3BiLk1lc3NhZ2UuZ2V0RmllbGRXaXRoRGVmYXVsdChtc2csIDEsIDApXG4gIH07XG5cbiAgaWYgKGluY2x1ZGVJbnN0YW5jZSkge1xuICAgIG9iai4kanNwYk1lc3NhZ2VJbnN0YW5jZSA9IG1zZztcbiAgfVxuICByZXR1cm4gb2JqO1xufTtcbn1cblxuXG4vKipcbiAqIERlc2VyaWFsaXplcyBiaW5hcnkgZGF0YSAoaW4gcHJvdG9idWYgd2lyZSBmb3JtYXQpLlxuICogQHBhcmFtIHtqc3BiLkJ5dGVTb3VyY2V9IGJ5dGVzIFRoZSBieXRlcyB0byBkZXNlcmlhbGl6ZS5cbiAqIEByZXR1cm4geyFwcm90by5tb2RlbHMucHJvdG8uY29mZC5DaGFuZ2VsaW5nRmllbGRzfVxuICovXG5wcm90by5tb2RlbHMucHJvdG8uY29mZC5DaGFuZ2VsaW5nRmllbGRzLmRlc2VyaWFsaXplQmluYXJ5ID0gZnVuY3Rpb24oYnl0ZXMpIHtcbiAgdmFyIHJlYWRlciA9IG5ldyBqc3BiLkJpbmFyeVJlYWRlcihieXRlcyk7XG4gIHZhciBtc2cgPSBuZXcgcHJvdG8ubW9kZWxzLnByb3RvLmNvZmQuQ2hhbmdlbGluZ0ZpZWxkcztcbiAgcmV0dXJuIHByb3RvLm1vZGVscy5wcm90by5jb2ZkLkNoYW5nZWxpbmdGaWVsZHMuZGVzZXJpYWxpemVCaW5hcnlGcm9tUmVhZGVyKG1zZywgcmVhZGVyKTtcbn07XG5cblxuLyoqXG4gKiBEZXNlcmlhbGl6ZXMgYmluYXJ5IGRhdGEgKGluIHByb3RvYnVmIHdpcmUgZm9ybWF0KSBmcm9tIHRoZVxuICogZ2l2ZW4gcmVhZGVyIGludG8gdGhlIGdpdmVuIG1lc3NhZ2Ugb2JqZWN0LlxuICogQHBhcmFtIHshcHJvdG8ubW9kZWxzLnByb3RvLmNvZmQuQ2hhbmdlbGluZ0ZpZWxkc30gbXNnIFRoZSBtZXNzYWdlIG9iamVjdCB0byBkZXNlcmlhbGl6ZSBpbnRvLlxuICogQHBhcmFtIHshanNwYi5CaW5hcnlSZWFkZXJ9IHJlYWRlciBUaGUgQmluYXJ5UmVhZGVyIHRvIHVzZS5cbiAqIEByZXR1cm4geyFwcm90by5tb2RlbHMucHJvdG8uY29mZC5DaGFuZ2VsaW5nRmllbGRzfVxuICovXG5wcm90by5tb2RlbHMucHJvdG8uY29mZC5DaGFuZ2VsaW5nRmllbGRzLmRlc2VyaWFsaXplQmluYXJ5RnJvbVJlYWRlciA9IGZ1bmN0aW9uKG1zZywgcmVhZGVyKSB7XG4gIHdoaWxlIChyZWFkZXIubmV4dEZpZWxkKCkpIHtcbiAgICBpZiAocmVhZGVyLmlzRW5kR3JvdXAoKSkge1xuICAgICAgYnJlYWs7XG4gICAgfVxuICAgIHZhciBmaWVsZCA9IHJlYWRlci5nZXRGaWVsZE51bWJlcigpO1xuICAgIHN3aXRjaCAoZmllbGQpIHtcbiAgICBjYXNlIDE6XG4gICAgICB2YXIgdmFsdWUgPSAvKiogQHR5cGUge251bWJlcn0gKi8gKHJlYWRlci5yZWFkSW50MzIoKSk7XG4gICAgICBtc2cuc2V0Q2xhcml0eSh2YWx1ZSk7XG4gICAgICBicmVhaztcbiAgICBkZWZhdWx0OlxuICAgICAgcmVhZGVyLnNraXBGaWVsZCgpO1xuICAgICAgYnJlYWs7XG4gICAgfVxuICB9XG4gIHJldHVybiBtc2c7XG59O1xuXG5cbi8qKlxuICogU2VyaWFsaXplcyB0aGUgbWVzc2FnZSB0byBiaW5hcnkgZGF0YSAoaW4gcHJvdG9idWYgd2lyZSBmb3JtYXQpLlxuICogQHJldHVybiB7IVVpbnQ4QXJyYXl9XG4gKi9cbnByb3RvLm1vZGVscy5wcm90by5jb2ZkLkNoYW5nZWxpbmdGaWVsZHMucHJvdG90eXBlLnNlcmlhbGl6ZUJpbmFyeSA9IGZ1bmN0aW9uKCkge1xuICB2YXIgd3JpdGVyID0gbmV3IGpzcGIuQmluYXJ5V3JpdGVyKCk7XG4gIHByb3RvLm1vZGVscy5wcm90by5jb2ZkLkNoYW5nZWxpbmdGaWVsZHMuc2VyaWFsaXplQmluYXJ5VG9Xcml0ZXIodGhpcywgd3JpdGVyKTtcbiAgcmV0dXJuIHdyaXRlci5nZXRSZXN1bHRCdWZmZXIoKTtcbn07XG5cblxuLyoqXG4gKiBTZXJpYWxpemVzIHRoZSBnaXZlbiBtZXNzYWdlIHRvIGJpbmFyeSBkYXRhIChpbiBwcm90b2J1ZiB3aXJlXG4gKiBmb3JtYXQpLCB3cml0aW5nIHRvIHRoZSBnaXZlbiBCaW5hcnlXcml0ZXIuXG4gKiBAcGFyYW0geyFwcm90by5tb2RlbHMucHJvdG8uY29mZC5DaGFuZ2VsaW5nRmllbGRzfSBtZXNzYWdlXG4gKiBAcGFyYW0geyFqc3BiLkJpbmFyeVdyaXRlcn0gd3JpdGVyXG4gKiBAc3VwcHJlc3Mge3VudXNlZExvY2FsVmFyaWFibGVzfSBmIGlzIG9ubHkgdXNlZCBmb3IgbmVzdGVkIG1lc3NhZ2VzXG4gKi9cbnByb3RvLm1vZGVscy5wcm90by5jb2ZkLkNoYW5nZWxpbmdGaWVsZHMuc2VyaWFsaXplQmluYXJ5VG9Xcml0ZXIgPSBmdW5jdGlvbihtZXNzYWdlLCB3cml0ZXIpIHtcbiAgdmFyIGYgPSB1bmRlZmluZWQ7XG4gIGYgPSBtZXNzYWdlLmdldENsYXJpdHkoKTtcbiAgaWYgKGYgIT09IDApIHtcbiAgICB3cml0ZXIud3JpdGVJbnQzMihcbiAgICAgIDEsXG4gICAgICBmXG4gICAgKTtcbiAgfVxufTtcblxuXG4vKipcbiAqIG9wdGlvbmFsIGludDMyIGNsYXJpdHkgPSAxO1xuICogQHJldHVybiB7bnVtYmVyfVxuICovXG5wcm90by5tb2RlbHMucHJvdG8uY29mZC5DaGFuZ2VsaW5nRmllbGRzLnByb3RvdHlwZS5nZXRDbGFyaXR5ID0gZnVuY3Rpb24oKSB7XG4gIHJldHVybiAvKiogQHR5cGUge251bWJlcn0gKi8gKGpzcGIuTWVzc2FnZS5nZXRGaWVsZFdpdGhEZWZhdWx0KHRoaXMsIDEsIDApKTtcbn07XG5cblxuLyoqXG4gKiBAcGFyYW0ge251bWJlcn0gdmFsdWVcbiAqIEByZXR1cm4geyFwcm90by5tb2RlbHMucHJvdG8uY29mZC5DaGFuZ2VsaW5nRmllbGRzfSByZXR1cm5zIHRoaXNcbiAqL1xucHJvdG8ubW9kZWxzLnByb3RvLmNvZmQuQ2hhbmdlbGluZ0ZpZWxkcy5wcm90b3R5cGUuc2V0Q2xhcml0eSA9IGZ1bmN0aW9uKHZhbHVlKSB7XG4gIHJldHVybiBqc3BiLk1lc3NhZ2Uuc2V0UHJvdG8zSW50RmllbGQodGhpcywgMSwgdmFsdWUpO1xufTtcblxuXG5cbi8qKlxuICogTGlzdCBvZiByZXBlYXRlZCBmaWVsZHMgd2l0aGluIHRoaXMgbWVzc2FnZSB0eXBlLlxuICogQHByaXZhdGUgeyFBcnJheTxudW1iZXI+fVxuICogQGNvbnN0XG4gKi9cbnByb3RvLm1vZGVscy5wcm90by5jb2ZkLkNvZmRTaGVldC5yZXBlYXRlZEZpZWxkc18gPSBbMTUsMTksMjUsMjZdO1xuXG4vKipcbiAqIE9uZW9mIGdyb3VwIGRlZmluaXRpb25zIGZvciB0aGlzIG1lc3NhZ2UuIEVhY2ggZ3JvdXAgZGVmaW5lcyB0aGUgZmllbGRcbiAqIG51bWJlcnMgYmVsb25naW5nIHRvIHRoYXQgZ3JvdXAuIFdoZW4gb2YgdGhlc2UgZmllbGRzJyB2YWx1ZSBpcyBzZXQsIGFsbFxuICogb3RoZXIgZmllbGRzIGluIHRoZSBncm91cCBhcmUgY2xlYXJlZC4gRHVyaW5nIGRlc2VyaWFsaXphdGlvbiwgaWYgbXVsdGlwbGVcbiAqIGZpZWxkcyBhcmUgZW5jb3VudGVyZWQgZm9yIGEgZ3JvdXAsIG9ubHkgdGhlIGxhc3QgdmFsdWUgc2VlbiB3aWxsIGJlIGtlcHQuXG4gKiBAcHJpdmF0ZSB7IUFycmF5PCFBcnJheTxudW1iZXI+Pn1cbiAqIEBjb25zdFxuICovXG5wcm90by5tb2RlbHMucHJvdG8uY29mZC5Db2ZkU2hlZXQub25lb2ZHcm91cHNfID0gW1syOCwyOSwzMF1dO1xuXG4vKipcbiAqIEBlbnVtIHtudW1iZXJ9XG4gKi9cbnByb3RvLm1vZGVscy5wcm90by5jb2ZkLkNvZmRTaGVldC5TeXN0ZW1GaWVsZHNDYXNlID0ge1xuICBTWVNURU1fRklFTERTX05PVF9TRVQ6IDAsXG4gIENPUkU6IDI4LFxuICBNQUdFOiAyOSxcbiAgQ0hBTkdFTElORzogMzBcbn07XG5cbi8qKlxuICogQHJldHVybiB7cHJvdG8ubW9kZWxzLnByb3RvLmNvZmQuQ29mZFNoZWV0LlN5c3RlbUZpZWxkc0Nhc2V9XG4gKi9cbnByb3RvLm1vZGVscy5wcm90by5jb2ZkLkNvZmRTaGVldC5wcm90b3R5cGUuZ2V0U3lzdGVtRmllbGRzQ2FzZSA9IGZ1bmN0aW9uKCkge1xuICByZXR1cm4gLyoqIEB0eXBlIHtwcm90by5tb2RlbHMucHJvdG8uY29mZC5Db2ZkU2hlZXQuU3lzdGVtRmllbGRzQ2FzZX0gKi8oanNwYi5NZXNzYWdlLmNvbXB1dGVPbmVvZkNhc2UodGhpcywgcHJvdG8ubW9kZWxzLnByb3RvLmNvZmQuQ29mZFNoZWV0Lm9uZW9mR3JvdXBzX1swXSkpO1xufTtcblxuXG5cbmlmIChqc3BiLk1lc3NhZ2UuR0VORVJBVEVfVE9fT0JKRUNUKSB7XG4vKipcbiAqIENyZWF0ZXMgYW4gb2JqZWN0IHJlcHJlc2VudGF0aW9uIG9mIHRoaXMgcHJvdG8uXG4gKiBGaWVsZCBuYW1lcyB0aGF0IGFyZSByZXNlcnZlZCBpbiBKYXZhU2NyaXB0IGFuZCB3aWxsIGJlIHJlbmFtZWQgdG8gcGJfbmFtZS5cbiAqIE9wdGlvbmFsIGZpZWxkcyB0aGF0IGFyZSBub3Qgc2V0IHdpbGwgYmUgc2V0IHRvIHVuZGVmaW5lZC5cbiAqIFRvIGFjY2VzcyBhIHJlc2VydmVkIGZpZWxkIHVzZSwgZm9vLnBiXzxuYW1lPiwgZWcsIGZvby5wYl9kZWZhdWx0LlxuICogRm9yIHRoZSBsaXN0IG9mIHJlc2VydmVkIG5hbWVzIHBsZWFzZSBzZWU6XG4gKiAgICAgbmV0L3Byb3RvMi9jb21waWxlci9qcy9pbnRlcm5hbC9nZW5lcmF0b3IuY2Mja0tleXdvcmQuXG4gKiBAcGFyYW0ge2Jvb2xlYW49fSBvcHRfaW5jbHVkZUluc3RhbmNlIERlcHJlY2F0ZWQuIHdoZXRoZXIgdG8gaW5jbHVkZSB0aGVcbiAqICAgICBKU1BCIGluc3RhbmNlIGZvciB0cmFuc2l0aW9uYWwgc295IHByb3RvIHN1cHBvcnQ6XG4gKiAgICAgaHR0cDovL2dvdG8vc295LXBhcmFtLW1pZ3JhdGlvblxuICogQHJldHVybiB7IU9iamVjdH1cbiAqL1xucHJvdG8ubW9kZWxzLnByb3RvLmNvZmQuQ29mZFNoZWV0LnByb3RvdHlwZS50b09iamVjdCA9IGZ1bmN0aW9uKG9wdF9pbmNsdWRlSW5zdGFuY2UpIHtcbiAgcmV0dXJuIHByb3RvLm1vZGVscy5wcm90by5jb2ZkLkNvZmRTaGVldC50b09iamVjdChvcHRfaW5jbHVkZUluc3RhbmNlLCB0aGlzKTtcbn07XG5cblxuLyoqXG4gKiBTdGF0aWMgdmVyc2lvbiBvZiB0aGUge0BzZWUgdG9PYmplY3R9IG1ldGhvZC5cbiAqIEBwYXJhbSB7Ym9vbGVhbnx1bmRlZmluZWR9IGluY2x1ZGVJbnN0YW5jZSBEZXByZWNhdGVkLiBXaGV0aGVyIHRvIGluY2x1ZGVcbiAqICAgICB0aGUgSlNQQiBpbnN0YW5jZSBmb3IgdHJhbnNpdGlvbmFsIHNveSBwcm90byBzdXBwb3J0OlxuICogICAgIGh0dHA6Ly9nb3RvL3NveS1wYXJhbS1taWdyYXRpb25cbiAqIEBwYXJhbSB7IXByb3RvLm1vZGVscy5wcm90by5jb2ZkLkNvZmRTaGVldH0gbXNnIFRoZSBtc2cgaW5zdGFuY2UgdG8gdHJhbnNmb3JtLlxuICogQHJldHVybiB7IU9iamVjdH1cbiAqIEBzdXBwcmVzcyB7dW51c2VkTG9jYWxWYXJpYWJsZXN9IGYgaXMgb25seSB1c2VkIGZvciBuZXN0ZWQgbWVzc2FnZXNcbiAqL1xucHJvdG8ubW9kZWxzLnByb3RvLmNvZmQuQ29mZFNoZWV0LnRvT2JqZWN0ID0gZnVuY3Rpb24oaW5jbHVkZUluc3RhbmNlLCBtc2cpIHtcbiAgdmFyIGYsIG9iaiA9IHtcbiAgICBuYW1lOiBqc3BiLk1lc3NhZ2UuZ2V0RmllbGRXaXRoRGVmYXVsdChtc2csIDEsIFwiXCIpLFxuICAgIHBsYXllcjoganNwYi5NZXNzYWdlLmdldEZpZWxkV2l0aERlZmF1bHQobXNnLCAyLCBcIlwiKSxcbiAgICBjYW1wYWlnbjoganNwYi5NZXNzYWdlLmdldEZpZWxkV2l0aERlZmF1bHQobXNnLCAzLCBcIlwiKSxcbiAgICBkZXNjcmlwdGlvbjoganNwYi5NZXNzYWdlLmdldEZpZWxkV2l0aERlZmF1bHQobXNnLCA0LCBcIlwiKSxcbiAgICBzdHJlbmd0aDoganNwYi5NZXNzYWdlLmdldEZpZWxkV2l0aERlZmF1bHQobXNnLCA2LCAwKSxcbiAgICBkZXh0ZXJpdHk6IGpzcGIuTWVzc2FnZS5nZXRGaWVsZFdpdGhEZWZhdWx0KG1zZywgNywgMCksXG4gICAgc3RhbWluYToganNwYi5NZXNzYWdlLmdldEZpZWxkV2l0aERlZmF1bHQobXNnLCA4LCAwKSxcbiAgICBpbnRlbGxpZ2VuY2U6IGpzcGIuTWVzc2FnZS5nZXRGaWVsZFdpdGhEZWZhdWx0KG1zZywgOSwgMCksXG4gICAgd2l0czoganNwYi5NZXNzYWdlLmdldEZpZWxkV2l0aERlZmF1bHQobXNnLCAxMCwgMCksXG4gICAgcmVzb2x2ZToganNwYi5NZXNzYWdlLmdldEZpZWxkV2l0aERlZmF1bHQobXNnLCAxMSwgMCksXG4gICAgcHJlc2VuY2U6IGpzcGIuTWVzc2FnZS5nZXRGaWVsZFdpdGhEZWZhdWx0KG1zZywgMTIsIDApLFxuICAgIG1hbmlwdWxhdGlvbjoganNwYi5NZXNzYWdlLmdldEZpZWxkV2l0aERlZmF1bHQobXNnLCAxMywgMCksXG4gICAgY29tcG9zdXJlOiBqc3BiLk1lc3NhZ2UuZ2V0RmllbGRXaXRoRGVmYXVsdChtc2csIDE0LCAwKSxcbiAgICBwaHlzaWNhbFNraWxsc01hcDogKGYgPSBtc2cuZ2V0UGh5c2ljYWxTa2lsbHNNYXAoKSkgPyBmLnRvT2JqZWN0KGluY2x1ZGVJbnN0YW5jZSwgcHJvdG8ubW9kZWxzLnByb3RvLmNvZmQuQ29mZFNoZWV0LlNraWxsLnRvT2JqZWN0KSA6IFtdLFxuICAgIG1lbnRhbFNraWxsc01hcDogKGYgPSBtc2cuZ2V0TWVudGFsU2tpbGxzTWFwKCkpID8gZi50b09iamVjdChpbmNsdWRlSW5zdGFuY2UsIHByb3RvLm1vZGVscy5wcm90by5jb2ZkLkNvZmRTaGVldC5Ta2lsbC50b09iamVjdCkgOiBbXSxcbiAgICBzb2NpYWxTa2lsbHNNYXA6IChmID0gbXNnLmdldFNvY2lhbFNraWxsc01hcCgpKSA/IGYudG9PYmplY3QoaW5jbHVkZUluc3RhbmNlLCBwcm90by5tb2RlbHMucHJvdG8uY29mZC5Db2ZkU2hlZXQuU2tpbGwudG9PYmplY3QpIDogW10sXG4gICAgbWVyaXRzTGlzdDoganNwYi5NZXNzYWdlLnRvT2JqZWN0TGlzdChtc2cuZ2V0TWVyaXRzTGlzdCgpLFxuICAgIHByb3RvLm1vZGVscy5wcm90by5jb2ZkLkNvZmRTaGVldC5NZXJpdC50b09iamVjdCwgaW5jbHVkZUluc3RhbmNlKSxcbiAgICBjb25kaXRpb25zTGlzdDoganNwYi5NZXNzYWdlLnRvT2JqZWN0TGlzdChtc2cuZ2V0Q29uZGl0aW9uc0xpc3QoKSxcbiAgICBwcm90by5tb2RlbHMucHJvdG8uY29mZC5Db2ZkU2hlZXQuQ29uZGl0aW9uLnRvT2JqZWN0LCBpbmNsdWRlSW5zdGFuY2UpLFxuICAgIHNpemU6IGpzcGIuTWVzc2FnZS5nZXRGaWVsZFdpdGhEZWZhdWx0KG1zZywgMjAsIDApLFxuICAgIGhlYWx0aDoganNwYi5NZXNzYWdlLmdldEZpZWxkV2l0aERlZmF1bHQobXNnLCAyMSwgMCksXG4gICAgd2lsbHBvd2VyOiBqc3BiLk1lc3NhZ2UuZ2V0RmllbGRXaXRoRGVmYXVsdChtc2csIDIyLCAwKSxcbiAgICBleHBlcmllbmNlUG9pbnRzOiBqc3BiLk1lc3NhZ2UuZ2V0RmllbGRXaXRoRGVmYXVsdChtc2csIDIzLCAwKSxcbiAgICBiZWF0czoganNwYi5NZXNzYWdlLmdldEZpZWxkV2l0aERlZmF1bHQobXNnLCAyNCwgMCksXG4gICAgaXRlbXNMaXN0OiBqc3BiLk1lc3NhZ2UudG9PYmplY3RMaXN0KG1zZy5nZXRJdGVtc0xpc3QoKSxcbiAgICBwcm90by5tb2RlbHMucHJvdG8uY29mZC5Db2ZkU2hlZXQuSXRlbS50b09iamVjdCwgaW5jbHVkZUluc3RhbmNlKSxcbiAgICBhdHRhY2tzTGlzdDoganNwYi5NZXNzYWdlLnRvT2JqZWN0TGlzdChtc2cuZ2V0QXR0YWNrc0xpc3QoKSxcbiAgICBwcm90by5tb2RlbHMucHJvdG8uY29mZC5Db2ZkU2hlZXQuQXR0YWNrLnRvT2JqZWN0LCBpbmNsdWRlSW5zdGFuY2UpLFxuICAgIG90aGVyRGF0YU1hcDogKGYgPSBtc2cuZ2V0T3RoZXJEYXRhTWFwKCkpID8gZi50b09iamVjdChpbmNsdWRlSW5zdGFuY2UsIHVuZGVmaW5lZCkgOiBbXSxcbiAgICBjb3JlOiAoZiA9IG1zZy5nZXRDb3JlKCkpICYmIHByb3RvLm1vZGVscy5wcm90by5jb2ZkLkNvcmVGaWVsZHMudG9PYmplY3QoaW5jbHVkZUluc3RhbmNlLCBmKSxcbiAgICBtYWdlOiAoZiA9IG1zZy5nZXRNYWdlKCkpICYmIHByb3RvLm1vZGVscy5wcm90by5jb2ZkLk1hZ2VGaWVsZHMudG9PYmplY3QoaW5jbHVkZUluc3RhbmNlLCBmKSxcbiAgICBjaGFuZ2VsaW5nOiAoZiA9IG1zZy5nZXRDaGFuZ2VsaW5nKCkpICYmIHByb3RvLm1vZGVscy5wcm90by5jb2ZkLkNoYW5nZWxpbmdGaWVsZHMudG9PYmplY3QoaW5jbHVkZUluc3RhbmNlLCBmKVxuICB9O1xuXG4gIGlmIChpbmNsdWRlSW5zdGFuY2UpIHtcbiAgICBvYmouJGpzcGJNZXNzYWdlSW5zdGFuY2UgPSBtc2c7XG4gIH1cbiAgcmV0dXJuIG9iajtcbn07XG59XG5cblxuLyoqXG4gKiBEZXNlcmlhbGl6ZXMgYmluYXJ5IGRhdGEgKGluIHByb3RvYnVmIHdpcmUgZm9ybWF0KS5cbiAqIEBwYXJhbSB7anNwYi5CeXRlU291cmNlfSBieXRlcyBUaGUgYnl0ZXMgdG8gZGVzZXJpYWxpemUuXG4gKiBAcmV0dXJuIHshcHJvdG8ubW9kZWxzLnByb3RvLmNvZmQuQ29mZFNoZWV0fVxuICovXG5wcm90by5tb2RlbHMucHJvdG8uY29mZC5Db2ZkU2hlZXQuZGVzZXJpYWxpemVCaW5hcnkgPSBmdW5jdGlvbihieXRlcykge1xuICB2YXIgcmVhZGVyID0gbmV3IGpzcGIuQmluYXJ5UmVhZGVyKGJ5dGVzKTtcbiAgdmFyIG1zZyA9IG5ldyBwcm90by5tb2RlbHMucHJvdG8uY29mZC5Db2ZkU2hlZXQ7XG4gIHJldHVybiBwcm90by5tb2RlbHMucHJvdG8uY29mZC5Db2ZkU2hlZXQuZGVzZXJpYWxpemVCaW5hcnlGcm9tUmVhZGVyKG1zZywgcmVhZGVyKTtcbn07XG5cblxuLyoqXG4gKiBEZXNlcmlhbGl6ZXMgYmluYXJ5IGRhdGEgKGluIHByb3RvYnVmIHdpcmUgZm9ybWF0KSBmcm9tIHRoZVxuICogZ2l2ZW4gcmVhZGVyIGludG8gdGhlIGdpdmVuIG1lc3NhZ2Ugb2JqZWN0LlxuICogQHBhcmFtIHshcHJvdG8ubW9kZWxzLnByb3RvLmNvZmQuQ29mZFNoZWV0fSBtc2cgVGhlIG1lc3NhZ2Ugb2JqZWN0IHRvIGRlc2VyaWFsaXplIGludG8uXG4gKiBAcGFyYW0geyFqc3BiLkJpbmFyeVJlYWRlcn0gcmVhZGVyIFRoZSBCaW5hcnlSZWFkZXIgdG8gdXNlLlxuICogQHJldHVybiB7IXByb3RvLm1vZGVscy5wcm90by5jb2ZkLkNvZmRTaGVldH1cbiAqL1xucHJvdG8ubW9kZWxzLnByb3RvLmNvZmQuQ29mZFNoZWV0LmRlc2VyaWFsaXplQmluYXJ5RnJvbVJlYWRlciA9IGZ1bmN0aW9uKG1zZywgcmVhZGVyKSB7XG4gIHdoaWxlIChyZWFkZXIubmV4dEZpZWxkKCkpIHtcbiAgICBpZiAocmVhZGVyLmlzRW5kR3JvdXAoKSkge1xuICAgICAgYnJlYWs7XG4gICAgfVxuICAgIHZhciBmaWVsZCA9IHJlYWRlci5nZXRGaWVsZE51bWJlcigpO1xuICAgIHN3aXRjaCAoZmllbGQpIHtcbiAgICBjYXNlIDE6XG4gICAgICB2YXIgdmFsdWUgPSAvKiogQHR5cGUge3N0cmluZ30gKi8gKHJlYWRlci5yZWFkU3RyaW5nKCkpO1xuICAgICAgbXNnLnNldE5hbWUodmFsdWUpO1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSAyOlxuICAgICAgdmFyIHZhbHVlID0gLyoqIEB0eXBlIHtzdHJpbmd9ICovIChyZWFkZXIucmVhZFN0cmluZygpKTtcbiAgICAgIG1zZy5zZXRQbGF5ZXIodmFsdWUpO1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSAzOlxuICAgICAgdmFyIHZhbHVlID0gLyoqIEB0eXBlIHtzdHJpbmd9ICovIChyZWFkZXIucmVhZFN0cmluZygpKTtcbiAgICAgIG1zZy5zZXRDYW1wYWlnbih2YWx1ZSk7XG4gICAgICBicmVhaztcbiAgICBjYXNlIDQ6XG4gICAgICB2YXIgdmFsdWUgPSAvKiogQHR5cGUge3N0cmluZ30gKi8gKHJlYWRlci5yZWFkU3RyaW5nKCkpO1xuICAgICAgbXNnLnNldERlc2NyaXB0aW9uKHZhbHVlKTtcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgNjpcbiAgICAgIHZhciB2YWx1ZSA9IC8qKiBAdHlwZSB7bnVtYmVyfSAqLyAocmVhZGVyLnJlYWRJbnQzMigpKTtcbiAgICAgIG1zZy5zZXRTdHJlbmd0aCh2YWx1ZSk7XG4gICAgICBicmVhaztcbiAgICBjYXNlIDc6XG4gICAgICB2YXIgdmFsdWUgPSAvKiogQHR5cGUge251bWJlcn0gKi8gKHJlYWRlci5yZWFkSW50MzIoKSk7XG4gICAgICBtc2cuc2V0RGV4dGVyaXR5KHZhbHVlKTtcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgODpcbiAgICAgIHZhciB2YWx1ZSA9IC8qKiBAdHlwZSB7bnVtYmVyfSAqLyAocmVhZGVyLnJlYWRJbnQzMigpKTtcbiAgICAgIG1zZy5zZXRTdGFtaW5hKHZhbHVlKTtcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgOTpcbiAgICAgIHZhciB2YWx1ZSA9IC8qKiBAdHlwZSB7bnVtYmVyfSAqLyAocmVhZGVyLnJlYWRJbnQzMigpKTtcbiAgICAgIG1zZy5zZXRJbnRlbGxpZ2VuY2UodmFsdWUpO1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSAxMDpcbiAgICAgIHZhciB2YWx1ZSA9IC8qKiBAdHlwZSB7bnVtYmVyfSAqLyAocmVhZGVyLnJlYWRJbnQzMigpKTtcbiAgICAgIG1zZy5zZXRXaXRzKHZhbHVlKTtcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgMTE6XG4gICAgICB2YXIgdmFsdWUgPSAvKiogQHR5cGUge251bWJlcn0gKi8gKHJlYWRlci5yZWFkSW50MzIoKSk7XG4gICAgICBtc2cuc2V0UmVzb2x2ZSh2YWx1ZSk7XG4gICAgICBicmVhaztcbiAgICBjYXNlIDEyOlxuICAgICAgdmFyIHZhbHVlID0gLyoqIEB0eXBlIHtudW1iZXJ9ICovIChyZWFkZXIucmVhZEludDMyKCkpO1xuICAgICAgbXNnLnNldFByZXNlbmNlKHZhbHVlKTtcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgMTM6XG4gICAgICB2YXIgdmFsdWUgPSAvKiogQHR5cGUge251bWJlcn0gKi8gKHJlYWRlci5yZWFkSW50MzIoKSk7XG4gICAgICBtc2cuc2V0TWFuaXB1bGF0aW9uKHZhbHVlKTtcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgMTQ6XG4gICAgICB2YXIgdmFsdWUgPSAvKiogQHR5cGUge251bWJlcn0gKi8gKHJlYWRlci5yZWFkSW50MzIoKSk7XG4gICAgICBtc2cuc2V0Q29tcG9zdXJlKHZhbHVlKTtcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgMTY6XG4gICAgICB2YXIgdmFsdWUgPSBtc2cuZ2V0UGh5c2ljYWxTa2lsbHNNYXAoKTtcbiAgICAgIHJlYWRlci5yZWFkTWVzc2FnZSh2YWx1ZSwgZnVuY3Rpb24obWVzc2FnZSwgcmVhZGVyKSB7XG4gICAgICAgIGpzcGIuTWFwLmRlc2VyaWFsaXplQmluYXJ5KG1lc3NhZ2UsIHJlYWRlciwganNwYi5CaW5hcnlSZWFkZXIucHJvdG90eXBlLnJlYWRTdHJpbmcsIGpzcGIuQmluYXJ5UmVhZGVyLnByb3RvdHlwZS5yZWFkTWVzc2FnZSwgcHJvdG8ubW9kZWxzLnByb3RvLmNvZmQuQ29mZFNoZWV0LlNraWxsLmRlc2VyaWFsaXplQmluYXJ5RnJvbVJlYWRlciwgXCJcIiwgbmV3IHByb3RvLm1vZGVscy5wcm90by5jb2ZkLkNvZmRTaGVldC5Ta2lsbCgpKTtcbiAgICAgICAgIH0pO1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSAxNzpcbiAgICAgIHZhciB2YWx1ZSA9IG1zZy5nZXRNZW50YWxTa2lsbHNNYXAoKTtcbiAgICAgIHJlYWRlci5yZWFkTWVzc2FnZSh2YWx1ZSwgZnVuY3Rpb24obWVzc2FnZSwgcmVhZGVyKSB7XG4gICAgICAgIGpzcGIuTWFwLmRlc2VyaWFsaXplQmluYXJ5KG1lc3NhZ2UsIHJlYWRlciwganNwYi5CaW5hcnlSZWFkZXIucHJvdG90eXBlLnJlYWRTdHJpbmcsIGpzcGIuQmluYXJ5UmVhZGVyLnByb3RvdHlwZS5yZWFkTWVzc2FnZSwgcHJvdG8ubW9kZWxzLnByb3RvLmNvZmQuQ29mZFNoZWV0LlNraWxsLmRlc2VyaWFsaXplQmluYXJ5RnJvbVJlYWRlciwgXCJcIiwgbmV3IHByb3RvLm1vZGVscy5wcm90by5jb2ZkLkNvZmRTaGVldC5Ta2lsbCgpKTtcbiAgICAgICAgIH0pO1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSAxODpcbiAgICAgIHZhciB2YWx1ZSA9IG1zZy5nZXRTb2NpYWxTa2lsbHNNYXAoKTtcbiAgICAgIHJlYWRlci5yZWFkTWVzc2FnZSh2YWx1ZSwgZnVuY3Rpb24obWVzc2FnZSwgcmVhZGVyKSB7XG4gICAgICAgIGpzcGIuTWFwLmRlc2VyaWFsaXplQmluYXJ5KG1lc3NhZ2UsIHJlYWRlciwganNwYi5CaW5hcnlSZWFkZXIucHJvdG90eXBlLnJlYWRTdHJpbmcsIGpzcGIuQmluYXJ5UmVhZGVyLnByb3RvdHlwZS5yZWFkTWVzc2FnZSwgcHJvdG8ubW9kZWxzLnByb3RvLmNvZmQuQ29mZFNoZWV0LlNraWxsLmRlc2VyaWFsaXplQmluYXJ5RnJvbVJlYWRlciwgXCJcIiwgbmV3IHByb3RvLm1vZGVscy5wcm90by5jb2ZkLkNvZmRTaGVldC5Ta2lsbCgpKTtcbiAgICAgICAgIH0pO1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSAxNTpcbiAgICAgIHZhciB2YWx1ZSA9IG5ldyBwcm90by5tb2RlbHMucHJvdG8uY29mZC5Db2ZkU2hlZXQuTWVyaXQ7XG4gICAgICByZWFkZXIucmVhZE1lc3NhZ2UodmFsdWUscHJvdG8ubW9kZWxzLnByb3RvLmNvZmQuQ29mZFNoZWV0Lk1lcml0LmRlc2VyaWFsaXplQmluYXJ5RnJvbVJlYWRlcik7XG4gICAgICBtc2cuYWRkTWVyaXRzKHZhbHVlKTtcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgMTk6XG4gICAgICB2YXIgdmFsdWUgPSBuZXcgcHJvdG8ubW9kZWxzLnByb3RvLmNvZmQuQ29mZFNoZWV0LkNvbmRpdGlvbjtcbiAgICAgIHJlYWRlci5yZWFkTWVzc2FnZSh2YWx1ZSxwcm90by5tb2RlbHMucHJvdG8uY29mZC5Db2ZkU2hlZXQuQ29uZGl0aW9uLmRlc2VyaWFsaXplQmluYXJ5RnJvbVJlYWRlcik7XG4gICAgICBtc2cuYWRkQ29uZGl0aW9ucyh2YWx1ZSk7XG4gICAgICBicmVhaztcbiAgICBjYXNlIDIwOlxuICAgICAgdmFyIHZhbHVlID0gLyoqIEB0eXBlIHtudW1iZXJ9ICovIChyZWFkZXIucmVhZEludDMyKCkpO1xuICAgICAgbXNnLnNldFNpemUodmFsdWUpO1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSAyMTpcbiAgICAgIHZhciB2YWx1ZSA9IC8qKiBAdHlwZSB7bnVtYmVyfSAqLyAocmVhZGVyLnJlYWRJbnQzMigpKTtcbiAgICAgIG1zZy5zZXRIZWFsdGgodmFsdWUpO1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSAyMjpcbiAgICAgIHZhciB2YWx1ZSA9IC8qKiBAdHlwZSB7bnVtYmVyfSAqLyAocmVhZGVyLnJlYWRJbnQzMigpKTtcbiAgICAgIG1zZy5zZXRXaWxscG93ZXIodmFsdWUpO1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSAyMzpcbiAgICAgIHZhciB2YWx1ZSA9IC8qKiBAdHlwZSB7bnVtYmVyfSAqLyAocmVhZGVyLnJlYWRJbnQzMigpKTtcbiAgICAgIG1zZy5zZXRFeHBlcmllbmNlUG9pbnRzKHZhbHVlKTtcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgMjQ6XG4gICAgICB2YXIgdmFsdWUgPSAvKiogQHR5cGUge251bWJlcn0gKi8gKHJlYWRlci5yZWFkSW50MzIoKSk7XG4gICAgICBtc2cuc2V0QmVhdHModmFsdWUpO1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSAyNTpcbiAgICAgIHZhciB2YWx1ZSA9IG5ldyBwcm90by5tb2RlbHMucHJvdG8uY29mZC5Db2ZkU2hlZXQuSXRlbTtcbiAgICAgIHJlYWRlci5yZWFkTWVzc2FnZSh2YWx1ZSxwcm90by5tb2RlbHMucHJvdG8uY29mZC5Db2ZkU2hlZXQuSXRlbS5kZXNlcmlhbGl6ZUJpbmFyeUZyb21SZWFkZXIpO1xuICAgICAgbXNnLmFkZEl0ZW1zKHZhbHVlKTtcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgMjY6XG4gICAgICB2YXIgdmFsdWUgPSBuZXcgcHJvdG8ubW9kZWxzLnByb3RvLmNvZmQuQ29mZFNoZWV0LkF0dGFjaztcbiAgICAgIHJlYWRlci5yZWFkTWVzc2FnZSh2YWx1ZSxwcm90by5tb2RlbHMucHJvdG8uY29mZC5Db2ZkU2hlZXQuQXR0YWNrLmRlc2VyaWFsaXplQmluYXJ5RnJvbVJlYWRlcik7XG4gICAgICBtc2cuYWRkQXR0YWNrcyh2YWx1ZSk7XG4gICAgICBicmVhaztcbiAgICBjYXNlIDI3OlxuICAgICAgdmFyIHZhbHVlID0gbXNnLmdldE90aGVyRGF0YU1hcCgpO1xuICAgICAgcmVhZGVyLnJlYWRNZXNzYWdlKHZhbHVlLCBmdW5jdGlvbihtZXNzYWdlLCByZWFkZXIpIHtcbiAgICAgICAganNwYi5NYXAuZGVzZXJpYWxpemVCaW5hcnkobWVzc2FnZSwgcmVhZGVyLCBqc3BiLkJpbmFyeVJlYWRlci5wcm90b3R5cGUucmVhZFN0cmluZywganNwYi5CaW5hcnlSZWFkZXIucHJvdG90eXBlLnJlYWRTdHJpbmcsIG51bGwsIFwiXCIsIFwiXCIpO1xuICAgICAgICAgfSk7XG4gICAgICBicmVhaztcbiAgICBjYXNlIDI4OlxuICAgICAgdmFyIHZhbHVlID0gbmV3IHByb3RvLm1vZGVscy5wcm90by5jb2ZkLkNvcmVGaWVsZHM7XG4gICAgICByZWFkZXIucmVhZE1lc3NhZ2UodmFsdWUscHJvdG8ubW9kZWxzLnByb3RvLmNvZmQuQ29yZUZpZWxkcy5kZXNlcmlhbGl6ZUJpbmFyeUZyb21SZWFkZXIpO1xuICAgICAgbXNnLnNldENvcmUodmFsdWUpO1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSAyOTpcbiAgICAgIHZhciB2YWx1ZSA9IG5ldyBwcm90by5tb2RlbHMucHJvdG8uY29mZC5NYWdlRmllbGRzO1xuICAgICAgcmVhZGVyLnJlYWRNZXNzYWdlKHZhbHVlLHByb3RvLm1vZGVscy5wcm90by5jb2ZkLk1hZ2VGaWVsZHMuZGVzZXJpYWxpemVCaW5hcnlGcm9tUmVhZGVyKTtcbiAgICAgIG1zZy5zZXRNYWdlKHZhbHVlKTtcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgMzA6XG4gICAgICB2YXIgdmFsdWUgPSBuZXcgcHJvdG8ubW9kZWxzLnByb3RvLmNvZmQuQ2hhbmdlbGluZ0ZpZWxkcztcbiAgICAgIHJlYWRlci5yZWFkTWVzc2FnZSh2YWx1ZSxwcm90by5tb2RlbHMucHJvdG8uY29mZC5DaGFuZ2VsaW5nRmllbGRzLmRlc2VyaWFsaXplQmluYXJ5RnJvbVJlYWRlcik7XG4gICAgICBtc2cuc2V0Q2hhbmdlbGluZyh2YWx1ZSk7XG4gICAgICBicmVhaztcbiAgICBkZWZhdWx0OlxuICAgICAgcmVhZGVyLnNraXBGaWVsZCgpO1xuICAgICAgYnJlYWs7XG4gICAgfVxuICB9XG4gIHJldHVybiBtc2c7XG59O1xuXG5cbi8qKlxuICogU2VyaWFsaXplcyB0aGUgbWVzc2FnZSB0byBiaW5hcnkgZGF0YSAoaW4gcHJvdG9idWYgd2lyZSBmb3JtYXQpLlxuICogQHJldHVybiB7IVVpbnQ4QXJyYXl9XG4gKi9cbnByb3RvLm1vZGVscy5wcm90by5jb2ZkLkNvZmRTaGVldC5wcm90b3R5cGUuc2VyaWFsaXplQmluYXJ5ID0gZnVuY3Rpb24oKSB7XG4gIHZhciB3cml0ZXIgPSBuZXcganNwYi5CaW5hcnlXcml0ZXIoKTtcbiAgcHJvdG8ubW9kZWxzLnByb3RvLmNvZmQuQ29mZFNoZWV0LnNlcmlhbGl6ZUJpbmFyeVRvV3JpdGVyKHRoaXMsIHdyaXRlcik7XG4gIHJldHVybiB3cml0ZXIuZ2V0UmVzdWx0QnVmZmVyKCk7XG59O1xuXG5cbi8qKlxuICogU2VyaWFsaXplcyB0aGUgZ2l2ZW4gbWVzc2FnZSB0byBiaW5hcnkgZGF0YSAoaW4gcHJvdG9idWYgd2lyZVxuICogZm9ybWF0KSwgd3JpdGluZyB0byB0aGUgZ2l2ZW4gQmluYXJ5V3JpdGVyLlxuICogQHBhcmFtIHshcHJvdG8ubW9kZWxzLnByb3RvLmNvZmQuQ29mZFNoZWV0fSBtZXNzYWdlXG4gKiBAcGFyYW0geyFqc3BiLkJpbmFyeVdyaXRlcn0gd3JpdGVyXG4gKiBAc3VwcHJlc3Mge3VudXNlZExvY2FsVmFyaWFibGVzfSBmIGlzIG9ubHkgdXNlZCBmb3IgbmVzdGVkIG1lc3NhZ2VzXG4gKi9cbnByb3RvLm1vZGVscy5wcm90by5jb2ZkLkNvZmRTaGVldC5zZXJpYWxpemVCaW5hcnlUb1dyaXRlciA9IGZ1bmN0aW9uKG1lc3NhZ2UsIHdyaXRlcikge1xuICB2YXIgZiA9IHVuZGVmaW5lZDtcbiAgZiA9IG1lc3NhZ2UuZ2V0TmFtZSgpO1xuICBpZiAoZi5sZW5ndGggPiAwKSB7XG4gICAgd3JpdGVyLndyaXRlU3RyaW5nKFxuICAgICAgMSxcbiAgICAgIGZcbiAgICApO1xuICB9XG4gIGYgPSBtZXNzYWdlLmdldFBsYXllcigpO1xuICBpZiAoZi5sZW5ndGggPiAwKSB7XG4gICAgd3JpdGVyLndyaXRlU3RyaW5nKFxuICAgICAgMixcbiAgICAgIGZcbiAgICApO1xuICB9XG4gIGYgPSBtZXNzYWdlLmdldENhbXBhaWduKCk7XG4gIGlmIChmLmxlbmd0aCA+IDApIHtcbiAgICB3cml0ZXIud3JpdGVTdHJpbmcoXG4gICAgICAzLFxuICAgICAgZlxuICAgICk7XG4gIH1cbiAgZiA9IG1lc3NhZ2UuZ2V0RGVzY3JpcHRpb24oKTtcbiAgaWYgKGYubGVuZ3RoID4gMCkge1xuICAgIHdyaXRlci53cml0ZVN0cmluZyhcbiAgICAgIDQsXG4gICAgICBmXG4gICAgKTtcbiAgfVxuICBmID0gbWVzc2FnZS5nZXRTdHJlbmd0aCgpO1xuICBpZiAoZiAhPT0gMCkge1xuICAgIHdyaXRlci53cml0ZUludDMyKFxuICAgICAgNixcbiAgICAgIGZcbiAgICApO1xuICB9XG4gIGYgPSBtZXNzYWdlLmdldERleHRlcml0eSgpO1xuICBpZiAoZiAhPT0gMCkge1xuICAgIHdyaXRlci53cml0ZUludDMyKFxuICAgICAgNyxcbiAgICAgIGZcbiAgICApO1xuICB9XG4gIGYgPSBtZXNzYWdlLmdldFN0YW1pbmEoKTtcbiAgaWYgKGYgIT09IDApIHtcbiAgICB3cml0ZXIud3JpdGVJbnQzMihcbiAgICAgIDgsXG4gICAgICBmXG4gICAgKTtcbiAgfVxuICBmID0gbWVzc2FnZS5nZXRJbnRlbGxpZ2VuY2UoKTtcbiAgaWYgKGYgIT09IDApIHtcbiAgICB3cml0ZXIud3JpdGVJbnQzMihcbiAgICAgIDksXG4gICAgICBmXG4gICAgKTtcbiAgfVxuICBmID0gbWVzc2FnZS5nZXRXaXRzKCk7XG4gIGlmIChmICE9PSAwKSB7XG4gICAgd3JpdGVyLndyaXRlSW50MzIoXG4gICAgICAxMCxcbiAgICAgIGZcbiAgICApO1xuICB9XG4gIGYgPSBtZXNzYWdlLmdldFJlc29sdmUoKTtcbiAgaWYgKGYgIT09IDApIHtcbiAgICB3cml0ZXIud3JpdGVJbnQzMihcbiAgICAgIDExLFxuICAgICAgZlxuICAgICk7XG4gIH1cbiAgZiA9IG1lc3NhZ2UuZ2V0UHJlc2VuY2UoKTtcbiAgaWYgKGYgIT09IDApIHtcbiAgICB3cml0ZXIud3JpdGVJbnQzMihcbiAgICAgIDEyLFxuICAgICAgZlxuICAgICk7XG4gIH1cbiAgZiA9IG1lc3NhZ2UuZ2V0TWFuaXB1bGF0aW9uKCk7XG4gIGlmIChmICE9PSAwKSB7XG4gICAgd3JpdGVyLndyaXRlSW50MzIoXG4gICAgICAxMyxcbiAgICAgIGZcbiAgICApO1xuICB9XG4gIGYgPSBtZXNzYWdlLmdldENvbXBvc3VyZSgpO1xuICBpZiAoZiAhPT0gMCkge1xuICAgIHdyaXRlci53cml0ZUludDMyKFxuICAgICAgMTQsXG4gICAgICBmXG4gICAgKTtcbiAgfVxuICBmID0gbWVzc2FnZS5nZXRQaHlzaWNhbFNraWxsc01hcCh0cnVlKTtcbiAgaWYgKGYgJiYgZi5nZXRMZW5ndGgoKSA+IDApIHtcbiAgICBmLnNlcmlhbGl6ZUJpbmFyeSgxNiwgd3JpdGVyLCBqc3BiLkJpbmFyeVdyaXRlci5wcm90b3R5cGUud3JpdGVTdHJpbmcsIGpzcGIuQmluYXJ5V3JpdGVyLnByb3RvdHlwZS53cml0ZU1lc3NhZ2UsIHByb3RvLm1vZGVscy5wcm90by5jb2ZkLkNvZmRTaGVldC5Ta2lsbC5zZXJpYWxpemVCaW5hcnlUb1dyaXRlcik7XG4gIH1cbiAgZiA9IG1lc3NhZ2UuZ2V0TWVudGFsU2tpbGxzTWFwKHRydWUpO1xuICBpZiAoZiAmJiBmLmdldExlbmd0aCgpID4gMCkge1xuICAgIGYuc2VyaWFsaXplQmluYXJ5KDE3LCB3cml0ZXIsIGpzcGIuQmluYXJ5V3JpdGVyLnByb3RvdHlwZS53cml0ZVN0cmluZywganNwYi5CaW5hcnlXcml0ZXIucHJvdG90eXBlLndyaXRlTWVzc2FnZSwgcHJvdG8ubW9kZWxzLnByb3RvLmNvZmQuQ29mZFNoZWV0LlNraWxsLnNlcmlhbGl6ZUJpbmFyeVRvV3JpdGVyKTtcbiAgfVxuICBmID0gbWVzc2FnZS5nZXRTb2NpYWxTa2lsbHNNYXAodHJ1ZSk7XG4gIGlmIChmICYmIGYuZ2V0TGVuZ3RoKCkgPiAwKSB7XG4gICAgZi5zZXJpYWxpemVCaW5hcnkoMTgsIHdyaXRlciwganNwYi5CaW5hcnlXcml0ZXIucHJvdG90eXBlLndyaXRlU3RyaW5nLCBqc3BiLkJpbmFyeVdyaXRlci5wcm90b3R5cGUud3JpdGVNZXNzYWdlLCBwcm90by5tb2RlbHMucHJvdG8uY29mZC5Db2ZkU2hlZXQuU2tpbGwuc2VyaWFsaXplQmluYXJ5VG9Xcml0ZXIpO1xuICB9XG4gIGYgPSBtZXNzYWdlLmdldE1lcml0c0xpc3QoKTtcbiAgaWYgKGYubGVuZ3RoID4gMCkge1xuICAgIHdyaXRlci53cml0ZVJlcGVhdGVkTWVzc2FnZShcbiAgICAgIDE1LFxuICAgICAgZixcbiAgICAgIHByb3RvLm1vZGVscy5wcm90by5jb2ZkLkNvZmRTaGVldC5NZXJpdC5zZXJpYWxpemVCaW5hcnlUb1dyaXRlclxuICAgICk7XG4gIH1cbiAgZiA9IG1lc3NhZ2UuZ2V0Q29uZGl0aW9uc0xpc3QoKTtcbiAgaWYgKGYubGVuZ3RoID4gMCkge1xuICAgIHdyaXRlci53cml0ZVJlcGVhdGVkTWVzc2FnZShcbiAgICAgIDE5LFxuICAgICAgZixcbiAgICAgIHByb3RvLm1vZGVscy5wcm90by5jb2ZkLkNvZmRTaGVldC5Db25kaXRpb24uc2VyaWFsaXplQmluYXJ5VG9Xcml0ZXJcbiAgICApO1xuICB9XG4gIGYgPSBtZXNzYWdlLmdldFNpemUoKTtcbiAgaWYgKGYgIT09IDApIHtcbiAgICB3cml0ZXIud3JpdGVJbnQzMihcbiAgICAgIDIwLFxuICAgICAgZlxuICAgICk7XG4gIH1cbiAgZiA9IG1lc3NhZ2UuZ2V0SGVhbHRoKCk7XG4gIGlmIChmICE9PSAwKSB7XG4gICAgd3JpdGVyLndyaXRlSW50MzIoXG4gICAgICAyMSxcbiAgICAgIGZcbiAgICApO1xuICB9XG4gIGYgPSBtZXNzYWdlLmdldFdpbGxwb3dlcigpO1xuICBpZiAoZiAhPT0gMCkge1xuICAgIHdyaXRlci53cml0ZUludDMyKFxuICAgICAgMjIsXG4gICAgICBmXG4gICAgKTtcbiAgfVxuICBmID0gbWVzc2FnZS5nZXRFeHBlcmllbmNlUG9pbnRzKCk7XG4gIGlmIChmICE9PSAwKSB7XG4gICAgd3JpdGVyLndyaXRlSW50MzIoXG4gICAgICAyMyxcbiAgICAgIGZcbiAgICApO1xuICB9XG4gIGYgPSBtZXNzYWdlLmdldEJlYXRzKCk7XG4gIGlmIChmICE9PSAwKSB7XG4gICAgd3JpdGVyLndyaXRlSW50MzIoXG4gICAgICAyNCxcbiAgICAgIGZcbiAgICApO1xuICB9XG4gIGYgPSBtZXNzYWdlLmdldEl0ZW1zTGlzdCgpO1xuICBpZiAoZi5sZW5ndGggPiAwKSB7XG4gICAgd3JpdGVyLndyaXRlUmVwZWF0ZWRNZXNzYWdlKFxuICAgICAgMjUsXG4gICAgICBmLFxuICAgICAgcHJvdG8ubW9kZWxzLnByb3RvLmNvZmQuQ29mZFNoZWV0Lkl0ZW0uc2VyaWFsaXplQmluYXJ5VG9Xcml0ZXJcbiAgICApO1xuICB9XG4gIGYgPSBtZXNzYWdlLmdldEF0dGFja3NMaXN0KCk7XG4gIGlmIChmLmxlbmd0aCA+IDApIHtcbiAgICB3cml0ZXIud3JpdGVSZXBlYXRlZE1lc3NhZ2UoXG4gICAgICAyNixcbiAgICAgIGYsXG4gICAgICBwcm90by5tb2RlbHMucHJvdG8uY29mZC5Db2ZkU2hlZXQuQXR0YWNrLnNlcmlhbGl6ZUJpbmFyeVRvV3JpdGVyXG4gICAgKTtcbiAgfVxuICBmID0gbWVzc2FnZS5nZXRPdGhlckRhdGFNYXAodHJ1ZSk7XG4gIGlmIChmICYmIGYuZ2V0TGVuZ3RoKCkgPiAwKSB7XG4gICAgZi5zZXJpYWxpemVCaW5hcnkoMjcsIHdyaXRlciwganNwYi5CaW5hcnlXcml0ZXIucHJvdG90eXBlLndyaXRlU3RyaW5nLCBqc3BiLkJpbmFyeVdyaXRlci5wcm90b3R5cGUud3JpdGVTdHJpbmcpO1xuICB9XG4gIGYgPSBtZXNzYWdlLmdldENvcmUoKTtcbiAgaWYgKGYgIT0gbnVsbCkge1xuICAgIHdyaXRlci53cml0ZU1lc3NhZ2UoXG4gICAgICAyOCxcbiAgICAgIGYsXG4gICAgICBwcm90by5tb2RlbHMucHJvdG8uY29mZC5Db3JlRmllbGRzLnNlcmlhbGl6ZUJpbmFyeVRvV3JpdGVyXG4gICAgKTtcbiAgfVxuICBmID0gbWVzc2FnZS5nZXRNYWdlKCk7XG4gIGlmIChmICE9IG51bGwpIHtcbiAgICB3cml0ZXIud3JpdGVNZXNzYWdlKFxuICAgICAgMjksXG4gICAgICBmLFxuICAgICAgcHJvdG8ubW9kZWxzLnByb3RvLmNvZmQuTWFnZUZpZWxkcy5zZXJpYWxpemVCaW5hcnlUb1dyaXRlclxuICAgICk7XG4gIH1cbiAgZiA9IG1lc3NhZ2UuZ2V0Q2hhbmdlbGluZygpO1xuICBpZiAoZiAhPSBudWxsKSB7XG4gICAgd3JpdGVyLndyaXRlTWVzc2FnZShcbiAgICAgIDMwLFxuICAgICAgZixcbiAgICAgIHByb3RvLm1vZGVscy5wcm90by5jb2ZkLkNoYW5nZWxpbmdGaWVsZHMuc2VyaWFsaXplQmluYXJ5VG9Xcml0ZXJcbiAgICApO1xuICB9XG59O1xuXG5cblxuXG5cbmlmIChqc3BiLk1lc3NhZ2UuR0VORVJBVEVfVE9fT0JKRUNUKSB7XG4vKipcbiAqIENyZWF0ZXMgYW4gb2JqZWN0IHJlcHJlc2VudGF0aW9uIG9mIHRoaXMgcHJvdG8uXG4gKiBGaWVsZCBuYW1lcyB0aGF0IGFyZSByZXNlcnZlZCBpbiBKYXZhU2NyaXB0IGFuZCB3aWxsIGJlIHJlbmFtZWQgdG8gcGJfbmFtZS5cbiAqIE9wdGlvbmFsIGZpZWxkcyB0aGF0IGFyZSBub3Qgc2V0IHdpbGwgYmUgc2V0IHRvIHVuZGVmaW5lZC5cbiAqIFRvIGFjY2VzcyBhIHJlc2VydmVkIGZpZWxkIHVzZSwgZm9vLnBiXzxuYW1lPiwgZWcsIGZvby5wYl9kZWZhdWx0LlxuICogRm9yIHRoZSBsaXN0IG9mIHJlc2VydmVkIG5hbWVzIHBsZWFzZSBzZWU6XG4gKiAgICAgbmV0L3Byb3RvMi9jb21waWxlci9qcy9pbnRlcm5hbC9nZW5lcmF0b3IuY2Mja0tleXdvcmQuXG4gKiBAcGFyYW0ge2Jvb2xlYW49fSBvcHRfaW5jbHVkZUluc3RhbmNlIERlcHJlY2F0ZWQuIHdoZXRoZXIgdG8gaW5jbHVkZSB0aGVcbiAqICAgICBKU1BCIGluc3RhbmNlIGZvciB0cmFuc2l0aW9uYWwgc295IHByb3RvIHN1cHBvcnQ6XG4gKiAgICAgaHR0cDovL2dvdG8vc295LXBhcmFtLW1pZ3JhdGlvblxuICogQHJldHVybiB7IU9iamVjdH1cbiAqL1xucHJvdG8ubW9kZWxzLnByb3RvLmNvZmQuQ29mZFNoZWV0Lk1lcml0LnByb3RvdHlwZS50b09iamVjdCA9IGZ1bmN0aW9uKG9wdF9pbmNsdWRlSW5zdGFuY2UpIHtcbiAgcmV0dXJuIHByb3RvLm1vZGVscy5wcm90by5jb2ZkLkNvZmRTaGVldC5NZXJpdC50b09iamVjdChvcHRfaW5jbHVkZUluc3RhbmNlLCB0aGlzKTtcbn07XG5cblxuLyoqXG4gKiBTdGF0aWMgdmVyc2lvbiBvZiB0aGUge0BzZWUgdG9PYmplY3R9IG1ldGhvZC5cbiAqIEBwYXJhbSB7Ym9vbGVhbnx1bmRlZmluZWR9IGluY2x1ZGVJbnN0YW5jZSBEZXByZWNhdGVkLiBXaGV0aGVyIHRvIGluY2x1ZGVcbiAqICAgICB0aGUgSlNQQiBpbnN0YW5jZSBmb3IgdHJhbnNpdGlvbmFsIHNveSBwcm90byBzdXBwb3J0OlxuICogICAgIGh0dHA6Ly9nb3RvL3NveS1wYXJhbS1taWdyYXRpb25cbiAqIEBwYXJhbSB7IXByb3RvLm1vZGVscy5wcm90by5jb2ZkLkNvZmRTaGVldC5NZXJpdH0gbXNnIFRoZSBtc2cgaW5zdGFuY2UgdG8gdHJhbnNmb3JtLlxuICogQHJldHVybiB7IU9iamVjdH1cbiAqIEBzdXBwcmVzcyB7dW51c2VkTG9jYWxWYXJpYWJsZXN9IGYgaXMgb25seSB1c2VkIGZvciBuZXN0ZWQgbWVzc2FnZXNcbiAqL1xucHJvdG8ubW9kZWxzLnByb3RvLmNvZmQuQ29mZFNoZWV0Lk1lcml0LnRvT2JqZWN0ID0gZnVuY3Rpb24oaW5jbHVkZUluc3RhbmNlLCBtc2cpIHtcbiAgdmFyIGYsIG9iaiA9IHtcbiAgICBkb3RzOiBqc3BiLk1lc3NhZ2UuZ2V0RmllbGRXaXRoRGVmYXVsdChtc2csIDEsIDApLFxuICAgIG5hbWU6IGpzcGIuTWVzc2FnZS5nZXRGaWVsZFdpdGhEZWZhdWx0KG1zZywgMiwgXCJcIilcbiAgfTtcblxuICBpZiAoaW5jbHVkZUluc3RhbmNlKSB7XG4gICAgb2JqLiRqc3BiTWVzc2FnZUluc3RhbmNlID0gbXNnO1xuICB9XG4gIHJldHVybiBvYmo7XG59O1xufVxuXG5cbi8qKlxuICogRGVzZXJpYWxpemVzIGJpbmFyeSBkYXRhIChpbiBwcm90b2J1ZiB3aXJlIGZvcm1hdCkuXG4gKiBAcGFyYW0ge2pzcGIuQnl0ZVNvdXJjZX0gYnl0ZXMgVGhlIGJ5dGVzIHRvIGRlc2VyaWFsaXplLlxuICogQHJldHVybiB7IXByb3RvLm1vZGVscy5wcm90by5jb2ZkLkNvZmRTaGVldC5NZXJpdH1cbiAqL1xucHJvdG8ubW9kZWxzLnByb3RvLmNvZmQuQ29mZFNoZWV0Lk1lcml0LmRlc2VyaWFsaXplQmluYXJ5ID0gZnVuY3Rpb24oYnl0ZXMpIHtcbiAgdmFyIHJlYWRlciA9IG5ldyBqc3BiLkJpbmFyeVJlYWRlcihieXRlcyk7XG4gIHZhciBtc2cgPSBuZXcgcHJvdG8ubW9kZWxzLnByb3RvLmNvZmQuQ29mZFNoZWV0Lk1lcml0O1xuICByZXR1cm4gcHJvdG8ubW9kZWxzLnByb3RvLmNvZmQuQ29mZFNoZWV0Lk1lcml0LmRlc2VyaWFsaXplQmluYXJ5RnJvbVJlYWRlcihtc2csIHJlYWRlcik7XG59O1xuXG5cbi8qKlxuICogRGVzZXJpYWxpemVzIGJpbmFyeSBkYXRhIChpbiBwcm90b2J1ZiB3aXJlIGZvcm1hdCkgZnJvbSB0aGVcbiAqIGdpdmVuIHJlYWRlciBpbnRvIHRoZSBnaXZlbiBtZXNzYWdlIG9iamVjdC5cbiAqIEBwYXJhbSB7IXByb3RvLm1vZGVscy5wcm90by5jb2ZkLkNvZmRTaGVldC5NZXJpdH0gbXNnIFRoZSBtZXNzYWdlIG9iamVjdCB0byBkZXNlcmlhbGl6ZSBpbnRvLlxuICogQHBhcmFtIHshanNwYi5CaW5hcnlSZWFkZXJ9IHJlYWRlciBUaGUgQmluYXJ5UmVhZGVyIHRvIHVzZS5cbiAqIEByZXR1cm4geyFwcm90by5tb2RlbHMucHJvdG8uY29mZC5Db2ZkU2hlZXQuTWVyaXR9XG4gKi9cbnByb3RvLm1vZGVscy5wcm90by5jb2ZkLkNvZmRTaGVldC5NZXJpdC5kZXNlcmlhbGl6ZUJpbmFyeUZyb21SZWFkZXIgPSBmdW5jdGlvbihtc2csIHJlYWRlcikge1xuICB3aGlsZSAocmVhZGVyLm5leHRGaWVsZCgpKSB7XG4gICAgaWYgKHJlYWRlci5pc0VuZEdyb3VwKCkpIHtcbiAgICAgIGJyZWFrO1xuICAgIH1cbiAgICB2YXIgZmllbGQgPSByZWFkZXIuZ2V0RmllbGROdW1iZXIoKTtcbiAgICBzd2l0Y2ggKGZpZWxkKSB7XG4gICAgY2FzZSAxOlxuICAgICAgdmFyIHZhbHVlID0gLyoqIEB0eXBlIHtudW1iZXJ9ICovIChyZWFkZXIucmVhZEludDMyKCkpO1xuICAgICAgbXNnLnNldERvdHModmFsdWUpO1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSAyOlxuICAgICAgdmFyIHZhbHVlID0gLyoqIEB0eXBlIHtzdHJpbmd9ICovIChyZWFkZXIucmVhZFN0cmluZygpKTtcbiAgICAgIG1zZy5zZXROYW1lKHZhbHVlKTtcbiAgICAgIGJyZWFrO1xuICAgIGRlZmF1bHQ6XG4gICAgICByZWFkZXIuc2tpcEZpZWxkKCk7XG4gICAgICBicmVhaztcbiAgICB9XG4gIH1cbiAgcmV0dXJuIG1zZztcbn07XG5cblxuLyoqXG4gKiBTZXJpYWxpemVzIHRoZSBtZXNzYWdlIHRvIGJpbmFyeSBkYXRhIChpbiBwcm90b2J1ZiB3aXJlIGZvcm1hdCkuXG4gKiBAcmV0dXJuIHshVWludDhBcnJheX1cbiAqL1xucHJvdG8ubW9kZWxzLnByb3RvLmNvZmQuQ29mZFNoZWV0Lk1lcml0LnByb3RvdHlwZS5zZXJpYWxpemVCaW5hcnkgPSBmdW5jdGlvbigpIHtcbiAgdmFyIHdyaXRlciA9IG5ldyBqc3BiLkJpbmFyeVdyaXRlcigpO1xuICBwcm90by5tb2RlbHMucHJvdG8uY29mZC5Db2ZkU2hlZXQuTWVyaXQuc2VyaWFsaXplQmluYXJ5VG9Xcml0ZXIodGhpcywgd3JpdGVyKTtcbiAgcmV0dXJuIHdyaXRlci5nZXRSZXN1bHRCdWZmZXIoKTtcbn07XG5cblxuLyoqXG4gKiBTZXJpYWxpemVzIHRoZSBnaXZlbiBtZXNzYWdlIHRvIGJpbmFyeSBkYXRhIChpbiBwcm90b2J1ZiB3aXJlXG4gKiBmb3JtYXQpLCB3cml0aW5nIHRvIHRoZSBnaXZlbiBCaW5hcnlXcml0ZXIuXG4gKiBAcGFyYW0geyFwcm90by5tb2RlbHMucHJvdG8uY29mZC5Db2ZkU2hlZXQuTWVyaXR9IG1lc3NhZ2VcbiAqIEBwYXJhbSB7IWpzcGIuQmluYXJ5V3JpdGVyfSB3cml0ZXJcbiAqIEBzdXBwcmVzcyB7dW51c2VkTG9jYWxWYXJpYWJsZXN9IGYgaXMgb25seSB1c2VkIGZvciBuZXN0ZWQgbWVzc2FnZXNcbiAqL1xucHJvdG8ubW9kZWxzLnByb3RvLmNvZmQuQ29mZFNoZWV0Lk1lcml0LnNlcmlhbGl6ZUJpbmFyeVRvV3JpdGVyID0gZnVuY3Rpb24obWVzc2FnZSwgd3JpdGVyKSB7XG4gIHZhciBmID0gdW5kZWZpbmVkO1xuICBmID0gbWVzc2FnZS5nZXREb3RzKCk7XG4gIGlmIChmICE9PSAwKSB7XG4gICAgd3JpdGVyLndyaXRlSW50MzIoXG4gICAgICAxLFxuICAgICAgZlxuICAgICk7XG4gIH1cbiAgZiA9IG1lc3NhZ2UuZ2V0TmFtZSgpO1xuICBpZiAoZi5sZW5ndGggPiAwKSB7XG4gICAgd3JpdGVyLndyaXRlU3RyaW5nKFxuICAgICAgMixcbiAgICAgIGZcbiAgICApO1xuICB9XG59O1xuXG5cbi8qKlxuICogb3B0aW9uYWwgaW50MzIgZG90cyA9IDE7XG4gKiBAcmV0dXJuIHtudW1iZXJ9XG4gKi9cbnByb3RvLm1vZGVscy5wcm90by5jb2ZkLkNvZmRTaGVldC5NZXJpdC5wcm90b3R5cGUuZ2V0RG90cyA9IGZ1bmN0aW9uKCkge1xuICByZXR1cm4gLyoqIEB0eXBlIHtudW1iZXJ9ICovIChqc3BiLk1lc3NhZ2UuZ2V0RmllbGRXaXRoRGVmYXVsdCh0aGlzLCAxLCAwKSk7XG59O1xuXG5cbi8qKlxuICogQHBhcmFtIHtudW1iZXJ9IHZhbHVlXG4gKiBAcmV0dXJuIHshcHJvdG8ubW9kZWxzLnByb3RvLmNvZmQuQ29mZFNoZWV0Lk1lcml0fSByZXR1cm5zIHRoaXNcbiAqL1xucHJvdG8ubW9kZWxzLnByb3RvLmNvZmQuQ29mZFNoZWV0Lk1lcml0LnByb3RvdHlwZS5zZXREb3RzID0gZnVuY3Rpb24odmFsdWUpIHtcbiAgcmV0dXJuIGpzcGIuTWVzc2FnZS5zZXRQcm90bzNJbnRGaWVsZCh0aGlzLCAxLCB2YWx1ZSk7XG59O1xuXG5cbi8qKlxuICogb3B0aW9uYWwgc3RyaW5nIG5hbWUgPSAyO1xuICogQHJldHVybiB7c3RyaW5nfVxuICovXG5wcm90by5tb2RlbHMucHJvdG8uY29mZC5Db2ZkU2hlZXQuTWVyaXQucHJvdG90eXBlLmdldE5hbWUgPSBmdW5jdGlvbigpIHtcbiAgcmV0dXJuIC8qKiBAdHlwZSB7c3RyaW5nfSAqLyAoanNwYi5NZXNzYWdlLmdldEZpZWxkV2l0aERlZmF1bHQodGhpcywgMiwgXCJcIikpO1xufTtcblxuXG4vKipcbiAqIEBwYXJhbSB7c3RyaW5nfSB2YWx1ZVxuICogQHJldHVybiB7IXByb3RvLm1vZGVscy5wcm90by5jb2ZkLkNvZmRTaGVldC5NZXJpdH0gcmV0dXJucyB0aGlzXG4gKi9cbnByb3RvLm1vZGVscy5wcm90by5jb2ZkLkNvZmRTaGVldC5NZXJpdC5wcm90b3R5cGUuc2V0TmFtZSA9IGZ1bmN0aW9uKHZhbHVlKSB7XG4gIHJldHVybiBqc3BiLk1lc3NhZ2Uuc2V0UHJvdG8zU3RyaW5nRmllbGQodGhpcywgMiwgdmFsdWUpO1xufTtcblxuXG5cblxuXG5pZiAoanNwYi5NZXNzYWdlLkdFTkVSQVRFX1RPX09CSkVDVCkge1xuLyoqXG4gKiBDcmVhdGVzIGFuIG9iamVjdCByZXByZXNlbnRhdGlvbiBvZiB0aGlzIHByb3RvLlxuICogRmllbGQgbmFtZXMgdGhhdCBhcmUgcmVzZXJ2ZWQgaW4gSmF2YVNjcmlwdCBhbmQgd2lsbCBiZSByZW5hbWVkIHRvIHBiX25hbWUuXG4gKiBPcHRpb25hbCBmaWVsZHMgdGhhdCBhcmUgbm90IHNldCB3aWxsIGJlIHNldCB0byB1bmRlZmluZWQuXG4gKiBUbyBhY2Nlc3MgYSByZXNlcnZlZCBmaWVsZCB1c2UsIGZvby5wYl88bmFtZT4sIGVnLCBmb28ucGJfZGVmYXVsdC5cbiAqIEZvciB0aGUgbGlzdCBvZiByZXNlcnZlZCBuYW1lcyBwbGVhc2Ugc2VlOlxuICogICAgIG5ldC9wcm90bzIvY29tcGlsZXIvanMvaW50ZXJuYWwvZ2VuZXJhdG9yLmNjI2tLZXl3b3JkLlxuICogQHBhcmFtIHtib29sZWFuPX0gb3B0X2luY2x1ZGVJbnN0YW5jZSBEZXByZWNhdGVkLiB3aGV0aGVyIHRvIGluY2x1ZGUgdGhlXG4gKiAgICAgSlNQQiBpbnN0YW5jZSBmb3IgdHJhbnNpdGlvbmFsIHNveSBwcm90byBzdXBwb3J0OlxuICogICAgIGh0dHA6Ly9nb3RvL3NveS1wYXJhbS1taWdyYXRpb25cbiAqIEByZXR1cm4geyFPYmplY3R9XG4gKi9cbnByb3RvLm1vZGVscy5wcm90by5jb2ZkLkNvZmRTaGVldC5Db25kaXRpb24ucHJvdG90eXBlLnRvT2JqZWN0ID0gZnVuY3Rpb24ob3B0X2luY2x1ZGVJbnN0YW5jZSkge1xuICByZXR1cm4gcHJvdG8ubW9kZWxzLnByb3RvLmNvZmQuQ29mZFNoZWV0LkNvbmRpdGlvbi50b09iamVjdChvcHRfaW5jbHVkZUluc3RhbmNlLCB0aGlzKTtcbn07XG5cblxuLyoqXG4gKiBTdGF0aWMgdmVyc2lvbiBvZiB0aGUge0BzZWUgdG9PYmplY3R9IG1ldGhvZC5cbiAqIEBwYXJhbSB7Ym9vbGVhbnx1bmRlZmluZWR9IGluY2x1ZGVJbnN0YW5jZSBEZXByZWNhdGVkLiBXaGV0aGVyIHRvIGluY2x1ZGVcbiAqICAgICB0aGUgSlNQQiBpbnN0YW5jZSBmb3IgdHJhbnNpdGlvbmFsIHNveSBwcm90byBzdXBwb3J0OlxuICogICAgIGh0dHA6Ly9nb3RvL3NveS1wYXJhbS1taWdyYXRpb25cbiAqIEBwYXJhbSB7IXByb3RvLm1vZGVscy5wcm90by5jb2ZkLkNvZmRTaGVldC5Db25kaXRpb259IG1zZyBUaGUgbXNnIGluc3RhbmNlIHRvIHRyYW5zZm9ybS5cbiAqIEByZXR1cm4geyFPYmplY3R9XG4gKiBAc3VwcHJlc3Mge3VudXNlZExvY2FsVmFyaWFibGVzfSBmIGlzIG9ubHkgdXNlZCBmb3IgbmVzdGVkIG1lc3NhZ2VzXG4gKi9cbnByb3RvLm1vZGVscy5wcm90by5jb2ZkLkNvZmRTaGVldC5Db25kaXRpb24udG9PYmplY3QgPSBmdW5jdGlvbihpbmNsdWRlSW5zdGFuY2UsIG1zZykge1xuICB2YXIgZiwgb2JqID0ge1xuICAgIG5hbWU6IGpzcGIuTWVzc2FnZS5nZXRGaWVsZFdpdGhEZWZhdWx0KG1zZywgMSwgXCJcIilcbiAgfTtcblxuICBpZiAoaW5jbHVkZUluc3RhbmNlKSB7XG4gICAgb2JqLiRqc3BiTWVzc2FnZUluc3RhbmNlID0gbXNnO1xuICB9XG4gIHJldHVybiBvYmo7XG59O1xufVxuXG5cbi8qKlxuICogRGVzZXJpYWxpemVzIGJpbmFyeSBkYXRhIChpbiBwcm90b2J1ZiB3aXJlIGZvcm1hdCkuXG4gKiBAcGFyYW0ge2pzcGIuQnl0ZVNvdXJjZX0gYnl0ZXMgVGhlIGJ5dGVzIHRvIGRlc2VyaWFsaXplLlxuICogQHJldHVybiB7IXByb3RvLm1vZGVscy5wcm90by5jb2ZkLkNvZmRTaGVldC5Db25kaXRpb259XG4gKi9cbnByb3RvLm1vZGVscy5wcm90by5jb2ZkLkNvZmRTaGVldC5Db25kaXRpb24uZGVzZXJpYWxpemVCaW5hcnkgPSBmdW5jdGlvbihieXRlcykge1xuICB2YXIgcmVhZGVyID0gbmV3IGpzcGIuQmluYXJ5UmVhZGVyKGJ5dGVzKTtcbiAgdmFyIG1zZyA9IG5ldyBwcm90by5tb2RlbHMucHJvdG8uY29mZC5Db2ZkU2hlZXQuQ29uZGl0aW9uO1xuICByZXR1cm4gcHJvdG8ubW9kZWxzLnByb3RvLmNvZmQuQ29mZFNoZWV0LkNvbmRpdGlvbi5kZXNlcmlhbGl6ZUJpbmFyeUZyb21SZWFkZXIobXNnLCByZWFkZXIpO1xufTtcblxuXG4vKipcbiAqIERlc2VyaWFsaXplcyBiaW5hcnkgZGF0YSAoaW4gcHJvdG9idWYgd2lyZSBmb3JtYXQpIGZyb20gdGhlXG4gKiBnaXZlbiByZWFkZXIgaW50byB0aGUgZ2l2ZW4gbWVzc2FnZSBvYmplY3QuXG4gKiBAcGFyYW0geyFwcm90by5tb2RlbHMucHJvdG8uY29mZC5Db2ZkU2hlZXQuQ29uZGl0aW9ufSBtc2cgVGhlIG1lc3NhZ2Ugb2JqZWN0IHRvIGRlc2VyaWFsaXplIGludG8uXG4gKiBAcGFyYW0geyFqc3BiLkJpbmFyeVJlYWRlcn0gcmVhZGVyIFRoZSBCaW5hcnlSZWFkZXIgdG8gdXNlLlxuICogQHJldHVybiB7IXByb3RvLm1vZGVscy5wcm90by5jb2ZkLkNvZmRTaGVldC5Db25kaXRpb259XG4gKi9cbnByb3RvLm1vZGVscy5wcm90by5jb2ZkLkNvZmRTaGVldC5Db25kaXRpb24uZGVzZXJpYWxpemVCaW5hcnlGcm9tUmVhZGVyID0gZnVuY3Rpb24obXNnLCByZWFkZXIpIHtcbiAgd2hpbGUgKHJlYWRlci5uZXh0RmllbGQoKSkge1xuICAgIGlmIChyZWFkZXIuaXNFbmRHcm91cCgpKSB7XG4gICAgICBicmVhaztcbiAgICB9XG4gICAgdmFyIGZpZWxkID0gcmVhZGVyLmdldEZpZWxkTnVtYmVyKCk7XG4gICAgc3dpdGNoIChmaWVsZCkge1xuICAgIGNhc2UgMTpcbiAgICAgIHZhciB2YWx1ZSA9IC8qKiBAdHlwZSB7c3RyaW5nfSAqLyAocmVhZGVyLnJlYWRTdHJpbmcoKSk7XG4gICAgICBtc2cuc2V0TmFtZSh2YWx1ZSk7XG4gICAgICBicmVhaztcbiAgICBkZWZhdWx0OlxuICAgICAgcmVhZGVyLnNraXBGaWVsZCgpO1xuICAgICAgYnJlYWs7XG4gICAgfVxuICB9XG4gIHJldHVybiBtc2c7XG59O1xuXG5cbi8qKlxuICogU2VyaWFsaXplcyB0aGUgbWVzc2FnZSB0byBiaW5hcnkgZGF0YSAoaW4gcHJvdG9idWYgd2lyZSBmb3JtYXQpLlxuICogQHJldHVybiB7IVVpbnQ4QXJyYXl9XG4gKi9cbnByb3RvLm1vZGVscy5wcm90by5jb2ZkLkNvZmRTaGVldC5Db25kaXRpb24ucHJvdG90eXBlLnNlcmlhbGl6ZUJpbmFyeSA9IGZ1bmN0aW9uKCkge1xuICB2YXIgd3JpdGVyID0gbmV3IGpzcGIuQmluYXJ5V3JpdGVyKCk7XG4gIHByb3RvLm1vZGVscy5wcm90by5jb2ZkLkNvZmRTaGVldC5Db25kaXRpb24uc2VyaWFsaXplQmluYXJ5VG9Xcml0ZXIodGhpcywgd3JpdGVyKTtcbiAgcmV0dXJuIHdyaXRlci5nZXRSZXN1bHRCdWZmZXIoKTtcbn07XG5cblxuLyoqXG4gKiBTZXJpYWxpemVzIHRoZSBnaXZlbiBtZXNzYWdlIHRvIGJpbmFyeSBkYXRhIChpbiBwcm90b2J1ZiB3aXJlXG4gKiBmb3JtYXQpLCB3cml0aW5nIHRvIHRoZSBnaXZlbiBCaW5hcnlXcml0ZXIuXG4gKiBAcGFyYW0geyFwcm90by5tb2RlbHMucHJvdG8uY29mZC5Db2ZkU2hlZXQuQ29uZGl0aW9ufSBtZXNzYWdlXG4gKiBAcGFyYW0geyFqc3BiLkJpbmFyeVdyaXRlcn0gd3JpdGVyXG4gKiBAc3VwcHJlc3Mge3VudXNlZExvY2FsVmFyaWFibGVzfSBmIGlzIG9ubHkgdXNlZCBmb3IgbmVzdGVkIG1lc3NhZ2VzXG4gKi9cbnByb3RvLm1vZGVscy5wcm90by5jb2ZkLkNvZmRTaGVldC5Db25kaXRpb24uc2VyaWFsaXplQmluYXJ5VG9Xcml0ZXIgPSBmdW5jdGlvbihtZXNzYWdlLCB3cml0ZXIpIHtcbiAgdmFyIGYgPSB1bmRlZmluZWQ7XG4gIGYgPSBtZXNzYWdlLmdldE5hbWUoKTtcbiAgaWYgKGYubGVuZ3RoID4gMCkge1xuICAgIHdyaXRlci53cml0ZVN0cmluZyhcbiAgICAgIDEsXG4gICAgICBmXG4gICAgKTtcbiAgfVxufTtcblxuXG4vKipcbiAqIG9wdGlvbmFsIHN0cmluZyBuYW1lID0gMTtcbiAqIEByZXR1cm4ge3N0cmluZ31cbiAqL1xucHJvdG8ubW9kZWxzLnByb3RvLmNvZmQuQ29mZFNoZWV0LkNvbmRpdGlvbi5wcm90b3R5cGUuZ2V0TmFtZSA9IGZ1bmN0aW9uKCkge1xuICByZXR1cm4gLyoqIEB0eXBlIHtzdHJpbmd9ICovIChqc3BiLk1lc3NhZ2UuZ2V0RmllbGRXaXRoRGVmYXVsdCh0aGlzLCAxLCBcIlwiKSk7XG59O1xuXG5cbi8qKlxuICogQHBhcmFtIHtzdHJpbmd9IHZhbHVlXG4gKiBAcmV0dXJuIHshcHJvdG8ubW9kZWxzLnByb3RvLmNvZmQuQ29mZFNoZWV0LkNvbmRpdGlvbn0gcmV0dXJucyB0aGlzXG4gKi9cbnByb3RvLm1vZGVscy5wcm90by5jb2ZkLkNvZmRTaGVldC5Db25kaXRpb24ucHJvdG90eXBlLnNldE5hbWUgPSBmdW5jdGlvbih2YWx1ZSkge1xuICByZXR1cm4ganNwYi5NZXNzYWdlLnNldFByb3RvM1N0cmluZ0ZpZWxkKHRoaXMsIDEsIHZhbHVlKTtcbn07XG5cblxuXG4vKipcbiAqIExpc3Qgb2YgcmVwZWF0ZWQgZmllbGRzIHdpdGhpbiB0aGlzIG1lc3NhZ2UgdHlwZS5cbiAqIEBwcml2YXRlIHshQXJyYXk8bnVtYmVyPn1cbiAqIEBjb25zdFxuICovXG5wcm90by5tb2RlbHMucHJvdG8uY29mZC5Db2ZkU2hlZXQuU2tpbGwucmVwZWF0ZWRGaWVsZHNfID0gWzRdO1xuXG5cblxuaWYgKGpzcGIuTWVzc2FnZS5HRU5FUkFURV9UT19PQkpFQ1QpIHtcbi8qKlxuICogQ3JlYXRlcyBhbiBvYmplY3QgcmVwcmVzZW50YXRpb24gb2YgdGhpcyBwcm90by5cbiAqIEZpZWxkIG5hbWVzIHRoYXQgYXJlIHJlc2VydmVkIGluIEphdmFTY3JpcHQgYW5kIHdpbGwgYmUgcmVuYW1lZCB0byBwYl9uYW1lLlxuICogT3B0aW9uYWwgZmllbGRzIHRoYXQgYXJlIG5vdCBzZXQgd2lsbCBiZSBzZXQgdG8gdW5kZWZpbmVkLlxuICogVG8gYWNjZXNzIGEgcmVzZXJ2ZWQgZmllbGQgdXNlLCBmb28ucGJfPG5hbWU+LCBlZywgZm9vLnBiX2RlZmF1bHQuXG4gKiBGb3IgdGhlIGxpc3Qgb2YgcmVzZXJ2ZWQgbmFtZXMgcGxlYXNlIHNlZTpcbiAqICAgICBuZXQvcHJvdG8yL2NvbXBpbGVyL2pzL2ludGVybmFsL2dlbmVyYXRvci5jYyNrS2V5d29yZC5cbiAqIEBwYXJhbSB7Ym9vbGVhbj19IG9wdF9pbmNsdWRlSW5zdGFuY2UgRGVwcmVjYXRlZC4gd2hldGhlciB0byBpbmNsdWRlIHRoZVxuICogICAgIEpTUEIgaW5zdGFuY2UgZm9yIHRyYW5zaXRpb25hbCBzb3kgcHJvdG8gc3VwcG9ydDpcbiAqICAgICBodHRwOi8vZ290by9zb3ktcGFyYW0tbWlncmF0aW9uXG4gKiBAcmV0dXJuIHshT2JqZWN0fVxuICovXG5wcm90by5tb2RlbHMucHJvdG8uY29mZC5Db2ZkU2hlZXQuU2tpbGwucHJvdG90eXBlLnRvT2JqZWN0ID0gZnVuY3Rpb24ob3B0X2luY2x1ZGVJbnN0YW5jZSkge1xuICByZXR1cm4gcHJvdG8ubW9kZWxzLnByb3RvLmNvZmQuQ29mZFNoZWV0LlNraWxsLnRvT2JqZWN0KG9wdF9pbmNsdWRlSW5zdGFuY2UsIHRoaXMpO1xufTtcblxuXG4vKipcbiAqIFN0YXRpYyB2ZXJzaW9uIG9mIHRoZSB7QHNlZSB0b09iamVjdH0gbWV0aG9kLlxuICogQHBhcmFtIHtib29sZWFufHVuZGVmaW5lZH0gaW5jbHVkZUluc3RhbmNlIERlcHJlY2F0ZWQuIFdoZXRoZXIgdG8gaW5jbHVkZVxuICogICAgIHRoZSBKU1BCIGluc3RhbmNlIGZvciB0cmFuc2l0aW9uYWwgc295IHByb3RvIHN1cHBvcnQ6XG4gKiAgICAgaHR0cDovL2dvdG8vc295LXBhcmFtLW1pZ3JhdGlvblxuICogQHBhcmFtIHshcHJvdG8ubW9kZWxzLnByb3RvLmNvZmQuQ29mZFNoZWV0LlNraWxsfSBtc2cgVGhlIG1zZyBpbnN0YW5jZSB0byB0cmFuc2Zvcm0uXG4gKiBAcmV0dXJuIHshT2JqZWN0fVxuICogQHN1cHByZXNzIHt1bnVzZWRMb2NhbFZhcmlhYmxlc30gZiBpcyBvbmx5IHVzZWQgZm9yIG5lc3RlZCBtZXNzYWdlc1xuICovXG5wcm90by5tb2RlbHMucHJvdG8uY29mZC5Db2ZkU2hlZXQuU2tpbGwudG9PYmplY3QgPSBmdW5jdGlvbihpbmNsdWRlSW5zdGFuY2UsIG1zZykge1xuICB2YXIgZiwgb2JqID0ge1xuICAgIGRvdHM6IGpzcGIuTWVzc2FnZS5nZXRGaWVsZFdpdGhEZWZhdWx0KG1zZywgMSwgMCksXG4gICAgbmFtZToganNwYi5NZXNzYWdlLmdldEZpZWxkV2l0aERlZmF1bHQobXNnLCAyLCBcIlwiKSxcbiAgICB1bnRyYWluZWRQZW5hbHR5OiBqc3BiLk1lc3NhZ2UuZ2V0RmllbGRXaXRoRGVmYXVsdChtc2csIDMsIDApLFxuICAgIHNwZWNpYWxpemF0aW9uc0xpc3Q6IChmID0ganNwYi5NZXNzYWdlLmdldFJlcGVhdGVkRmllbGQobXNnLCA0KSkgPT0gbnVsbCA/IHVuZGVmaW5lZCA6IGZcbiAgfTtcblxuICBpZiAoaW5jbHVkZUluc3RhbmNlKSB7XG4gICAgb2JqLiRqc3BiTWVzc2FnZUluc3RhbmNlID0gbXNnO1xuICB9XG4gIHJldHVybiBvYmo7XG59O1xufVxuXG5cbi8qKlxuICogRGVzZXJpYWxpemVzIGJpbmFyeSBkYXRhIChpbiBwcm90b2J1ZiB3aXJlIGZvcm1hdCkuXG4gKiBAcGFyYW0ge2pzcGIuQnl0ZVNvdXJjZX0gYnl0ZXMgVGhlIGJ5dGVzIHRvIGRlc2VyaWFsaXplLlxuICogQHJldHVybiB7IXByb3RvLm1vZGVscy5wcm90by5jb2ZkLkNvZmRTaGVldC5Ta2lsbH1cbiAqL1xucHJvdG8ubW9kZWxzLnByb3RvLmNvZmQuQ29mZFNoZWV0LlNraWxsLmRlc2VyaWFsaXplQmluYXJ5ID0gZnVuY3Rpb24oYnl0ZXMpIHtcbiAgdmFyIHJlYWRlciA9IG5ldyBqc3BiLkJpbmFyeVJlYWRlcihieXRlcyk7XG4gIHZhciBtc2cgPSBuZXcgcHJvdG8ubW9kZWxzLnByb3RvLmNvZmQuQ29mZFNoZWV0LlNraWxsO1xuICByZXR1cm4gcHJvdG8ubW9kZWxzLnByb3RvLmNvZmQuQ29mZFNoZWV0LlNraWxsLmRlc2VyaWFsaXplQmluYXJ5RnJvbVJlYWRlcihtc2csIHJlYWRlcik7XG59O1xuXG5cbi8qKlxuICogRGVzZXJpYWxpemVzIGJpbmFyeSBkYXRhIChpbiBwcm90b2J1ZiB3aXJlIGZvcm1hdCkgZnJvbSB0aGVcbiAqIGdpdmVuIHJlYWRlciBpbnRvIHRoZSBnaXZlbiBtZXNzYWdlIG9iamVjdC5cbiAqIEBwYXJhbSB7IXByb3RvLm1vZGVscy5wcm90by5jb2ZkLkNvZmRTaGVldC5Ta2lsbH0gbXNnIFRoZSBtZXNzYWdlIG9iamVjdCB0byBkZXNlcmlhbGl6ZSBpbnRvLlxuICogQHBhcmFtIHshanNwYi5CaW5hcnlSZWFkZXJ9IHJlYWRlciBUaGUgQmluYXJ5UmVhZGVyIHRvIHVzZS5cbiAqIEByZXR1cm4geyFwcm90by5tb2RlbHMucHJvdG8uY29mZC5Db2ZkU2hlZXQuU2tpbGx9XG4gKi9cbnByb3RvLm1vZGVscy5wcm90by5jb2ZkLkNvZmRTaGVldC5Ta2lsbC5kZXNlcmlhbGl6ZUJpbmFyeUZyb21SZWFkZXIgPSBmdW5jdGlvbihtc2csIHJlYWRlcikge1xuICB3aGlsZSAocmVhZGVyLm5leHRGaWVsZCgpKSB7XG4gICAgaWYgKHJlYWRlci5pc0VuZEdyb3VwKCkpIHtcbiAgICAgIGJyZWFrO1xuICAgIH1cbiAgICB2YXIgZmllbGQgPSByZWFkZXIuZ2V0RmllbGROdW1iZXIoKTtcbiAgICBzd2l0Y2ggKGZpZWxkKSB7XG4gICAgY2FzZSAxOlxuICAgICAgdmFyIHZhbHVlID0gLyoqIEB0eXBlIHtudW1iZXJ9ICovIChyZWFkZXIucmVhZEludDMyKCkpO1xuICAgICAgbXNnLnNldERvdHModmFsdWUpO1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSAyOlxuICAgICAgdmFyIHZhbHVlID0gLyoqIEB0eXBlIHtzdHJpbmd9ICovIChyZWFkZXIucmVhZFN0cmluZygpKTtcbiAgICAgIG1zZy5zZXROYW1lKHZhbHVlKTtcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgMzpcbiAgICAgIHZhciB2YWx1ZSA9IC8qKiBAdHlwZSB7bnVtYmVyfSAqLyAocmVhZGVyLnJlYWRTaW50MzIoKSk7XG4gICAgICBtc2cuc2V0VW50cmFpbmVkUGVuYWx0eSh2YWx1ZSk7XG4gICAgICBicmVhaztcbiAgICBjYXNlIDQ6XG4gICAgICB2YXIgdmFsdWUgPSAvKiogQHR5cGUge3N0cmluZ30gKi8gKHJlYWRlci5yZWFkU3RyaW5nKCkpO1xuICAgICAgbXNnLmFkZFNwZWNpYWxpemF0aW9ucyh2YWx1ZSk7XG4gICAgICBicmVhaztcbiAgICBkZWZhdWx0OlxuICAgICAgcmVhZGVyLnNraXBGaWVsZCgpO1xuICAgICAgYnJlYWs7XG4gICAgfVxuICB9XG4gIHJldHVybiBtc2c7XG59O1xuXG5cbi8qKlxuICogU2VyaWFsaXplcyB0aGUgbWVzc2FnZSB0byBiaW5hcnkgZGF0YSAoaW4gcHJvdG9idWYgd2lyZSBmb3JtYXQpLlxuICogQHJldHVybiB7IVVpbnQ4QXJyYXl9XG4gKi9cbnByb3RvLm1vZGVscy5wcm90by5jb2ZkLkNvZmRTaGVldC5Ta2lsbC5wcm90b3R5cGUuc2VyaWFsaXplQmluYXJ5ID0gZnVuY3Rpb24oKSB7XG4gIHZhciB3cml0ZXIgPSBuZXcganNwYi5CaW5hcnlXcml0ZXIoKTtcbiAgcHJvdG8ubW9kZWxzLnByb3RvLmNvZmQuQ29mZFNoZWV0LlNraWxsLnNlcmlhbGl6ZUJpbmFyeVRvV3JpdGVyKHRoaXMsIHdyaXRlcik7XG4gIHJldHVybiB3cml0ZXIuZ2V0UmVzdWx0QnVmZmVyKCk7XG59O1xuXG5cbi8qKlxuICogU2VyaWFsaXplcyB0aGUgZ2l2ZW4gbWVzc2FnZSB0byBiaW5hcnkgZGF0YSAoaW4gcHJvdG9idWYgd2lyZVxuICogZm9ybWF0KSwgd3JpdGluZyB0byB0aGUgZ2l2ZW4gQmluYXJ5V3JpdGVyLlxuICogQHBhcmFtIHshcHJvdG8ubW9kZWxzLnByb3RvLmNvZmQuQ29mZFNoZWV0LlNraWxsfSBtZXNzYWdlXG4gKiBAcGFyYW0geyFqc3BiLkJpbmFyeVdyaXRlcn0gd3JpdGVyXG4gKiBAc3VwcHJlc3Mge3VudXNlZExvY2FsVmFyaWFibGVzfSBmIGlzIG9ubHkgdXNlZCBmb3IgbmVzdGVkIG1lc3NhZ2VzXG4gKi9cbnByb3RvLm1vZGVscy5wcm90by5jb2ZkLkNvZmRTaGVldC5Ta2lsbC5zZXJpYWxpemVCaW5hcnlUb1dyaXRlciA9IGZ1bmN0aW9uKG1lc3NhZ2UsIHdyaXRlcikge1xuICB2YXIgZiA9IHVuZGVmaW5lZDtcbiAgZiA9IG1lc3NhZ2UuZ2V0RG90cygpO1xuICBpZiAoZiAhPT0gMCkge1xuICAgIHdyaXRlci53cml0ZUludDMyKFxuICAgICAgMSxcbiAgICAgIGZcbiAgICApO1xuICB9XG4gIGYgPSBtZXNzYWdlLmdldE5hbWUoKTtcbiAgaWYgKGYubGVuZ3RoID4gMCkge1xuICAgIHdyaXRlci53cml0ZVN0cmluZyhcbiAgICAgIDIsXG4gICAgICBmXG4gICAgKTtcbiAgfVxuICBmID0gbWVzc2FnZS5nZXRVbnRyYWluZWRQZW5hbHR5KCk7XG4gIGlmIChmICE9PSAwKSB7XG4gICAgd3JpdGVyLndyaXRlU2ludDMyKFxuICAgICAgMyxcbiAgICAgIGZcbiAgICApO1xuICB9XG4gIGYgPSBtZXNzYWdlLmdldFNwZWNpYWxpemF0aW9uc0xpc3QoKTtcbiAgaWYgKGYubGVuZ3RoID4gMCkge1xuICAgIHdyaXRlci53cml0ZVJlcGVhdGVkU3RyaW5nKFxuICAgICAgNCxcbiAgICAgIGZcbiAgICApO1xuICB9XG59O1xuXG5cbi8qKlxuICogb3B0aW9uYWwgaW50MzIgZG90cyA9IDE7XG4gKiBAcmV0dXJuIHtudW1iZXJ9XG4gKi9cbnByb3RvLm1vZGVscy5wcm90by5jb2ZkLkNvZmRTaGVldC5Ta2lsbC5wcm90b3R5cGUuZ2V0RG90cyA9IGZ1bmN0aW9uKCkge1xuICByZXR1cm4gLyoqIEB0eXBlIHtudW1iZXJ9ICovIChqc3BiLk1lc3NhZ2UuZ2V0RmllbGRXaXRoRGVmYXVsdCh0aGlzLCAxLCAwKSk7XG59O1xuXG5cbi8qKlxuICogQHBhcmFtIHtudW1iZXJ9IHZhbHVlXG4gKiBAcmV0dXJuIHshcHJvdG8ubW9kZWxzLnByb3RvLmNvZmQuQ29mZFNoZWV0LlNraWxsfSByZXR1cm5zIHRoaXNcbiAqL1xucHJvdG8ubW9kZWxzLnByb3RvLmNvZmQuQ29mZFNoZWV0LlNraWxsLnByb3RvdHlwZS5zZXREb3RzID0gZnVuY3Rpb24odmFsdWUpIHtcbiAgcmV0dXJuIGpzcGIuTWVzc2FnZS5zZXRQcm90bzNJbnRGaWVsZCh0aGlzLCAxLCB2YWx1ZSk7XG59O1xuXG5cbi8qKlxuICogb3B0aW9uYWwgc3RyaW5nIG5hbWUgPSAyO1xuICogQHJldHVybiB7c3RyaW5nfVxuICovXG5wcm90by5tb2RlbHMucHJvdG8uY29mZC5Db2ZkU2hlZXQuU2tpbGwucHJvdG90eXBlLmdldE5hbWUgPSBmdW5jdGlvbigpIHtcbiAgcmV0dXJuIC8qKiBAdHlwZSB7c3RyaW5nfSAqLyAoanNwYi5NZXNzYWdlLmdldEZpZWxkV2l0aERlZmF1bHQodGhpcywgMiwgXCJcIikpO1xufTtcblxuXG4vKipcbiAqIEBwYXJhbSB7c3RyaW5nfSB2YWx1ZVxuICogQHJldHVybiB7IXByb3RvLm1vZGVscy5wcm90by5jb2ZkLkNvZmRTaGVldC5Ta2lsbH0gcmV0dXJucyB0aGlzXG4gKi9cbnByb3RvLm1vZGVscy5wcm90by5jb2ZkLkNvZmRTaGVldC5Ta2lsbC5wcm90b3R5cGUuc2V0TmFtZSA9IGZ1bmN0aW9uKHZhbHVlKSB7XG4gIHJldHVybiBqc3BiLk1lc3NhZ2Uuc2V0UHJvdG8zU3RyaW5nRmllbGQodGhpcywgMiwgdmFsdWUpO1xufTtcblxuXG4vKipcbiAqIG9wdGlvbmFsIHNpbnQzMiB1bnRyYWluZWRfcGVuYWx0eSA9IDM7XG4gKiBAcmV0dXJuIHtudW1iZXJ9XG4gKi9cbnByb3RvLm1vZGVscy5wcm90by5jb2ZkLkNvZmRTaGVldC5Ta2lsbC5wcm90b3R5cGUuZ2V0VW50cmFpbmVkUGVuYWx0eSA9IGZ1bmN0aW9uKCkge1xuICByZXR1cm4gLyoqIEB0eXBlIHtudW1iZXJ9ICovIChqc3BiLk1lc3NhZ2UuZ2V0RmllbGRXaXRoRGVmYXVsdCh0aGlzLCAzLCAwKSk7XG59O1xuXG5cbi8qKlxuICogQHBhcmFtIHtudW1iZXJ9IHZhbHVlXG4gKiBAcmV0dXJuIHshcHJvdG8ubW9kZWxzLnByb3RvLmNvZmQuQ29mZFNoZWV0LlNraWxsfSByZXR1cm5zIHRoaXNcbiAqL1xucHJvdG8ubW9kZWxzLnByb3RvLmNvZmQuQ29mZFNoZWV0LlNraWxsLnByb3RvdHlwZS5zZXRVbnRyYWluZWRQZW5hbHR5ID0gZnVuY3Rpb24odmFsdWUpIHtcbiAgcmV0dXJuIGpzcGIuTWVzc2FnZS5zZXRQcm90bzNJbnRGaWVsZCh0aGlzLCAzLCB2YWx1ZSk7XG59O1xuXG5cbi8qKlxuICogcmVwZWF0ZWQgc3RyaW5nIHNwZWNpYWxpemF0aW9ucyA9IDQ7XG4gKiBAcmV0dXJuIHshQXJyYXk8c3RyaW5nPn1cbiAqL1xucHJvdG8ubW9kZWxzLnByb3RvLmNvZmQuQ29mZFNoZWV0LlNraWxsLnByb3RvdHlwZS5nZXRTcGVjaWFsaXphdGlvbnNMaXN0ID0gZnVuY3Rpb24oKSB7XG4gIHJldHVybiAvKiogQHR5cGUgeyFBcnJheTxzdHJpbmc+fSAqLyAoanNwYi5NZXNzYWdlLmdldFJlcGVhdGVkRmllbGQodGhpcywgNCkpO1xufTtcblxuXG4vKipcbiAqIEBwYXJhbSB7IUFycmF5PHN0cmluZz59IHZhbHVlXG4gKiBAcmV0dXJuIHshcHJvdG8ubW9kZWxzLnByb3RvLmNvZmQuQ29mZFNoZWV0LlNraWxsfSByZXR1cm5zIHRoaXNcbiAqL1xucHJvdG8ubW9kZWxzLnByb3RvLmNvZmQuQ29mZFNoZWV0LlNraWxsLnByb3RvdHlwZS5zZXRTcGVjaWFsaXphdGlvbnNMaXN0ID0gZnVuY3Rpb24odmFsdWUpIHtcbiAgcmV0dXJuIGpzcGIuTWVzc2FnZS5zZXRGaWVsZCh0aGlzLCA0LCB2YWx1ZSB8fCBbXSk7XG59O1xuXG5cbi8qKlxuICogQHBhcmFtIHtzdHJpbmd9IHZhbHVlXG4gKiBAcGFyYW0ge251bWJlcj19IG9wdF9pbmRleFxuICogQHJldHVybiB7IXByb3RvLm1vZGVscy5wcm90by5jb2ZkLkNvZmRTaGVldC5Ta2lsbH0gcmV0dXJucyB0aGlzXG4gKi9cbnByb3RvLm1vZGVscy5wcm90by5jb2ZkLkNvZmRTaGVldC5Ta2lsbC5wcm90b3R5cGUuYWRkU3BlY2lhbGl6YXRpb25zID0gZnVuY3Rpb24odmFsdWUsIG9wdF9pbmRleCkge1xuICByZXR1cm4ganNwYi5NZXNzYWdlLmFkZFRvUmVwZWF0ZWRGaWVsZCh0aGlzLCA0LCB2YWx1ZSwgb3B0X2luZGV4KTtcbn07XG5cblxuLyoqXG4gKiBDbGVhcnMgdGhlIGxpc3QgbWFraW5nIGl0IGVtcHR5IGJ1dCBub24tbnVsbC5cbiAqIEByZXR1cm4geyFwcm90by5tb2RlbHMucHJvdG8uY29mZC5Db2ZkU2hlZXQuU2tpbGx9IHJldHVybnMgdGhpc1xuICovXG5wcm90by5tb2RlbHMucHJvdG8uY29mZC5Db2ZkU2hlZXQuU2tpbGwucHJvdG90eXBlLmNsZWFyU3BlY2lhbGl6YXRpb25zTGlzdCA9IGZ1bmN0aW9uKCkge1xuICByZXR1cm4gdGhpcy5zZXRTcGVjaWFsaXphdGlvbnNMaXN0KFtdKTtcbn07XG5cblxuXG5cblxuaWYgKGpzcGIuTWVzc2FnZS5HRU5FUkFURV9UT19PQkpFQ1QpIHtcbi8qKlxuICogQ3JlYXRlcyBhbiBvYmplY3QgcmVwcmVzZW50YXRpb24gb2YgdGhpcyBwcm90by5cbiAqIEZpZWxkIG5hbWVzIHRoYXQgYXJlIHJlc2VydmVkIGluIEphdmFTY3JpcHQgYW5kIHdpbGwgYmUgcmVuYW1lZCB0byBwYl9uYW1lLlxuICogT3B0aW9uYWwgZmllbGRzIHRoYXQgYXJlIG5vdCBzZXQgd2lsbCBiZSBzZXQgdG8gdW5kZWZpbmVkLlxuICogVG8gYWNjZXNzIGEgcmVzZXJ2ZWQgZmllbGQgdXNlLCBmb28ucGJfPG5hbWU+LCBlZywgZm9vLnBiX2RlZmF1bHQuXG4gKiBGb3IgdGhlIGxpc3Qgb2YgcmVzZXJ2ZWQgbmFtZXMgcGxlYXNlIHNlZTpcbiAqICAgICBuZXQvcHJvdG8yL2NvbXBpbGVyL2pzL2ludGVybmFsL2dlbmVyYXRvci5jYyNrS2V5d29yZC5cbiAqIEBwYXJhbSB7Ym9vbGVhbj19IG9wdF9pbmNsdWRlSW5zdGFuY2UgRGVwcmVjYXRlZC4gd2hldGhlciB0byBpbmNsdWRlIHRoZVxuICogICAgIEpTUEIgaW5zdGFuY2UgZm9yIHRyYW5zaXRpb25hbCBzb3kgcHJvdG8gc3VwcG9ydDpcbiAqICAgICBodHRwOi8vZ290by9zb3ktcGFyYW0tbWlncmF0aW9uXG4gKiBAcmV0dXJuIHshT2JqZWN0fVxuICovXG5wcm90by5tb2RlbHMucHJvdG8uY29mZC5Db2ZkU2hlZXQuSXRlbS5wcm90b3R5cGUudG9PYmplY3QgPSBmdW5jdGlvbihvcHRfaW5jbHVkZUluc3RhbmNlKSB7XG4gIHJldHVybiBwcm90by5tb2RlbHMucHJvdG8uY29mZC5Db2ZkU2hlZXQuSXRlbS50b09iamVjdChvcHRfaW5jbHVkZUluc3RhbmNlLCB0aGlzKTtcbn07XG5cblxuLyoqXG4gKiBTdGF0aWMgdmVyc2lvbiBvZiB0aGUge0BzZWUgdG9PYmplY3R9IG1ldGhvZC5cbiAqIEBwYXJhbSB7Ym9vbGVhbnx1bmRlZmluZWR9IGluY2x1ZGVJbnN0YW5jZSBEZXByZWNhdGVkLiBXaGV0aGVyIHRvIGluY2x1ZGVcbiAqICAgICB0aGUgSlNQQiBpbnN0YW5jZSBmb3IgdHJhbnNpdGlvbmFsIHNveSBwcm90byBzdXBwb3J0OlxuICogICAgIGh0dHA6Ly9nb3RvL3NveS1wYXJhbS1taWdyYXRpb25cbiAqIEBwYXJhbSB7IXByb3RvLm1vZGVscy5wcm90by5jb2ZkLkNvZmRTaGVldC5JdGVtfSBtc2cgVGhlIG1zZyBpbnN0YW5jZSB0byB0cmFuc2Zvcm0uXG4gKiBAcmV0dXJuIHshT2JqZWN0fVxuICogQHN1cHByZXNzIHt1bnVzZWRMb2NhbFZhcmlhYmxlc30gZiBpcyBvbmx5IHVzZWQgZm9yIG5lc3RlZCBtZXNzYWdlc1xuICovXG5wcm90by5tb2RlbHMucHJvdG8uY29mZC5Db2ZkU2hlZXQuSXRlbS50b09iamVjdCA9IGZ1bmN0aW9uKGluY2x1ZGVJbnN0YW5jZSwgbXNnKSB7XG4gIHZhciBmLCBvYmogPSB7XG4gICAgbmFtZToganNwYi5NZXNzYWdlLmdldEZpZWxkV2l0aERlZmF1bHQobXNnLCAxLCBcIlwiKSxcbiAgICBkZXNjcmlwdGlvbjoganNwYi5NZXNzYWdlLmdldEZpZWxkV2l0aERlZmF1bHQobXNnLCAyLCBcIlwiKSxcbiAgICBydWxlczoganNwYi5NZXNzYWdlLmdldEZpZWxkV2l0aERlZmF1bHQobXNnLCAzLCBcIlwiKVxuICB9O1xuXG4gIGlmIChpbmNsdWRlSW5zdGFuY2UpIHtcbiAgICBvYmouJGpzcGJNZXNzYWdlSW5zdGFuY2UgPSBtc2c7XG4gIH1cbiAgcmV0dXJuIG9iajtcbn07XG59XG5cblxuLyoqXG4gKiBEZXNlcmlhbGl6ZXMgYmluYXJ5IGRhdGEgKGluIHByb3RvYnVmIHdpcmUgZm9ybWF0KS5cbiAqIEBwYXJhbSB7anNwYi5CeXRlU291cmNlfSBieXRlcyBUaGUgYnl0ZXMgdG8gZGVzZXJpYWxpemUuXG4gKiBAcmV0dXJuIHshcHJvdG8ubW9kZWxzLnByb3RvLmNvZmQuQ29mZFNoZWV0Lkl0ZW19XG4gKi9cbnByb3RvLm1vZGVscy5wcm90by5jb2ZkLkNvZmRTaGVldC5JdGVtLmRlc2VyaWFsaXplQmluYXJ5ID0gZnVuY3Rpb24oYnl0ZXMpIHtcbiAgdmFyIHJlYWRlciA9IG5ldyBqc3BiLkJpbmFyeVJlYWRlcihieXRlcyk7XG4gIHZhciBtc2cgPSBuZXcgcHJvdG8ubW9kZWxzLnByb3RvLmNvZmQuQ29mZFNoZWV0Lkl0ZW07XG4gIHJldHVybiBwcm90by5tb2RlbHMucHJvdG8uY29mZC5Db2ZkU2hlZXQuSXRlbS5kZXNlcmlhbGl6ZUJpbmFyeUZyb21SZWFkZXIobXNnLCByZWFkZXIpO1xufTtcblxuXG4vKipcbiAqIERlc2VyaWFsaXplcyBiaW5hcnkgZGF0YSAoaW4gcHJvdG9idWYgd2lyZSBmb3JtYXQpIGZyb20gdGhlXG4gKiBnaXZlbiByZWFkZXIgaW50byB0aGUgZ2l2ZW4gbWVzc2FnZSBvYmplY3QuXG4gKiBAcGFyYW0geyFwcm90by5tb2RlbHMucHJvdG8uY29mZC5Db2ZkU2hlZXQuSXRlbX0gbXNnIFRoZSBtZXNzYWdlIG9iamVjdCB0byBkZXNlcmlhbGl6ZSBpbnRvLlxuICogQHBhcmFtIHshanNwYi5CaW5hcnlSZWFkZXJ9IHJlYWRlciBUaGUgQmluYXJ5UmVhZGVyIHRvIHVzZS5cbiAqIEByZXR1cm4geyFwcm90by5tb2RlbHMucHJvdG8uY29mZC5Db2ZkU2hlZXQuSXRlbX1cbiAqL1xucHJvdG8ubW9kZWxzLnByb3RvLmNvZmQuQ29mZFNoZWV0Lkl0ZW0uZGVzZXJpYWxpemVCaW5hcnlGcm9tUmVhZGVyID0gZnVuY3Rpb24obXNnLCByZWFkZXIpIHtcbiAgd2hpbGUgKHJlYWRlci5uZXh0RmllbGQoKSkge1xuICAgIGlmIChyZWFkZXIuaXNFbmRHcm91cCgpKSB7XG4gICAgICBicmVhaztcbiAgICB9XG4gICAgdmFyIGZpZWxkID0gcmVhZGVyLmdldEZpZWxkTnVtYmVyKCk7XG4gICAgc3dpdGNoIChmaWVsZCkge1xuICAgIGNhc2UgMTpcbiAgICAgIHZhciB2YWx1ZSA9IC8qKiBAdHlwZSB7c3RyaW5nfSAqLyAocmVhZGVyLnJlYWRTdHJpbmcoKSk7XG4gICAgICBtc2cuc2V0TmFtZSh2YWx1ZSk7XG4gICAgICBicmVhaztcbiAgICBjYXNlIDI6XG4gICAgICB2YXIgdmFsdWUgPSAvKiogQHR5cGUge3N0cmluZ30gKi8gKHJlYWRlci5yZWFkU3RyaW5nKCkpO1xuICAgICAgbXNnLnNldERlc2NyaXB0aW9uKHZhbHVlKTtcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgMzpcbiAgICAgIHZhciB2YWx1ZSA9IC8qKiBAdHlwZSB7c3RyaW5nfSAqLyAocmVhZGVyLnJlYWRTdHJpbmcoKSk7XG4gICAgICBtc2cuc2V0UnVsZXModmFsdWUpO1xuICAgICAgYnJlYWs7XG4gICAgZGVmYXVsdDpcbiAgICAgIHJlYWRlci5za2lwRmllbGQoKTtcbiAgICAgIGJyZWFrO1xuICAgIH1cbiAgfVxuICByZXR1cm4gbXNnO1xufTtcblxuXG4vKipcbiAqIFNlcmlhbGl6ZXMgdGhlIG1lc3NhZ2UgdG8gYmluYXJ5IGRhdGEgKGluIHByb3RvYnVmIHdpcmUgZm9ybWF0KS5cbiAqIEByZXR1cm4geyFVaW50OEFycmF5fVxuICovXG5wcm90by5tb2RlbHMucHJvdG8uY29mZC5Db2ZkU2hlZXQuSXRlbS5wcm90b3R5cGUuc2VyaWFsaXplQmluYXJ5ID0gZnVuY3Rpb24oKSB7XG4gIHZhciB3cml0ZXIgPSBuZXcganNwYi5CaW5hcnlXcml0ZXIoKTtcbiAgcHJvdG8ubW9kZWxzLnByb3RvLmNvZmQuQ29mZFNoZWV0Lkl0ZW0uc2VyaWFsaXplQmluYXJ5VG9Xcml0ZXIodGhpcywgd3JpdGVyKTtcbiAgcmV0dXJuIHdyaXRlci5nZXRSZXN1bHRCdWZmZXIoKTtcbn07XG5cblxuLyoqXG4gKiBTZXJpYWxpemVzIHRoZSBnaXZlbiBtZXNzYWdlIHRvIGJpbmFyeSBkYXRhIChpbiBwcm90b2J1ZiB3aXJlXG4gKiBmb3JtYXQpLCB3cml0aW5nIHRvIHRoZSBnaXZlbiBCaW5hcnlXcml0ZXIuXG4gKiBAcGFyYW0geyFwcm90by5tb2RlbHMucHJvdG8uY29mZC5Db2ZkU2hlZXQuSXRlbX0gbWVzc2FnZVxuICogQHBhcmFtIHshanNwYi5CaW5hcnlXcml0ZXJ9IHdyaXRlclxuICogQHN1cHByZXNzIHt1bnVzZWRMb2NhbFZhcmlhYmxlc30gZiBpcyBvbmx5IHVzZWQgZm9yIG5lc3RlZCBtZXNzYWdlc1xuICovXG5wcm90by5tb2RlbHMucHJvdG8uY29mZC5Db2ZkU2hlZXQuSXRlbS5zZXJpYWxpemVCaW5hcnlUb1dyaXRlciA9IGZ1bmN0aW9uKG1lc3NhZ2UsIHdyaXRlcikge1xuICB2YXIgZiA9IHVuZGVmaW5lZDtcbiAgZiA9IG1lc3NhZ2UuZ2V0TmFtZSgpO1xuICBpZiAoZi5sZW5ndGggPiAwKSB7XG4gICAgd3JpdGVyLndyaXRlU3RyaW5nKFxuICAgICAgMSxcbiAgICAgIGZcbiAgICApO1xuICB9XG4gIGYgPSBtZXNzYWdlLmdldERlc2NyaXB0aW9uKCk7XG4gIGlmIChmLmxlbmd0aCA+IDApIHtcbiAgICB3cml0ZXIud3JpdGVTdHJpbmcoXG4gICAgICAyLFxuICAgICAgZlxuICAgICk7XG4gIH1cbiAgZiA9IG1lc3NhZ2UuZ2V0UnVsZXMoKTtcbiAgaWYgKGYubGVuZ3RoID4gMCkge1xuICAgIHdyaXRlci53cml0ZVN0cmluZyhcbiAgICAgIDMsXG4gICAgICBmXG4gICAgKTtcbiAgfVxufTtcblxuXG4vKipcbiAqIG9wdGlvbmFsIHN0cmluZyBuYW1lID0gMTtcbiAqIEByZXR1cm4ge3N0cmluZ31cbiAqL1xucHJvdG8ubW9kZWxzLnByb3RvLmNvZmQuQ29mZFNoZWV0Lkl0ZW0ucHJvdG90eXBlLmdldE5hbWUgPSBmdW5jdGlvbigpIHtcbiAgcmV0dXJuIC8qKiBAdHlwZSB7c3RyaW5nfSAqLyAoanNwYi5NZXNzYWdlLmdldEZpZWxkV2l0aERlZmF1bHQodGhpcywgMSwgXCJcIikpO1xufTtcblxuXG4vKipcbiAqIEBwYXJhbSB7c3RyaW5nfSB2YWx1ZVxuICogQHJldHVybiB7IXByb3RvLm1vZGVscy5wcm90by5jb2ZkLkNvZmRTaGVldC5JdGVtfSByZXR1cm5zIHRoaXNcbiAqL1xucHJvdG8ubW9kZWxzLnByb3RvLmNvZmQuQ29mZFNoZWV0Lkl0ZW0ucHJvdG90eXBlLnNldE5hbWUgPSBmdW5jdGlvbih2YWx1ZSkge1xuICByZXR1cm4ganNwYi5NZXNzYWdlLnNldFByb3RvM1N0cmluZ0ZpZWxkKHRoaXMsIDEsIHZhbHVlKTtcbn07XG5cblxuLyoqXG4gKiBvcHRpb25hbCBzdHJpbmcgZGVzY3JpcHRpb24gPSAyO1xuICogQHJldHVybiB7c3RyaW5nfVxuICovXG5wcm90by5tb2RlbHMucHJvdG8uY29mZC5Db2ZkU2hlZXQuSXRlbS5wcm90b3R5cGUuZ2V0RGVzY3JpcHRpb24gPSBmdW5jdGlvbigpIHtcbiAgcmV0dXJuIC8qKiBAdHlwZSB7c3RyaW5nfSAqLyAoanNwYi5NZXNzYWdlLmdldEZpZWxkV2l0aERlZmF1bHQodGhpcywgMiwgXCJcIikpO1xufTtcblxuXG4vKipcbiAqIEBwYXJhbSB7c3RyaW5nfSB2YWx1ZVxuICogQHJldHVybiB7IXByb3RvLm1vZGVscy5wcm90by5jb2ZkLkNvZmRTaGVldC5JdGVtfSByZXR1cm5zIHRoaXNcbiAqL1xucHJvdG8ubW9kZWxzLnByb3RvLmNvZmQuQ29mZFNoZWV0Lkl0ZW0ucHJvdG90eXBlLnNldERlc2NyaXB0aW9uID0gZnVuY3Rpb24odmFsdWUpIHtcbiAgcmV0dXJuIGpzcGIuTWVzc2FnZS5zZXRQcm90bzNTdHJpbmdGaWVsZCh0aGlzLCAyLCB2YWx1ZSk7XG59O1xuXG5cbi8qKlxuICogb3B0aW9uYWwgc3RyaW5nIHJ1bGVzID0gMztcbiAqIEByZXR1cm4ge3N0cmluZ31cbiAqL1xucHJvdG8ubW9kZWxzLnByb3RvLmNvZmQuQ29mZFNoZWV0Lkl0ZW0ucHJvdG90eXBlLmdldFJ1bGVzID0gZnVuY3Rpb24oKSB7XG4gIHJldHVybiAvKiogQHR5cGUge3N0cmluZ30gKi8gKGpzcGIuTWVzc2FnZS5nZXRGaWVsZFdpdGhEZWZhdWx0KHRoaXMsIDMsIFwiXCIpKTtcbn07XG5cblxuLyoqXG4gKiBAcGFyYW0ge3N0cmluZ30gdmFsdWVcbiAqIEByZXR1cm4geyFwcm90by5tb2RlbHMucHJvdG8uY29mZC5Db2ZkU2hlZXQuSXRlbX0gcmV0dXJucyB0aGlzXG4gKi9cbnByb3RvLm1vZGVscy5wcm90by5jb2ZkLkNvZmRTaGVldC5JdGVtLnByb3RvdHlwZS5zZXRSdWxlcyA9IGZ1bmN0aW9uKHZhbHVlKSB7XG4gIHJldHVybiBqc3BiLk1lc3NhZ2Uuc2V0UHJvdG8zU3RyaW5nRmllbGQodGhpcywgMywgdmFsdWUpO1xufTtcblxuXG5cblxuXG5pZiAoanNwYi5NZXNzYWdlLkdFTkVSQVRFX1RPX09CSkVDVCkge1xuLyoqXG4gKiBDcmVhdGVzIGFuIG9iamVjdCByZXByZXNlbnRhdGlvbiBvZiB0aGlzIHByb3RvLlxuICogRmllbGQgbmFtZXMgdGhhdCBhcmUgcmVzZXJ2ZWQgaW4gSmF2YVNjcmlwdCBhbmQgd2lsbCBiZSByZW5hbWVkIHRvIHBiX25hbWUuXG4gKiBPcHRpb25hbCBmaWVsZHMgdGhhdCBhcmUgbm90IHNldCB3aWxsIGJlIHNldCB0byB1bmRlZmluZWQuXG4gKiBUbyBhY2Nlc3MgYSByZXNlcnZlZCBmaWVsZCB1c2UsIGZvby5wYl88bmFtZT4sIGVnLCBmb28ucGJfZGVmYXVsdC5cbiAqIEZvciB0aGUgbGlzdCBvZiByZXNlcnZlZCBuYW1lcyBwbGVhc2Ugc2VlOlxuICogICAgIG5ldC9wcm90bzIvY29tcGlsZXIvanMvaW50ZXJuYWwvZ2VuZXJhdG9yLmNjI2tLZXl3b3JkLlxuICogQHBhcmFtIHtib29sZWFuPX0gb3B0X2luY2x1ZGVJbnN0YW5jZSBEZXByZWNhdGVkLiB3aGV0aGVyIHRvIGluY2x1ZGUgdGhlXG4gKiAgICAgSlNQQiBpbnN0YW5jZSBmb3IgdHJhbnNpdGlvbmFsIHNveSBwcm90byBzdXBwb3J0OlxuICogICAgIGh0dHA6Ly9nb3RvL3NveS1wYXJhbS1taWdyYXRpb25cbiAqIEByZXR1cm4geyFPYmplY3R9XG4gKi9cbnByb3RvLm1vZGVscy5wcm90by5jb2ZkLkNvZmRTaGVldC5BdHRhY2sucHJvdG90eXBlLnRvT2JqZWN0ID0gZnVuY3Rpb24ob3B0X2luY2x1ZGVJbnN0YW5jZSkge1xuICByZXR1cm4gcHJvdG8ubW9kZWxzLnByb3RvLmNvZmQuQ29mZFNoZWV0LkF0dGFjay50b09iamVjdChvcHRfaW5jbHVkZUluc3RhbmNlLCB0aGlzKTtcbn07XG5cblxuLyoqXG4gKiBTdGF0aWMgdmVyc2lvbiBvZiB0aGUge0BzZWUgdG9PYmplY3R9IG1ldGhvZC5cbiAqIEBwYXJhbSB7Ym9vbGVhbnx1bmRlZmluZWR9IGluY2x1ZGVJbnN0YW5jZSBEZXByZWNhdGVkLiBXaGV0aGVyIHRvIGluY2x1ZGVcbiAqICAgICB0aGUgSlNQQiBpbnN0YW5jZSBmb3IgdHJhbnNpdGlvbmFsIHNveSBwcm90byBzdXBwb3J0OlxuICogICAgIGh0dHA6Ly9nb3RvL3NveS1wYXJhbS1taWdyYXRpb25cbiAqIEBwYXJhbSB7IXByb3RvLm1vZGVscy5wcm90by5jb2ZkLkNvZmRTaGVldC5BdHRhY2t9IG1zZyBUaGUgbXNnIGluc3RhbmNlIHRvIHRyYW5zZm9ybS5cbiAqIEByZXR1cm4geyFPYmplY3R9XG4gKiBAc3VwcHJlc3Mge3VudXNlZExvY2FsVmFyaWFibGVzfSBmIGlzIG9ubHkgdXNlZCBmb3IgbmVzdGVkIG1lc3NhZ2VzXG4gKi9cbnByb3RvLm1vZGVscy5wcm90by5jb2ZkLkNvZmRTaGVldC5BdHRhY2sudG9PYmplY3QgPSBmdW5jdGlvbihpbmNsdWRlSW5zdGFuY2UsIG1zZykge1xuICB2YXIgZiwgb2JqID0ge1xuICAgIG5hbWU6IGpzcGIuTWVzc2FnZS5nZXRGaWVsZFdpdGhEZWZhdWx0KG1zZywgMSwgXCJcIiksXG4gICAgZGljZVBvb2w6IGpzcGIuTWVzc2FnZS5nZXRGaWVsZFdpdGhEZWZhdWx0KG1zZywgMiwgMCksXG4gICAgZGFtYWdlOiBqc3BiLk1lc3NhZ2UuZ2V0RmllbGRXaXRoRGVmYXVsdChtc2csIDMsIDApLFxuICAgIHJhbmdlOiBqc3BiLk1lc3NhZ2UuZ2V0RmllbGRXaXRoRGVmYXVsdChtc2csIDQsIDApLFxuICAgIGluaXRpYXRpdmVNb2RpZmllcjoganNwYi5NZXNzYWdlLmdldEZpZWxkV2l0aERlZmF1bHQobXNnLCA1LCAwKSxcbiAgICBzaXplOiBqc3BiLk1lc3NhZ2UuZ2V0RmllbGRXaXRoRGVmYXVsdChtc2csIDYsIDApXG4gIH07XG5cbiAgaWYgKGluY2x1ZGVJbnN0YW5jZSkge1xuICAgIG9iai4kanNwYk1lc3NhZ2VJbnN0YW5jZSA9IG1zZztcbiAgfVxuICByZXR1cm4gb2JqO1xufTtcbn1cblxuXG4vKipcbiAqIERlc2VyaWFsaXplcyBiaW5hcnkgZGF0YSAoaW4gcHJvdG9idWYgd2lyZSBmb3JtYXQpLlxuICogQHBhcmFtIHtqc3BiLkJ5dGVTb3VyY2V9IGJ5dGVzIFRoZSBieXRlcyB0byBkZXNlcmlhbGl6ZS5cbiAqIEByZXR1cm4geyFwcm90by5tb2RlbHMucHJvdG8uY29mZC5Db2ZkU2hlZXQuQXR0YWNrfVxuICovXG5wcm90by5tb2RlbHMucHJvdG8uY29mZC5Db2ZkU2hlZXQuQXR0YWNrLmRlc2VyaWFsaXplQmluYXJ5ID0gZnVuY3Rpb24oYnl0ZXMpIHtcbiAgdmFyIHJlYWRlciA9IG5ldyBqc3BiLkJpbmFyeVJlYWRlcihieXRlcyk7XG4gIHZhciBtc2cgPSBuZXcgcHJvdG8ubW9kZWxzLnByb3RvLmNvZmQuQ29mZFNoZWV0LkF0dGFjaztcbiAgcmV0dXJuIHByb3RvLm1vZGVscy5wcm90by5jb2ZkLkNvZmRTaGVldC5BdHRhY2suZGVzZXJpYWxpemVCaW5hcnlGcm9tUmVhZGVyKG1zZywgcmVhZGVyKTtcbn07XG5cblxuLyoqXG4gKiBEZXNlcmlhbGl6ZXMgYmluYXJ5IGRhdGEgKGluIHByb3RvYnVmIHdpcmUgZm9ybWF0KSBmcm9tIHRoZVxuICogZ2l2ZW4gcmVhZGVyIGludG8gdGhlIGdpdmVuIG1lc3NhZ2Ugb2JqZWN0LlxuICogQHBhcmFtIHshcHJvdG8ubW9kZWxzLnByb3RvLmNvZmQuQ29mZFNoZWV0LkF0dGFja30gbXNnIFRoZSBtZXNzYWdlIG9iamVjdCB0byBkZXNlcmlhbGl6ZSBpbnRvLlxuICogQHBhcmFtIHshanNwYi5CaW5hcnlSZWFkZXJ9IHJlYWRlciBUaGUgQmluYXJ5UmVhZGVyIHRvIHVzZS5cbiAqIEByZXR1cm4geyFwcm90by5tb2RlbHMucHJvdG8uY29mZC5Db2ZkU2hlZXQuQXR0YWNrfVxuICovXG5wcm90by5tb2RlbHMucHJvdG8uY29mZC5Db2ZkU2hlZXQuQXR0YWNrLmRlc2VyaWFsaXplQmluYXJ5RnJvbVJlYWRlciA9IGZ1bmN0aW9uKG1zZywgcmVhZGVyKSB7XG4gIHdoaWxlIChyZWFkZXIubmV4dEZpZWxkKCkpIHtcbiAgICBpZiAocmVhZGVyLmlzRW5kR3JvdXAoKSkge1xuICAgICAgYnJlYWs7XG4gICAgfVxuICAgIHZhciBmaWVsZCA9IHJlYWRlci5nZXRGaWVsZE51bWJlcigpO1xuICAgIHN3aXRjaCAoZmllbGQpIHtcbiAgICBjYXNlIDE6XG4gICAgICB2YXIgdmFsdWUgPSAvKiogQHR5cGUge3N0cmluZ30gKi8gKHJlYWRlci5yZWFkU3RyaW5nKCkpO1xuICAgICAgbXNnLnNldE5hbWUodmFsdWUpO1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSAyOlxuICAgICAgdmFyIHZhbHVlID0gLyoqIEB0eXBlIHtudW1iZXJ9ICovIChyZWFkZXIucmVhZEludDMyKCkpO1xuICAgICAgbXNnLnNldERpY2VQb29sKHZhbHVlKTtcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgMzpcbiAgICAgIHZhciB2YWx1ZSA9IC8qKiBAdHlwZSB7bnVtYmVyfSAqLyAocmVhZGVyLnJlYWRJbnQzMigpKTtcbiAgICAgIG1zZy5zZXREYW1hZ2UodmFsdWUpO1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSA0OlxuICAgICAgdmFyIHZhbHVlID0gLyoqIEB0eXBlIHtudW1iZXJ9ICovIChyZWFkZXIucmVhZEludDMyKCkpO1xuICAgICAgbXNnLnNldFJhbmdlKHZhbHVlKTtcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgNTpcbiAgICAgIHZhciB2YWx1ZSA9IC8qKiBAdHlwZSB7bnVtYmVyfSAqLyAocmVhZGVyLnJlYWRTaW50MzIoKSk7XG4gICAgICBtc2cuc2V0SW5pdGlhdGl2ZU1vZGlmaWVyKHZhbHVlKTtcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgNjpcbiAgICAgIHZhciB2YWx1ZSA9IC8qKiBAdHlwZSB7bnVtYmVyfSAqLyAocmVhZGVyLnJlYWRJbnQzMigpKTtcbiAgICAgIG1zZy5zZXRTaXplKHZhbHVlKTtcbiAgICAgIGJyZWFrO1xuICAgIGRlZmF1bHQ6XG4gICAgICByZWFkZXIuc2tpcEZpZWxkKCk7XG4gICAgICBicmVhaztcbiAgICB9XG4gIH1cbiAgcmV0dXJuIG1zZztcbn07XG5cblxuLyoqXG4gKiBTZXJpYWxpemVzIHRoZSBtZXNzYWdlIHRvIGJpbmFyeSBkYXRhIChpbiBwcm90b2J1ZiB3aXJlIGZvcm1hdCkuXG4gKiBAcmV0dXJuIHshVWludDhBcnJheX1cbiAqL1xucHJvdG8ubW9kZWxzLnByb3RvLmNvZmQuQ29mZFNoZWV0LkF0dGFjay5wcm90b3R5cGUuc2VyaWFsaXplQmluYXJ5ID0gZnVuY3Rpb24oKSB7XG4gIHZhciB3cml0ZXIgPSBuZXcganNwYi5CaW5hcnlXcml0ZXIoKTtcbiAgcHJvdG8ubW9kZWxzLnByb3RvLmNvZmQuQ29mZFNoZWV0LkF0dGFjay5zZXJpYWxpemVCaW5hcnlUb1dyaXRlcih0aGlzLCB3cml0ZXIpO1xuICByZXR1cm4gd3JpdGVyLmdldFJlc3VsdEJ1ZmZlcigpO1xufTtcblxuXG4vKipcbiAqIFNlcmlhbGl6ZXMgdGhlIGdpdmVuIG1lc3NhZ2UgdG8gYmluYXJ5IGRhdGEgKGluIHByb3RvYnVmIHdpcmVcbiAqIGZvcm1hdCksIHdyaXRpbmcgdG8gdGhlIGdpdmVuIEJpbmFyeVdyaXRlci5cbiAqIEBwYXJhbSB7IXByb3RvLm1vZGVscy5wcm90by5jb2ZkLkNvZmRTaGVldC5BdHRhY2t9IG1lc3NhZ2VcbiAqIEBwYXJhbSB7IWpzcGIuQmluYXJ5V3JpdGVyfSB3cml0ZXJcbiAqIEBzdXBwcmVzcyB7dW51c2VkTG9jYWxWYXJpYWJsZXN9IGYgaXMgb25seSB1c2VkIGZvciBuZXN0ZWQgbWVzc2FnZXNcbiAqL1xucHJvdG8ubW9kZWxzLnByb3RvLmNvZmQuQ29mZFNoZWV0LkF0dGFjay5zZXJpYWxpemVCaW5hcnlUb1dyaXRlciA9IGZ1bmN0aW9uKG1lc3NhZ2UsIHdyaXRlcikge1xuICB2YXIgZiA9IHVuZGVmaW5lZDtcbiAgZiA9IG1lc3NhZ2UuZ2V0TmFtZSgpO1xuICBpZiAoZi5sZW5ndGggPiAwKSB7XG4gICAgd3JpdGVyLndyaXRlU3RyaW5nKFxuICAgICAgMSxcbiAgICAgIGZcbiAgICApO1xuICB9XG4gIGYgPSBtZXNzYWdlLmdldERpY2VQb29sKCk7XG4gIGlmIChmICE9PSAwKSB7XG4gICAgd3JpdGVyLndyaXRlSW50MzIoXG4gICAgICAyLFxuICAgICAgZlxuICAgICk7XG4gIH1cbiAgZiA9IG1lc3NhZ2UuZ2V0RGFtYWdlKCk7XG4gIGlmIChmICE9PSAwKSB7XG4gICAgd3JpdGVyLndyaXRlSW50MzIoXG4gICAgICAzLFxuICAgICAgZlxuICAgICk7XG4gIH1cbiAgZiA9IG1lc3NhZ2UuZ2V0UmFuZ2UoKTtcbiAgaWYgKGYgIT09IDApIHtcbiAgICB3cml0ZXIud3JpdGVJbnQzMihcbiAgICAgIDQsXG4gICAgICBmXG4gICAgKTtcbiAgfVxuICBmID0gbWVzc2FnZS5nZXRJbml0aWF0aXZlTW9kaWZpZXIoKTtcbiAgaWYgKGYgIT09IDApIHtcbiAgICB3cml0ZXIud3JpdGVTaW50MzIoXG4gICAgICA1LFxuICAgICAgZlxuICAgICk7XG4gIH1cbiAgZiA9IG1lc3NhZ2UuZ2V0U2l6ZSgpO1xuICBpZiAoZiAhPT0gMCkge1xuICAgIHdyaXRlci53cml0ZUludDMyKFxuICAgICAgNixcbiAgICAgIGZcbiAgICApO1xuICB9XG59O1xuXG5cbi8qKlxuICogb3B0aW9uYWwgc3RyaW5nIG5hbWUgPSAxO1xuICogQHJldHVybiB7c3RyaW5nfVxuICovXG5wcm90by5tb2RlbHMucHJvdG8uY29mZC5Db2ZkU2hlZXQuQXR0YWNrLnByb3RvdHlwZS5nZXROYW1lID0gZnVuY3Rpb24oKSB7XG4gIHJldHVybiAvKiogQHR5cGUge3N0cmluZ30gKi8gKGpzcGIuTWVzc2FnZS5nZXRGaWVsZFdpdGhEZWZhdWx0KHRoaXMsIDEsIFwiXCIpKTtcbn07XG5cblxuLyoqXG4gKiBAcGFyYW0ge3N0cmluZ30gdmFsdWVcbiAqIEByZXR1cm4geyFwcm90by5tb2RlbHMucHJvdG8uY29mZC5Db2ZkU2hlZXQuQXR0YWNrfSByZXR1cm5zIHRoaXNcbiAqL1xucHJvdG8ubW9kZWxzLnByb3RvLmNvZmQuQ29mZFNoZWV0LkF0dGFjay5wcm90b3R5cGUuc2V0TmFtZSA9IGZ1bmN0aW9uKHZhbHVlKSB7XG4gIHJldHVybiBqc3BiLk1lc3NhZ2Uuc2V0UHJvdG8zU3RyaW5nRmllbGQodGhpcywgMSwgdmFsdWUpO1xufTtcblxuXG4vKipcbiAqIG9wdGlvbmFsIGludDMyIGRpY2VfcG9vbCA9IDI7XG4gKiBAcmV0dXJuIHtudW1iZXJ9XG4gKi9cbnByb3RvLm1vZGVscy5wcm90by5jb2ZkLkNvZmRTaGVldC5BdHRhY2sucHJvdG90eXBlLmdldERpY2VQb29sID0gZnVuY3Rpb24oKSB7XG4gIHJldHVybiAvKiogQHR5cGUge251bWJlcn0gKi8gKGpzcGIuTWVzc2FnZS5nZXRGaWVsZFdpdGhEZWZhdWx0KHRoaXMsIDIsIDApKTtcbn07XG5cblxuLyoqXG4gKiBAcGFyYW0ge251bWJlcn0gdmFsdWVcbiAqIEByZXR1cm4geyFwcm90by5tb2RlbHMucHJvdG8uY29mZC5Db2ZkU2hlZXQuQXR0YWNrfSByZXR1cm5zIHRoaXNcbiAqL1xucHJvdG8ubW9kZWxzLnByb3RvLmNvZmQuQ29mZFNoZWV0LkF0dGFjay5wcm90b3R5cGUuc2V0RGljZVBvb2wgPSBmdW5jdGlvbih2YWx1ZSkge1xuICByZXR1cm4ganNwYi5NZXNzYWdlLnNldFByb3RvM0ludEZpZWxkKHRoaXMsIDIsIHZhbHVlKTtcbn07XG5cblxuLyoqXG4gKiBvcHRpb25hbCBpbnQzMiBkYW1hZ2UgPSAzO1xuICogQHJldHVybiB7bnVtYmVyfVxuICovXG5wcm90by5tb2RlbHMucHJvdG8uY29mZC5Db2ZkU2hlZXQuQXR0YWNrLnByb3RvdHlwZS5nZXREYW1hZ2UgPSBmdW5jdGlvbigpIHtcbiAgcmV0dXJuIC8qKiBAdHlwZSB7bnVtYmVyfSAqLyAoanNwYi5NZXNzYWdlLmdldEZpZWxkV2l0aERlZmF1bHQodGhpcywgMywgMCkpO1xufTtcblxuXG4vKipcbiAqIEBwYXJhbSB7bnVtYmVyfSB2YWx1ZVxuICogQHJldHVybiB7IXByb3RvLm1vZGVscy5wcm90by5jb2ZkLkNvZmRTaGVldC5BdHRhY2t9IHJldHVybnMgdGhpc1xuICovXG5wcm90by5tb2RlbHMucHJvdG8uY29mZC5Db2ZkU2hlZXQuQXR0YWNrLnByb3RvdHlwZS5zZXREYW1hZ2UgPSBmdW5jdGlvbih2YWx1ZSkge1xuICByZXR1cm4ganNwYi5NZXNzYWdlLnNldFByb3RvM0ludEZpZWxkKHRoaXMsIDMsIHZhbHVlKTtcbn07XG5cblxuLyoqXG4gKiBvcHRpb25hbCBpbnQzMiByYW5nZSA9IDQ7XG4gKiBAcmV0dXJuIHtudW1iZXJ9XG4gKi9cbnByb3RvLm1vZGVscy5wcm90by5jb2ZkLkNvZmRTaGVldC5BdHRhY2sucHJvdG90eXBlLmdldFJhbmdlID0gZnVuY3Rpb24oKSB7XG4gIHJldHVybiAvKiogQHR5cGUge251bWJlcn0gKi8gKGpzcGIuTWVzc2FnZS5nZXRGaWVsZFdpdGhEZWZhdWx0KHRoaXMsIDQsIDApKTtcbn07XG5cblxuLyoqXG4gKiBAcGFyYW0ge251bWJlcn0gdmFsdWVcbiAqIEByZXR1cm4geyFwcm90by5tb2RlbHMucHJvdG8uY29mZC5Db2ZkU2hlZXQuQXR0YWNrfSByZXR1cm5zIHRoaXNcbiAqL1xucHJvdG8ubW9kZWxzLnByb3RvLmNvZmQuQ29mZFNoZWV0LkF0dGFjay5wcm90b3R5cGUuc2V0UmFuZ2UgPSBmdW5jdGlvbih2YWx1ZSkge1xuICByZXR1cm4ganNwYi5NZXNzYWdlLnNldFByb3RvM0ludEZpZWxkKHRoaXMsIDQsIHZhbHVlKTtcbn07XG5cblxuLyoqXG4gKiBvcHRpb25hbCBzaW50MzIgaW5pdGlhdGl2ZV9tb2RpZmllciA9IDU7XG4gKiBAcmV0dXJuIHtudW1iZXJ9XG4gKi9cbnByb3RvLm1vZGVscy5wcm90by5jb2ZkLkNvZmRTaGVldC5BdHRhY2sucHJvdG90eXBlLmdldEluaXRpYXRpdmVNb2RpZmllciA9IGZ1bmN0aW9uKCkge1xuICByZXR1cm4gLyoqIEB0eXBlIHtudW1iZXJ9ICovIChqc3BiLk1lc3NhZ2UuZ2V0RmllbGRXaXRoRGVmYXVsdCh0aGlzLCA1LCAwKSk7XG59O1xuXG5cbi8qKlxuICogQHBhcmFtIHtudW1iZXJ9IHZhbHVlXG4gKiBAcmV0dXJuIHshcHJvdG8ubW9kZWxzLnByb3RvLmNvZmQuQ29mZFNoZWV0LkF0dGFja30gcmV0dXJucyB0aGlzXG4gKi9cbnByb3RvLm1vZGVscy5wcm90by5jb2ZkLkNvZmRTaGVldC5BdHRhY2sucHJvdG90eXBlLnNldEluaXRpYXRpdmVNb2RpZmllciA9IGZ1bmN0aW9uKHZhbHVlKSB7XG4gIHJldHVybiBqc3BiLk1lc3NhZ2Uuc2V0UHJvdG8zSW50RmllbGQodGhpcywgNSwgdmFsdWUpO1xufTtcblxuXG4vKipcbiAqIG9wdGlvbmFsIGludDMyIHNpemUgPSA2O1xuICogQHJldHVybiB7bnVtYmVyfVxuICovXG5wcm90by5tb2RlbHMucHJvdG8uY29mZC5Db2ZkU2hlZXQuQXR0YWNrLnByb3RvdHlwZS5nZXRTaXplID0gZnVuY3Rpb24oKSB7XG4gIHJldHVybiAvKiogQHR5cGUge251bWJlcn0gKi8gKGpzcGIuTWVzc2FnZS5nZXRGaWVsZFdpdGhEZWZhdWx0KHRoaXMsIDYsIDApKTtcbn07XG5cblxuLyoqXG4gKiBAcGFyYW0ge251bWJlcn0gdmFsdWVcbiAqIEByZXR1cm4geyFwcm90by5tb2RlbHMucHJvdG8uY29mZC5Db2ZkU2hlZXQuQXR0YWNrfSByZXR1cm5zIHRoaXNcbiAqL1xucHJvdG8ubW9kZWxzLnByb3RvLmNvZmQuQ29mZFNoZWV0LkF0dGFjay5wcm90b3R5cGUuc2V0U2l6ZSA9IGZ1bmN0aW9uKHZhbHVlKSB7XG4gIHJldHVybiBqc3BiLk1lc3NhZ2Uuc2V0UHJvdG8zSW50RmllbGQodGhpcywgNiwgdmFsdWUpO1xufTtcblxuXG4vKipcbiAqIG9wdGlvbmFsIHN0cmluZyBuYW1lID0gMTtcbiAqIEByZXR1cm4ge3N0cmluZ31cbiAqL1xucHJvdG8ubW9kZWxzLnByb3RvLmNvZmQuQ29mZFNoZWV0LnByb3RvdHlwZS5nZXROYW1lID0gZnVuY3Rpb24oKSB7XG4gIHJldHVybiAvKiogQHR5cGUge3N0cmluZ30gKi8gKGpzcGIuTWVzc2FnZS5nZXRGaWVsZFdpdGhEZWZhdWx0KHRoaXMsIDEsIFwiXCIpKTtcbn07XG5cblxuLyoqXG4gKiBAcGFyYW0ge3N0cmluZ30gdmFsdWVcbiAqIEByZXR1cm4geyFwcm90by5tb2RlbHMucHJvdG8uY29mZC5Db2ZkU2hlZXR9IHJldHVybnMgdGhpc1xuICovXG5wcm90by5tb2RlbHMucHJvdG8uY29mZC5Db2ZkU2hlZXQucHJvdG90eXBlLnNldE5hbWUgPSBmdW5jdGlvbih2YWx1ZSkge1xuICByZXR1cm4ganNwYi5NZXNzYWdlLnNldFByb3RvM1N0cmluZ0ZpZWxkKHRoaXMsIDEsIHZhbHVlKTtcbn07XG5cblxuLyoqXG4gKiBvcHRpb25hbCBzdHJpbmcgcGxheWVyID0gMjtcbiAqIEByZXR1cm4ge3N0cmluZ31cbiAqL1xucHJvdG8ubW9kZWxzLnByb3RvLmNvZmQuQ29mZFNoZWV0LnByb3RvdHlwZS5nZXRQbGF5ZXIgPSBmdW5jdGlvbigpIHtcbiAgcmV0dXJuIC8qKiBAdHlwZSB7c3RyaW5nfSAqLyAoanNwYi5NZXNzYWdlLmdldEZpZWxkV2l0aERlZmF1bHQodGhpcywgMiwgXCJcIikpO1xufTtcblxuXG4vKipcbiAqIEBwYXJhbSB7c3RyaW5nfSB2YWx1ZVxuICogQHJldHVybiB7IXByb3RvLm1vZGVscy5wcm90by5jb2ZkLkNvZmRTaGVldH0gcmV0dXJucyB0aGlzXG4gKi9cbnByb3RvLm1vZGVscy5wcm90by5jb2ZkLkNvZmRTaGVldC5wcm90b3R5cGUuc2V0UGxheWVyID0gZnVuY3Rpb24odmFsdWUpIHtcbiAgcmV0dXJuIGpzcGIuTWVzc2FnZS5zZXRQcm90bzNTdHJpbmdGaWVsZCh0aGlzLCAyLCB2YWx1ZSk7XG59O1xuXG5cbi8qKlxuICogb3B0aW9uYWwgc3RyaW5nIGNhbXBhaWduID0gMztcbiAqIEByZXR1cm4ge3N0cmluZ31cbiAqL1xucHJvdG8ubW9kZWxzLnByb3RvLmNvZmQuQ29mZFNoZWV0LnByb3RvdHlwZS5nZXRDYW1wYWlnbiA9IGZ1bmN0aW9uKCkge1xuICByZXR1cm4gLyoqIEB0eXBlIHtzdHJpbmd9ICovIChqc3BiLk1lc3NhZ2UuZ2V0RmllbGRXaXRoRGVmYXVsdCh0aGlzLCAzLCBcIlwiKSk7XG59O1xuXG5cbi8qKlxuICogQHBhcmFtIHtzdHJpbmd9IHZhbHVlXG4gKiBAcmV0dXJuIHshcHJvdG8ubW9kZWxzLnByb3RvLmNvZmQuQ29mZFNoZWV0fSByZXR1cm5zIHRoaXNcbiAqL1xucHJvdG8ubW9kZWxzLnByb3RvLmNvZmQuQ29mZFNoZWV0LnByb3RvdHlwZS5zZXRDYW1wYWlnbiA9IGZ1bmN0aW9uKHZhbHVlKSB7XG4gIHJldHVybiBqc3BiLk1lc3NhZ2Uuc2V0UHJvdG8zU3RyaW5nRmllbGQodGhpcywgMywgdmFsdWUpO1xufTtcblxuXG4vKipcbiAqIG9wdGlvbmFsIHN0cmluZyBkZXNjcmlwdGlvbiA9IDQ7XG4gKiBAcmV0dXJuIHtzdHJpbmd9XG4gKi9cbnByb3RvLm1vZGVscy5wcm90by5jb2ZkLkNvZmRTaGVldC5wcm90b3R5cGUuZ2V0RGVzY3JpcHRpb24gPSBmdW5jdGlvbigpIHtcbiAgcmV0dXJuIC8qKiBAdHlwZSB7c3RyaW5nfSAqLyAoanNwYi5NZXNzYWdlLmdldEZpZWxkV2l0aERlZmF1bHQodGhpcywgNCwgXCJcIikpO1xufTtcblxuXG4vKipcbiAqIEBwYXJhbSB7c3RyaW5nfSB2YWx1ZVxuICogQHJldHVybiB7IXByb3RvLm1vZGVscy5wcm90by5jb2ZkLkNvZmRTaGVldH0gcmV0dXJucyB0aGlzXG4gKi9cbnByb3RvLm1vZGVscy5wcm90by5jb2ZkLkNvZmRTaGVldC5wcm90b3R5cGUuc2V0RGVzY3JpcHRpb24gPSBmdW5jdGlvbih2YWx1ZSkge1xuICByZXR1cm4ganNwYi5NZXNzYWdlLnNldFByb3RvM1N0cmluZ0ZpZWxkKHRoaXMsIDQsIHZhbHVlKTtcbn07XG5cblxuLyoqXG4gKiBvcHRpb25hbCBpbnQzMiBzdHJlbmd0aCA9IDY7XG4gKiBAcmV0dXJuIHtudW1iZXJ9XG4gKi9cbnByb3RvLm1vZGVscy5wcm90by5jb2ZkLkNvZmRTaGVldC5wcm90b3R5cGUuZ2V0U3RyZW5ndGggPSBmdW5jdGlvbigpIHtcbiAgcmV0dXJuIC8qKiBAdHlwZSB7bnVtYmVyfSAqLyAoanNwYi5NZXNzYWdlLmdldEZpZWxkV2l0aERlZmF1bHQodGhpcywgNiwgMCkpO1xufTtcblxuXG4vKipcbiAqIEBwYXJhbSB7bnVtYmVyfSB2YWx1ZVxuICogQHJldHVybiB7IXByb3RvLm1vZGVscy5wcm90by5jb2ZkLkNvZmRTaGVldH0gcmV0dXJucyB0aGlzXG4gKi9cbnByb3RvLm1vZGVscy5wcm90by5jb2ZkLkNvZmRTaGVldC5wcm90b3R5cGUuc2V0U3RyZW5ndGggPSBmdW5jdGlvbih2YWx1ZSkge1xuICByZXR1cm4ganNwYi5NZXNzYWdlLnNldFByb3RvM0ludEZpZWxkKHRoaXMsIDYsIHZhbHVlKTtcbn07XG5cblxuLyoqXG4gKiBvcHRpb25hbCBpbnQzMiBkZXh0ZXJpdHkgPSA3O1xuICogQHJldHVybiB7bnVtYmVyfVxuICovXG5wcm90by5tb2RlbHMucHJvdG8uY29mZC5Db2ZkU2hlZXQucHJvdG90eXBlLmdldERleHRlcml0eSA9IGZ1bmN0aW9uKCkge1xuICByZXR1cm4gLyoqIEB0eXBlIHtudW1iZXJ9ICovIChqc3BiLk1lc3NhZ2UuZ2V0RmllbGRXaXRoRGVmYXVsdCh0aGlzLCA3LCAwKSk7XG59O1xuXG5cbi8qKlxuICogQHBhcmFtIHtudW1iZXJ9IHZhbHVlXG4gKiBAcmV0dXJuIHshcHJvdG8ubW9kZWxzLnByb3RvLmNvZmQuQ29mZFNoZWV0fSByZXR1cm5zIHRoaXNcbiAqL1xucHJvdG8ubW9kZWxzLnByb3RvLmNvZmQuQ29mZFNoZWV0LnByb3RvdHlwZS5zZXREZXh0ZXJpdHkgPSBmdW5jdGlvbih2YWx1ZSkge1xuICByZXR1cm4ganNwYi5NZXNzYWdlLnNldFByb3RvM0ludEZpZWxkKHRoaXMsIDcsIHZhbHVlKTtcbn07XG5cblxuLyoqXG4gKiBvcHRpb25hbCBpbnQzMiBzdGFtaW5hID0gODtcbiAqIEByZXR1cm4ge251bWJlcn1cbiAqL1xucHJvdG8ubW9kZWxzLnByb3RvLmNvZmQuQ29mZFNoZWV0LnByb3RvdHlwZS5nZXRTdGFtaW5hID0gZnVuY3Rpb24oKSB7XG4gIHJldHVybiAvKiogQHR5cGUge251bWJlcn0gKi8gKGpzcGIuTWVzc2FnZS5nZXRGaWVsZFdpdGhEZWZhdWx0KHRoaXMsIDgsIDApKTtcbn07XG5cblxuLyoqXG4gKiBAcGFyYW0ge251bWJlcn0gdmFsdWVcbiAqIEByZXR1cm4geyFwcm90by5tb2RlbHMucHJvdG8uY29mZC5Db2ZkU2hlZXR9IHJldHVybnMgdGhpc1xuICovXG5wcm90by5tb2RlbHMucHJvdG8uY29mZC5Db2ZkU2hlZXQucHJvdG90eXBlLnNldFN0YW1pbmEgPSBmdW5jdGlvbih2YWx1ZSkge1xuICByZXR1cm4ganNwYi5NZXNzYWdlLnNldFByb3RvM0ludEZpZWxkKHRoaXMsIDgsIHZhbHVlKTtcbn07XG5cblxuLyoqXG4gKiBvcHRpb25hbCBpbnQzMiBpbnRlbGxpZ2VuY2UgPSA5O1xuICogQHJldHVybiB7bnVtYmVyfVxuICovXG5wcm90by5tb2RlbHMucHJvdG8uY29mZC5Db2ZkU2hlZXQucHJvdG90eXBlLmdldEludGVsbGlnZW5jZSA9IGZ1bmN0aW9uKCkge1xuICByZXR1cm4gLyoqIEB0eXBlIHtudW1iZXJ9ICovIChqc3BiLk1lc3NhZ2UuZ2V0RmllbGRXaXRoRGVmYXVsdCh0aGlzLCA5LCAwKSk7XG59O1xuXG5cbi8qKlxuICogQHBhcmFtIHtudW1iZXJ9IHZhbHVlXG4gKiBAcmV0dXJuIHshcHJvdG8ubW9kZWxzLnByb3RvLmNvZmQuQ29mZFNoZWV0fSByZXR1cm5zIHRoaXNcbiAqL1xucHJvdG8ubW9kZWxzLnByb3RvLmNvZmQuQ29mZFNoZWV0LnByb3RvdHlwZS5zZXRJbnRlbGxpZ2VuY2UgPSBmdW5jdGlvbih2YWx1ZSkge1xuICByZXR1cm4ganNwYi5NZXNzYWdlLnNldFByb3RvM0ludEZpZWxkKHRoaXMsIDksIHZhbHVlKTtcbn07XG5cblxuLyoqXG4gKiBvcHRpb25hbCBpbnQzMiB3aXRzID0gMTA7XG4gKiBAcmV0dXJuIHtudW1iZXJ9XG4gKi9cbnByb3RvLm1vZGVscy5wcm90by5jb2ZkLkNvZmRTaGVldC5wcm90b3R5cGUuZ2V0V2l0cyA9IGZ1bmN0aW9uKCkge1xuICByZXR1cm4gLyoqIEB0eXBlIHtudW1iZXJ9ICovIChqc3BiLk1lc3NhZ2UuZ2V0RmllbGRXaXRoRGVmYXVsdCh0aGlzLCAxMCwgMCkpO1xufTtcblxuXG4vKipcbiAqIEBwYXJhbSB7bnVtYmVyfSB2YWx1ZVxuICogQHJldHVybiB7IXByb3RvLm1vZGVscy5wcm90by5jb2ZkLkNvZmRTaGVldH0gcmV0dXJucyB0aGlzXG4gKi9cbnByb3RvLm1vZGVscy5wcm90by5jb2ZkLkNvZmRTaGVldC5wcm90b3R5cGUuc2V0V2l0cyA9IGZ1bmN0aW9uKHZhbHVlKSB7XG4gIHJldHVybiBqc3BiLk1lc3NhZ2Uuc2V0UHJvdG8zSW50RmllbGQodGhpcywgMTAsIHZhbHVlKTtcbn07XG5cblxuLyoqXG4gKiBvcHRpb25hbCBpbnQzMiByZXNvbHZlID0gMTE7XG4gKiBAcmV0dXJuIHtudW1iZXJ9XG4gKi9cbnByb3RvLm1vZGVscy5wcm90by5jb2ZkLkNvZmRTaGVldC5wcm90b3R5cGUuZ2V0UmVzb2x2ZSA9IGZ1bmN0aW9uKCkge1xuICByZXR1cm4gLyoqIEB0eXBlIHtudW1iZXJ9ICovIChqc3BiLk1lc3NhZ2UuZ2V0RmllbGRXaXRoRGVmYXVsdCh0aGlzLCAxMSwgMCkpO1xufTtcblxuXG4vKipcbiAqIEBwYXJhbSB7bnVtYmVyfSB2YWx1ZVxuICogQHJldHVybiB7IXByb3RvLm1vZGVscy5wcm90by5jb2ZkLkNvZmRTaGVldH0gcmV0dXJucyB0aGlzXG4gKi9cbnByb3RvLm1vZGVscy5wcm90by5jb2ZkLkNvZmRTaGVldC5wcm90b3R5cGUuc2V0UmVzb2x2ZSA9IGZ1bmN0aW9uKHZhbHVlKSB7XG4gIHJldHVybiBqc3BiLk1lc3NhZ2Uuc2V0UHJvdG8zSW50RmllbGQodGhpcywgMTEsIHZhbHVlKTtcbn07XG5cblxuLyoqXG4gKiBvcHRpb25hbCBpbnQzMiBwcmVzZW5jZSA9IDEyO1xuICogQHJldHVybiB7bnVtYmVyfVxuICovXG5wcm90by5tb2RlbHMucHJvdG8uY29mZC5Db2ZkU2hlZXQucHJvdG90eXBlLmdldFByZXNlbmNlID0gZnVuY3Rpb24oKSB7XG4gIHJldHVybiAvKiogQHR5cGUge251bWJlcn0gKi8gKGpzcGIuTWVzc2FnZS5nZXRGaWVsZFdpdGhEZWZhdWx0KHRoaXMsIDEyLCAwKSk7XG59O1xuXG5cbi8qKlxuICogQHBhcmFtIHtudW1iZXJ9IHZhbHVlXG4gKiBAcmV0dXJuIHshcHJvdG8ubW9kZWxzLnByb3RvLmNvZmQuQ29mZFNoZWV0fSByZXR1cm5zIHRoaXNcbiAqL1xucHJvdG8ubW9kZWxzLnByb3RvLmNvZmQuQ29mZFNoZWV0LnByb3RvdHlwZS5zZXRQcmVzZW5jZSA9IGZ1bmN0aW9uKHZhbHVlKSB7XG4gIHJldHVybiBqc3BiLk1lc3NhZ2Uuc2V0UHJvdG8zSW50RmllbGQodGhpcywgMTIsIHZhbHVlKTtcbn07XG5cblxuLyoqXG4gKiBvcHRpb25hbCBpbnQzMiBtYW5pcHVsYXRpb24gPSAxMztcbiAqIEByZXR1cm4ge251bWJlcn1cbiAqL1xucHJvdG8ubW9kZWxzLnByb3RvLmNvZmQuQ29mZFNoZWV0LnByb3RvdHlwZS5nZXRNYW5pcHVsYXRpb24gPSBmdW5jdGlvbigpIHtcbiAgcmV0dXJuIC8qKiBAdHlwZSB7bnVtYmVyfSAqLyAoanNwYi5NZXNzYWdlLmdldEZpZWxkV2l0aERlZmF1bHQodGhpcywgMTMsIDApKTtcbn07XG5cblxuLyoqXG4gKiBAcGFyYW0ge251bWJlcn0gdmFsdWVcbiAqIEByZXR1cm4geyFwcm90by5tb2RlbHMucHJvdG8uY29mZC5Db2ZkU2hlZXR9IHJldHVybnMgdGhpc1xuICovXG5wcm90by5tb2RlbHMucHJvdG8uY29mZC5Db2ZkU2hlZXQucHJvdG90eXBlLnNldE1hbmlwdWxhdGlvbiA9IGZ1bmN0aW9uKHZhbHVlKSB7XG4gIHJldHVybiBqc3BiLk1lc3NhZ2Uuc2V0UHJvdG8zSW50RmllbGQodGhpcywgMTMsIHZhbHVlKTtcbn07XG5cblxuLyoqXG4gKiBvcHRpb25hbCBpbnQzMiBjb21wb3N1cmUgPSAxNDtcbiAqIEByZXR1cm4ge251bWJlcn1cbiAqL1xucHJvdG8ubW9kZWxzLnByb3RvLmNvZmQuQ29mZFNoZWV0LnByb3RvdHlwZS5nZXRDb21wb3N1cmUgPSBmdW5jdGlvbigpIHtcbiAgcmV0dXJuIC8qKiBAdHlwZSB7bnVtYmVyfSAqLyAoanNwYi5NZXNzYWdlLmdldEZpZWxkV2l0aERlZmF1bHQodGhpcywgMTQsIDApKTtcbn07XG5cblxuLyoqXG4gKiBAcGFyYW0ge251bWJlcn0gdmFsdWVcbiAqIEByZXR1cm4geyFwcm90by5tb2RlbHMucHJvdG8uY29mZC5Db2ZkU2hlZXR9IHJldHVybnMgdGhpc1xuICovXG5wcm90by5tb2RlbHMucHJvdG8uY29mZC5Db2ZkU2hlZXQucHJvdG90eXBlLnNldENvbXBvc3VyZSA9IGZ1bmN0aW9uKHZhbHVlKSB7XG4gIHJldHVybiBqc3BiLk1lc3NhZ2Uuc2V0UHJvdG8zSW50RmllbGQodGhpcywgMTQsIHZhbHVlKTtcbn07XG5cblxuLyoqXG4gKiBtYXA8c3RyaW5nLCBTa2lsbD4gcGh5c2ljYWxfc2tpbGxzID0gMTY7XG4gKiBAcGFyYW0ge2Jvb2xlYW49fSBvcHRfbm9MYXp5Q3JlYXRlIERvIG5vdCBjcmVhdGUgdGhlIG1hcCBpZlxuICogZW1wdHksIGluc3RlYWQgcmV0dXJuaW5nIGB1bmRlZmluZWRgXG4gKiBAcmV0dXJuIHshanNwYi5NYXA8c3RyaW5nLCFwcm90by5tb2RlbHMucHJvdG8uY29mZC5Db2ZkU2hlZXQuU2tpbGw+fVxuICovXG5wcm90by5tb2RlbHMucHJvdG8uY29mZC5Db2ZkU2hlZXQucHJvdG90eXBlLmdldFBoeXNpY2FsU2tpbGxzTWFwID0gZnVuY3Rpb24ob3B0X25vTGF6eUNyZWF0ZSkge1xuICByZXR1cm4gLyoqIEB0eXBlIHshanNwYi5NYXA8c3RyaW5nLCFwcm90by5tb2RlbHMucHJvdG8uY29mZC5Db2ZkU2hlZXQuU2tpbGw+fSAqLyAoXG4gICAgICBqc3BiLk1lc3NhZ2UuZ2V0TWFwRmllbGQodGhpcywgMTYsIG9wdF9ub0xhenlDcmVhdGUsXG4gICAgICBwcm90by5tb2RlbHMucHJvdG8uY29mZC5Db2ZkU2hlZXQuU2tpbGwpKTtcbn07XG5cblxuLyoqXG4gKiBDbGVhcnMgdmFsdWVzIGZyb20gdGhlIG1hcC4gVGhlIG1hcCB3aWxsIGJlIG5vbi1udWxsLlxuICogQHJldHVybiB7IXByb3RvLm1vZGVscy5wcm90by5jb2ZkLkNvZmRTaGVldH0gcmV0dXJucyB0aGlzXG4gKi9cbnByb3RvLm1vZGVscy5wcm90by5jb2ZkLkNvZmRTaGVldC5wcm90b3R5cGUuY2xlYXJQaHlzaWNhbFNraWxsc01hcCA9IGZ1bmN0aW9uKCkge1xuICB0aGlzLmdldFBoeXNpY2FsU2tpbGxzTWFwKCkuY2xlYXIoKTtcbiAgcmV0dXJuIHRoaXM7fTtcblxuXG4vKipcbiAqIG1hcDxzdHJpbmcsIFNraWxsPiBtZW50YWxfc2tpbGxzID0gMTc7XG4gKiBAcGFyYW0ge2Jvb2xlYW49fSBvcHRfbm9MYXp5Q3JlYXRlIERvIG5vdCBjcmVhdGUgdGhlIG1hcCBpZlxuICogZW1wdHksIGluc3RlYWQgcmV0dXJuaW5nIGB1bmRlZmluZWRgXG4gKiBAcmV0dXJuIHshanNwYi5NYXA8c3RyaW5nLCFwcm90by5tb2RlbHMucHJvdG8uY29mZC5Db2ZkU2hlZXQuU2tpbGw+fVxuICovXG5wcm90by5tb2RlbHMucHJvdG8uY29mZC5Db2ZkU2hlZXQucHJvdG90eXBlLmdldE1lbnRhbFNraWxsc01hcCA9IGZ1bmN0aW9uKG9wdF9ub0xhenlDcmVhdGUpIHtcbiAgcmV0dXJuIC8qKiBAdHlwZSB7IWpzcGIuTWFwPHN0cmluZywhcHJvdG8ubW9kZWxzLnByb3RvLmNvZmQuQ29mZFNoZWV0LlNraWxsPn0gKi8gKFxuICAgICAganNwYi5NZXNzYWdlLmdldE1hcEZpZWxkKHRoaXMsIDE3LCBvcHRfbm9MYXp5Q3JlYXRlLFxuICAgICAgcHJvdG8ubW9kZWxzLnByb3RvLmNvZmQuQ29mZFNoZWV0LlNraWxsKSk7XG59O1xuXG5cbi8qKlxuICogQ2xlYXJzIHZhbHVlcyBmcm9tIHRoZSBtYXAuIFRoZSBtYXAgd2lsbCBiZSBub24tbnVsbC5cbiAqIEByZXR1cm4geyFwcm90by5tb2RlbHMucHJvdG8uY29mZC5Db2ZkU2hlZXR9IHJldHVybnMgdGhpc1xuICovXG5wcm90by5tb2RlbHMucHJvdG8uY29mZC5Db2ZkU2hlZXQucHJvdG90eXBlLmNsZWFyTWVudGFsU2tpbGxzTWFwID0gZnVuY3Rpb24oKSB7XG4gIHRoaXMuZ2V0TWVudGFsU2tpbGxzTWFwKCkuY2xlYXIoKTtcbiAgcmV0dXJuIHRoaXM7fTtcblxuXG4vKipcbiAqIG1hcDxzdHJpbmcsIFNraWxsPiBzb2NpYWxfc2tpbGxzID0gMTg7XG4gKiBAcGFyYW0ge2Jvb2xlYW49fSBvcHRfbm9MYXp5Q3JlYXRlIERvIG5vdCBjcmVhdGUgdGhlIG1hcCBpZlxuICogZW1wdHksIGluc3RlYWQgcmV0dXJuaW5nIGB1bmRlZmluZWRgXG4gKiBAcmV0dXJuIHshanNwYi5NYXA8c3RyaW5nLCFwcm90by5tb2RlbHMucHJvdG8uY29mZC5Db2ZkU2hlZXQuU2tpbGw+fVxuICovXG5wcm90by5tb2RlbHMucHJvdG8uY29mZC5Db2ZkU2hlZXQucHJvdG90eXBlLmdldFNvY2lhbFNraWxsc01hcCA9IGZ1bmN0aW9uKG9wdF9ub0xhenlDcmVhdGUpIHtcbiAgcmV0dXJuIC8qKiBAdHlwZSB7IWpzcGIuTWFwPHN0cmluZywhcHJvdG8ubW9kZWxzLnByb3RvLmNvZmQuQ29mZFNoZWV0LlNraWxsPn0gKi8gKFxuICAgICAganNwYi5NZXNzYWdlLmdldE1hcEZpZWxkKHRoaXMsIDE4LCBvcHRfbm9MYXp5Q3JlYXRlLFxuICAgICAgcHJvdG8ubW9kZWxzLnByb3RvLmNvZmQuQ29mZFNoZWV0LlNraWxsKSk7XG59O1xuXG5cbi8qKlxuICogQ2xlYXJzIHZhbHVlcyBmcm9tIHRoZSBtYXAuIFRoZSBtYXAgd2lsbCBiZSBub24tbnVsbC5cbiAqIEByZXR1cm4geyFwcm90by5tb2RlbHMucHJvdG8uY29mZC5Db2ZkU2hlZXR9IHJldHVybnMgdGhpc1xuICovXG5wcm90by5tb2RlbHMucHJvdG8uY29mZC5Db2ZkU2hlZXQucHJvdG90eXBlLmNsZWFyU29jaWFsU2tpbGxzTWFwID0gZnVuY3Rpb24oKSB7XG4gIHRoaXMuZ2V0U29jaWFsU2tpbGxzTWFwKCkuY2xlYXIoKTtcbiAgcmV0dXJuIHRoaXM7fTtcblxuXG4vKipcbiAqIHJlcGVhdGVkIE1lcml0IG1lcml0cyA9IDE1O1xuICogQHJldHVybiB7IUFycmF5PCFwcm90by5tb2RlbHMucHJvdG8uY29mZC5Db2ZkU2hlZXQuTWVyaXQ+fVxuICovXG5wcm90by5tb2RlbHMucHJvdG8uY29mZC5Db2ZkU2hlZXQucHJvdG90eXBlLmdldE1lcml0c0xpc3QgPSBmdW5jdGlvbigpIHtcbiAgcmV0dXJuIC8qKiBAdHlwZXshQXJyYXk8IXByb3RvLm1vZGVscy5wcm90by5jb2ZkLkNvZmRTaGVldC5NZXJpdD59ICovIChcbiAgICBqc3BiLk1lc3NhZ2UuZ2V0UmVwZWF0ZWRXcmFwcGVyRmllbGQodGhpcywgcHJvdG8ubW9kZWxzLnByb3RvLmNvZmQuQ29mZFNoZWV0Lk1lcml0LCAxNSkpO1xufTtcblxuXG4vKipcbiAqIEBwYXJhbSB7IUFycmF5PCFwcm90by5tb2RlbHMucHJvdG8uY29mZC5Db2ZkU2hlZXQuTWVyaXQ+fSB2YWx1ZVxuICogQHJldHVybiB7IXByb3RvLm1vZGVscy5wcm90by5jb2ZkLkNvZmRTaGVldH0gcmV0dXJucyB0aGlzXG4qL1xucHJvdG8ubW9kZWxzLnByb3RvLmNvZmQuQ29mZFNoZWV0LnByb3RvdHlwZS5zZXRNZXJpdHNMaXN0ID0gZnVuY3Rpb24odmFsdWUpIHtcbiAgcmV0dXJuIGpzcGIuTWVzc2FnZS5zZXRSZXBlYXRlZFdyYXBwZXJGaWVsZCh0aGlzLCAxNSwgdmFsdWUpO1xufTtcblxuXG4vKipcbiAqIEBwYXJhbSB7IXByb3RvLm1vZGVscy5wcm90by5jb2ZkLkNvZmRTaGVldC5NZXJpdD19IG9wdF92YWx1ZVxuICogQHBhcmFtIHtudW1iZXI9fSBvcHRfaW5kZXhcbiAqIEByZXR1cm4geyFwcm90by5tb2RlbHMucHJvdG8uY29mZC5Db2ZkU2hlZXQuTWVyaXR9XG4gKi9cbnByb3RvLm1vZGVscy5wcm90by5jb2ZkLkNvZmRTaGVldC5wcm90b3R5cGUuYWRkTWVyaXRzID0gZnVuY3Rpb24ob3B0X3ZhbHVlLCBvcHRfaW5kZXgpIHtcbiAgcmV0dXJuIGpzcGIuTWVzc2FnZS5hZGRUb1JlcGVhdGVkV3JhcHBlckZpZWxkKHRoaXMsIDE1LCBvcHRfdmFsdWUsIHByb3RvLm1vZGVscy5wcm90by5jb2ZkLkNvZmRTaGVldC5NZXJpdCwgb3B0X2luZGV4KTtcbn07XG5cblxuLyoqXG4gKiBDbGVhcnMgdGhlIGxpc3QgbWFraW5nIGl0IGVtcHR5IGJ1dCBub24tbnVsbC5cbiAqIEByZXR1cm4geyFwcm90by5tb2RlbHMucHJvdG8uY29mZC5Db2ZkU2hlZXR9IHJldHVybnMgdGhpc1xuICovXG5wcm90by5tb2RlbHMucHJvdG8uY29mZC5Db2ZkU2hlZXQucHJvdG90eXBlLmNsZWFyTWVyaXRzTGlzdCA9IGZ1bmN0aW9uKCkge1xuICByZXR1cm4gdGhpcy5zZXRNZXJpdHNMaXN0KFtdKTtcbn07XG5cblxuLyoqXG4gKiByZXBlYXRlZCBDb25kaXRpb24gY29uZGl0aW9ucyA9IDE5O1xuICogQHJldHVybiB7IUFycmF5PCFwcm90by5tb2RlbHMucHJvdG8uY29mZC5Db2ZkU2hlZXQuQ29uZGl0aW9uPn1cbiAqL1xucHJvdG8ubW9kZWxzLnByb3RvLmNvZmQuQ29mZFNoZWV0LnByb3RvdHlwZS5nZXRDb25kaXRpb25zTGlzdCA9IGZ1bmN0aW9uKCkge1xuICByZXR1cm4gLyoqIEB0eXBleyFBcnJheTwhcHJvdG8ubW9kZWxzLnByb3RvLmNvZmQuQ29mZFNoZWV0LkNvbmRpdGlvbj59ICovIChcbiAgICBqc3BiLk1lc3NhZ2UuZ2V0UmVwZWF0ZWRXcmFwcGVyRmllbGQodGhpcywgcHJvdG8ubW9kZWxzLnByb3RvLmNvZmQuQ29mZFNoZWV0LkNvbmRpdGlvbiwgMTkpKTtcbn07XG5cblxuLyoqXG4gKiBAcGFyYW0geyFBcnJheTwhcHJvdG8ubW9kZWxzLnByb3RvLmNvZmQuQ29mZFNoZWV0LkNvbmRpdGlvbj59IHZhbHVlXG4gKiBAcmV0dXJuIHshcHJvdG8ubW9kZWxzLnByb3RvLmNvZmQuQ29mZFNoZWV0fSByZXR1cm5zIHRoaXNcbiovXG5wcm90by5tb2RlbHMucHJvdG8uY29mZC5Db2ZkU2hlZXQucHJvdG90eXBlLnNldENvbmRpdGlvbnNMaXN0ID0gZnVuY3Rpb24odmFsdWUpIHtcbiAgcmV0dXJuIGpzcGIuTWVzc2FnZS5zZXRSZXBlYXRlZFdyYXBwZXJGaWVsZCh0aGlzLCAxOSwgdmFsdWUpO1xufTtcblxuXG4vKipcbiAqIEBwYXJhbSB7IXByb3RvLm1vZGVscy5wcm90by5jb2ZkLkNvZmRTaGVldC5Db25kaXRpb249fSBvcHRfdmFsdWVcbiAqIEBwYXJhbSB7bnVtYmVyPX0gb3B0X2luZGV4XG4gKiBAcmV0dXJuIHshcHJvdG8ubW9kZWxzLnByb3RvLmNvZmQuQ29mZFNoZWV0LkNvbmRpdGlvbn1cbiAqL1xucHJvdG8ubW9kZWxzLnByb3RvLmNvZmQuQ29mZFNoZWV0LnByb3RvdHlwZS5hZGRDb25kaXRpb25zID0gZnVuY3Rpb24ob3B0X3ZhbHVlLCBvcHRfaW5kZXgpIHtcbiAgcmV0dXJuIGpzcGIuTWVzc2FnZS5hZGRUb1JlcGVhdGVkV3JhcHBlckZpZWxkKHRoaXMsIDE5LCBvcHRfdmFsdWUsIHByb3RvLm1vZGVscy5wcm90by5jb2ZkLkNvZmRTaGVldC5Db25kaXRpb24sIG9wdF9pbmRleCk7XG59O1xuXG5cbi8qKlxuICogQ2xlYXJzIHRoZSBsaXN0IG1ha2luZyBpdCBlbXB0eSBidXQgbm9uLW51bGwuXG4gKiBAcmV0dXJuIHshcHJvdG8ubW9kZWxzLnByb3RvLmNvZmQuQ29mZFNoZWV0fSByZXR1cm5zIHRoaXNcbiAqL1xucHJvdG8ubW9kZWxzLnByb3RvLmNvZmQuQ29mZFNoZWV0LnByb3RvdHlwZS5jbGVhckNvbmRpdGlvbnNMaXN0ID0gZnVuY3Rpb24oKSB7XG4gIHJldHVybiB0aGlzLnNldENvbmRpdGlvbnNMaXN0KFtdKTtcbn07XG5cblxuLyoqXG4gKiBvcHRpb25hbCBpbnQzMiBzaXplID0gMjA7XG4gKiBAcmV0dXJuIHtudW1iZXJ9XG4gKi9cbnByb3RvLm1vZGVscy5wcm90by5jb2ZkLkNvZmRTaGVldC5wcm90b3R5cGUuZ2V0U2l6ZSA9IGZ1bmN0aW9uKCkge1xuICByZXR1cm4gLyoqIEB0eXBlIHtudW1iZXJ9ICovIChqc3BiLk1lc3NhZ2UuZ2V0RmllbGRXaXRoRGVmYXVsdCh0aGlzLCAyMCwgMCkpO1xufTtcblxuXG4vKipcbiAqIEBwYXJhbSB7bnVtYmVyfSB2YWx1ZVxuICogQHJldHVybiB7IXByb3RvLm1vZGVscy5wcm90by5jb2ZkLkNvZmRTaGVldH0gcmV0dXJucyB0aGlzXG4gKi9cbnByb3RvLm1vZGVscy5wcm90by5jb2ZkLkNvZmRTaGVldC5wcm90b3R5cGUuc2V0U2l6ZSA9IGZ1bmN0aW9uKHZhbHVlKSB7XG4gIHJldHVybiBqc3BiLk1lc3NhZ2Uuc2V0UHJvdG8zSW50RmllbGQodGhpcywgMjAsIHZhbHVlKTtcbn07XG5cblxuLyoqXG4gKiBvcHRpb25hbCBpbnQzMiBoZWFsdGggPSAyMTtcbiAqIEByZXR1cm4ge251bWJlcn1cbiAqL1xucHJvdG8ubW9kZWxzLnByb3RvLmNvZmQuQ29mZFNoZWV0LnByb3RvdHlwZS5nZXRIZWFsdGggPSBmdW5jdGlvbigpIHtcbiAgcmV0dXJuIC8qKiBAdHlwZSB7bnVtYmVyfSAqLyAoanNwYi5NZXNzYWdlLmdldEZpZWxkV2l0aERlZmF1bHQodGhpcywgMjEsIDApKTtcbn07XG5cblxuLyoqXG4gKiBAcGFyYW0ge251bWJlcn0gdmFsdWVcbiAqIEByZXR1cm4geyFwcm90by5tb2RlbHMucHJvdG8uY29mZC5Db2ZkU2hlZXR9IHJldHVybnMgdGhpc1xuICovXG5wcm90by5tb2RlbHMucHJvdG8uY29mZC5Db2ZkU2hlZXQucHJvdG90eXBlLnNldEhlYWx0aCA9IGZ1bmN0aW9uKHZhbHVlKSB7XG4gIHJldHVybiBqc3BiLk1lc3NhZ2Uuc2V0UHJvdG8zSW50RmllbGQodGhpcywgMjEsIHZhbHVlKTtcbn07XG5cblxuLyoqXG4gKiBvcHRpb25hbCBpbnQzMiB3aWxscG93ZXIgPSAyMjtcbiAqIEByZXR1cm4ge251bWJlcn1cbiAqL1xucHJvdG8ubW9kZWxzLnByb3RvLmNvZmQuQ29mZFNoZWV0LnByb3RvdHlwZS5nZXRXaWxscG93ZXIgPSBmdW5jdGlvbigpIHtcbiAgcmV0dXJuIC8qKiBAdHlwZSB7bnVtYmVyfSAqLyAoanNwYi5NZXNzYWdlLmdldEZpZWxkV2l0aERlZmF1bHQodGhpcywgMjIsIDApKTtcbn07XG5cblxuLyoqXG4gKiBAcGFyYW0ge251bWJlcn0gdmFsdWVcbiAqIEByZXR1cm4geyFwcm90by5tb2RlbHMucHJvdG8uY29mZC5Db2ZkU2hlZXR9IHJldHVybnMgdGhpc1xuICovXG5wcm90by5tb2RlbHMucHJvdG8uY29mZC5Db2ZkU2hlZXQucHJvdG90eXBlLnNldFdpbGxwb3dlciA9IGZ1bmN0aW9uKHZhbHVlKSB7XG4gIHJldHVybiBqc3BiLk1lc3NhZ2Uuc2V0UHJvdG8zSW50RmllbGQodGhpcywgMjIsIHZhbHVlKTtcbn07XG5cblxuLyoqXG4gKiBvcHRpb25hbCBpbnQzMiBleHBlcmllbmNlX3BvaW50cyA9IDIzO1xuICogQHJldHVybiB7bnVtYmVyfVxuICovXG5wcm90by5tb2RlbHMucHJvdG8uY29mZC5Db2ZkU2hlZXQucHJvdG90eXBlLmdldEV4cGVyaWVuY2VQb2ludHMgPSBmdW5jdGlvbigpIHtcbiAgcmV0dXJuIC8qKiBAdHlwZSB7bnVtYmVyfSAqLyAoanNwYi5NZXNzYWdlLmdldEZpZWxkV2l0aERlZmF1bHQodGhpcywgMjMsIDApKTtcbn07XG5cblxuLyoqXG4gKiBAcGFyYW0ge251bWJlcn0gdmFsdWVcbiAqIEByZXR1cm4geyFwcm90by5tb2RlbHMucHJvdG8uY29mZC5Db2ZkU2hlZXR9IHJldHVybnMgdGhpc1xuICovXG5wcm90by5tb2RlbHMucHJvdG8uY29mZC5Db2ZkU2hlZXQucHJvdG90eXBlLnNldEV4cGVyaWVuY2VQb2ludHMgPSBmdW5jdGlvbih2YWx1ZSkge1xuICByZXR1cm4ganNwYi5NZXNzYWdlLnNldFByb3RvM0ludEZpZWxkKHRoaXMsIDIzLCB2YWx1ZSk7XG59O1xuXG5cbi8qKlxuICogb3B0aW9uYWwgaW50MzIgYmVhdHMgPSAyNDtcbiAqIEByZXR1cm4ge251bWJlcn1cbiAqL1xucHJvdG8ubW9kZWxzLnByb3RvLmNvZmQuQ29mZFNoZWV0LnByb3RvdHlwZS5nZXRCZWF0cyA9IGZ1bmN0aW9uKCkge1xuICByZXR1cm4gLyoqIEB0eXBlIHtudW1iZXJ9ICovIChqc3BiLk1lc3NhZ2UuZ2V0RmllbGRXaXRoRGVmYXVsdCh0aGlzLCAyNCwgMCkpO1xufTtcblxuXG4vKipcbiAqIEBwYXJhbSB7bnVtYmVyfSB2YWx1ZVxuICogQHJldHVybiB7IXByb3RvLm1vZGVscy5wcm90by5jb2ZkLkNvZmRTaGVldH0gcmV0dXJucyB0aGlzXG4gKi9cbnByb3RvLm1vZGVscy5wcm90by5jb2ZkLkNvZmRTaGVldC5wcm90b3R5cGUuc2V0QmVhdHMgPSBmdW5jdGlvbih2YWx1ZSkge1xuICByZXR1cm4ganNwYi5NZXNzYWdlLnNldFByb3RvM0ludEZpZWxkKHRoaXMsIDI0LCB2YWx1ZSk7XG59O1xuXG5cbi8qKlxuICogcmVwZWF0ZWQgSXRlbSBpdGVtcyA9IDI1O1xuICogQHJldHVybiB7IUFycmF5PCFwcm90by5tb2RlbHMucHJvdG8uY29mZC5Db2ZkU2hlZXQuSXRlbT59XG4gKi9cbnByb3RvLm1vZGVscy5wcm90by5jb2ZkLkNvZmRTaGVldC5wcm90b3R5cGUuZ2V0SXRlbXNMaXN0ID0gZnVuY3Rpb24oKSB7XG4gIHJldHVybiAvKiogQHR5cGV7IUFycmF5PCFwcm90by5tb2RlbHMucHJvdG8uY29mZC5Db2ZkU2hlZXQuSXRlbT59ICovIChcbiAgICBqc3BiLk1lc3NhZ2UuZ2V0UmVwZWF0ZWRXcmFwcGVyRmllbGQodGhpcywgcHJvdG8ubW9kZWxzLnByb3RvLmNvZmQuQ29mZFNoZWV0Lkl0ZW0sIDI1KSk7XG59O1xuXG5cbi8qKlxuICogQHBhcmFtIHshQXJyYXk8IXByb3RvLm1vZGVscy5wcm90by5jb2ZkLkNvZmRTaGVldC5JdGVtPn0gdmFsdWVcbiAqIEByZXR1cm4geyFwcm90by5tb2RlbHMucHJvdG8uY29mZC5Db2ZkU2hlZXR9IHJldHVybnMgdGhpc1xuKi9cbnByb3RvLm1vZGVscy5wcm90by5jb2ZkLkNvZmRTaGVldC5wcm90b3R5cGUuc2V0SXRlbXNMaXN0ID0gZnVuY3Rpb24odmFsdWUpIHtcbiAgcmV0dXJuIGpzcGIuTWVzc2FnZS5zZXRSZXBlYXRlZFdyYXBwZXJGaWVsZCh0aGlzLCAyNSwgdmFsdWUpO1xufTtcblxuXG4vKipcbiAqIEBwYXJhbSB7IXByb3RvLm1vZGVscy5wcm90by5jb2ZkLkNvZmRTaGVldC5JdGVtPX0gb3B0X3ZhbHVlXG4gKiBAcGFyYW0ge251bWJlcj19IG9wdF9pbmRleFxuICogQHJldHVybiB7IXByb3RvLm1vZGVscy5wcm90by5jb2ZkLkNvZmRTaGVldC5JdGVtfVxuICovXG5wcm90by5tb2RlbHMucHJvdG8uY29mZC5Db2ZkU2hlZXQucHJvdG90eXBlLmFkZEl0ZW1zID0gZnVuY3Rpb24ob3B0X3ZhbHVlLCBvcHRfaW5kZXgpIHtcbiAgcmV0dXJuIGpzcGIuTWVzc2FnZS5hZGRUb1JlcGVhdGVkV3JhcHBlckZpZWxkKHRoaXMsIDI1LCBvcHRfdmFsdWUsIHByb3RvLm1vZGVscy5wcm90by5jb2ZkLkNvZmRTaGVldC5JdGVtLCBvcHRfaW5kZXgpO1xufTtcblxuXG4vKipcbiAqIENsZWFycyB0aGUgbGlzdCBtYWtpbmcgaXQgZW1wdHkgYnV0IG5vbi1udWxsLlxuICogQHJldHVybiB7IXByb3RvLm1vZGVscy5wcm90by5jb2ZkLkNvZmRTaGVldH0gcmV0dXJucyB0aGlzXG4gKi9cbnByb3RvLm1vZGVscy5wcm90by5jb2ZkLkNvZmRTaGVldC5wcm90b3R5cGUuY2xlYXJJdGVtc0xpc3QgPSBmdW5jdGlvbigpIHtcbiAgcmV0dXJuIHRoaXMuc2V0SXRlbXNMaXN0KFtdKTtcbn07XG5cblxuLyoqXG4gKiByZXBlYXRlZCBBdHRhY2sgYXR0YWNrcyA9IDI2O1xuICogQHJldHVybiB7IUFycmF5PCFwcm90by5tb2RlbHMucHJvdG8uY29mZC5Db2ZkU2hlZXQuQXR0YWNrPn1cbiAqL1xucHJvdG8ubW9kZWxzLnByb3RvLmNvZmQuQ29mZFNoZWV0LnByb3RvdHlwZS5nZXRBdHRhY2tzTGlzdCA9IGZ1bmN0aW9uKCkge1xuICByZXR1cm4gLyoqIEB0eXBleyFBcnJheTwhcHJvdG8ubW9kZWxzLnByb3RvLmNvZmQuQ29mZFNoZWV0LkF0dGFjaz59ICovIChcbiAgICBqc3BiLk1lc3NhZ2UuZ2V0UmVwZWF0ZWRXcmFwcGVyRmllbGQodGhpcywgcHJvdG8ubW9kZWxzLnByb3RvLmNvZmQuQ29mZFNoZWV0LkF0dGFjaywgMjYpKTtcbn07XG5cblxuLyoqXG4gKiBAcGFyYW0geyFBcnJheTwhcHJvdG8ubW9kZWxzLnByb3RvLmNvZmQuQ29mZFNoZWV0LkF0dGFjaz59IHZhbHVlXG4gKiBAcmV0dXJuIHshcHJvdG8ubW9kZWxzLnByb3RvLmNvZmQuQ29mZFNoZWV0fSByZXR1cm5zIHRoaXNcbiovXG5wcm90by5tb2RlbHMucHJvdG8uY29mZC5Db2ZkU2hlZXQucHJvdG90eXBlLnNldEF0dGFja3NMaXN0ID0gZnVuY3Rpb24odmFsdWUpIHtcbiAgcmV0dXJuIGpzcGIuTWVzc2FnZS5zZXRSZXBlYXRlZFdyYXBwZXJGaWVsZCh0aGlzLCAyNiwgdmFsdWUpO1xufTtcblxuXG4vKipcbiAqIEBwYXJhbSB7IXByb3RvLm1vZGVscy5wcm90by5jb2ZkLkNvZmRTaGVldC5BdHRhY2s9fSBvcHRfdmFsdWVcbiAqIEBwYXJhbSB7bnVtYmVyPX0gb3B0X2luZGV4XG4gKiBAcmV0dXJuIHshcHJvdG8ubW9kZWxzLnByb3RvLmNvZmQuQ29mZFNoZWV0LkF0dGFja31cbiAqL1xucHJvdG8ubW9kZWxzLnByb3RvLmNvZmQuQ29mZFNoZWV0LnByb3RvdHlwZS5hZGRBdHRhY2tzID0gZnVuY3Rpb24ob3B0X3ZhbHVlLCBvcHRfaW5kZXgpIHtcbiAgcmV0dXJuIGpzcGIuTWVzc2FnZS5hZGRUb1JlcGVhdGVkV3JhcHBlckZpZWxkKHRoaXMsIDI2LCBvcHRfdmFsdWUsIHByb3RvLm1vZGVscy5wcm90by5jb2ZkLkNvZmRTaGVldC5BdHRhY2ssIG9wdF9pbmRleCk7XG59O1xuXG5cbi8qKlxuICogQ2xlYXJzIHRoZSBsaXN0IG1ha2luZyBpdCBlbXB0eSBidXQgbm9uLW51bGwuXG4gKiBAcmV0dXJuIHshcHJvdG8ubW9kZWxzLnByb3RvLmNvZmQuQ29mZFNoZWV0fSByZXR1cm5zIHRoaXNcbiAqL1xucHJvdG8ubW9kZWxzLnByb3RvLmNvZmQuQ29mZFNoZWV0LnByb3RvdHlwZS5jbGVhckF0dGFja3NMaXN0ID0gZnVuY3Rpb24oKSB7XG4gIHJldHVybiB0aGlzLnNldEF0dGFja3NMaXN0KFtdKTtcbn07XG5cblxuLyoqXG4gKiBtYXA8c3RyaW5nLCBzdHJpbmc+IG90aGVyX2RhdGEgPSAyNztcbiAqIEBwYXJhbSB7Ym9vbGVhbj19IG9wdF9ub0xhenlDcmVhdGUgRG8gbm90IGNyZWF0ZSB0aGUgbWFwIGlmXG4gKiBlbXB0eSwgaW5zdGVhZCByZXR1cm5pbmcgYHVuZGVmaW5lZGBcbiAqIEByZXR1cm4geyFqc3BiLk1hcDxzdHJpbmcsc3RyaW5nPn1cbiAqL1xucHJvdG8ubW9kZWxzLnByb3RvLmNvZmQuQ29mZFNoZWV0LnByb3RvdHlwZS5nZXRPdGhlckRhdGFNYXAgPSBmdW5jdGlvbihvcHRfbm9MYXp5Q3JlYXRlKSB7XG4gIHJldHVybiAvKiogQHR5cGUgeyFqc3BiLk1hcDxzdHJpbmcsc3RyaW5nPn0gKi8gKFxuICAgICAganNwYi5NZXNzYWdlLmdldE1hcEZpZWxkKHRoaXMsIDI3LCBvcHRfbm9MYXp5Q3JlYXRlLFxuICAgICAgbnVsbCkpO1xufTtcblxuXG4vKipcbiAqIENsZWFycyB2YWx1ZXMgZnJvbSB0aGUgbWFwLiBUaGUgbWFwIHdpbGwgYmUgbm9uLW51bGwuXG4gKiBAcmV0dXJuIHshcHJvdG8ubW9kZWxzLnByb3RvLmNvZmQuQ29mZFNoZWV0fSByZXR1cm5zIHRoaXNcbiAqL1xucHJvdG8ubW9kZWxzLnByb3RvLmNvZmQuQ29mZFNoZWV0LnByb3RvdHlwZS5jbGVhck90aGVyRGF0YU1hcCA9IGZ1bmN0aW9uKCkge1xuICB0aGlzLmdldE90aGVyRGF0YU1hcCgpLmNsZWFyKCk7XG4gIHJldHVybiB0aGlzO307XG5cblxuLyoqXG4gKiBvcHRpb25hbCBDb3JlRmllbGRzIGNvcmUgPSAyODtcbiAqIEByZXR1cm4gez9wcm90by5tb2RlbHMucHJvdG8uY29mZC5Db3JlRmllbGRzfVxuICovXG5wcm90by5tb2RlbHMucHJvdG8uY29mZC5Db2ZkU2hlZXQucHJvdG90eXBlLmdldENvcmUgPSBmdW5jdGlvbigpIHtcbiAgcmV0dXJuIC8qKiBAdHlwZXs/cHJvdG8ubW9kZWxzLnByb3RvLmNvZmQuQ29yZUZpZWxkc30gKi8gKFxuICAgIGpzcGIuTWVzc2FnZS5nZXRXcmFwcGVyRmllbGQodGhpcywgcHJvdG8ubW9kZWxzLnByb3RvLmNvZmQuQ29yZUZpZWxkcywgMjgpKTtcbn07XG5cblxuLyoqXG4gKiBAcGFyYW0gez9wcm90by5tb2RlbHMucHJvdG8uY29mZC5Db3JlRmllbGRzfHVuZGVmaW5lZH0gdmFsdWVcbiAqIEByZXR1cm4geyFwcm90by5tb2RlbHMucHJvdG8uY29mZC5Db2ZkU2hlZXR9IHJldHVybnMgdGhpc1xuKi9cbnByb3RvLm1vZGVscy5wcm90by5jb2ZkLkNvZmRTaGVldC5wcm90b3R5cGUuc2V0Q29yZSA9IGZ1bmN0aW9uKHZhbHVlKSB7XG4gIHJldHVybiBqc3BiLk1lc3NhZ2Uuc2V0T25lb2ZXcmFwcGVyRmllbGQodGhpcywgMjgsIHByb3RvLm1vZGVscy5wcm90by5jb2ZkLkNvZmRTaGVldC5vbmVvZkdyb3Vwc19bMF0sIHZhbHVlKTtcbn07XG5cblxuLyoqXG4gKiBDbGVhcnMgdGhlIG1lc3NhZ2UgZmllbGQgbWFraW5nIGl0IHVuZGVmaW5lZC5cbiAqIEByZXR1cm4geyFwcm90by5tb2RlbHMucHJvdG8uY29mZC5Db2ZkU2hlZXR9IHJldHVybnMgdGhpc1xuICovXG5wcm90by5tb2RlbHMucHJvdG8uY29mZC5Db2ZkU2hlZXQucHJvdG90eXBlLmNsZWFyQ29yZSA9IGZ1bmN0aW9uKCkge1xuICByZXR1cm4gdGhpcy5zZXRDb3JlKHVuZGVmaW5lZCk7XG59O1xuXG5cbi8qKlxuICogUmV0dXJucyB3aGV0aGVyIHRoaXMgZmllbGQgaXMgc2V0LlxuICogQHJldHVybiB7Ym9vbGVhbn1cbiAqL1xucHJvdG8ubW9kZWxzLnByb3RvLmNvZmQuQ29mZFNoZWV0LnByb3RvdHlwZS5oYXNDb3JlID0gZnVuY3Rpb24oKSB7XG4gIHJldHVybiBqc3BiLk1lc3NhZ2UuZ2V0RmllbGQodGhpcywgMjgpICE9IG51bGw7XG59O1xuXG5cbi8qKlxuICogb3B0aW9uYWwgTWFnZUZpZWxkcyBtYWdlID0gMjk7XG4gKiBAcmV0dXJuIHs/cHJvdG8ubW9kZWxzLnByb3RvLmNvZmQuTWFnZUZpZWxkc31cbiAqL1xucHJvdG8ubW9kZWxzLnByb3RvLmNvZmQuQ29mZFNoZWV0LnByb3RvdHlwZS5nZXRNYWdlID0gZnVuY3Rpb24oKSB7XG4gIHJldHVybiAvKiogQHR5cGV7P3Byb3RvLm1vZGVscy5wcm90by5jb2ZkLk1hZ2VGaWVsZHN9ICovIChcbiAgICBqc3BiLk1lc3NhZ2UuZ2V0V3JhcHBlckZpZWxkKHRoaXMsIHByb3RvLm1vZGVscy5wcm90by5jb2ZkLk1hZ2VGaWVsZHMsIDI5KSk7XG59O1xuXG5cbi8qKlxuICogQHBhcmFtIHs/cHJvdG8ubW9kZWxzLnByb3RvLmNvZmQuTWFnZUZpZWxkc3x1bmRlZmluZWR9IHZhbHVlXG4gKiBAcmV0dXJuIHshcHJvdG8ubW9kZWxzLnByb3RvLmNvZmQuQ29mZFNoZWV0fSByZXR1cm5zIHRoaXNcbiovXG5wcm90by5tb2RlbHMucHJvdG8uY29mZC5Db2ZkU2hlZXQucHJvdG90eXBlLnNldE1hZ2UgPSBmdW5jdGlvbih2YWx1ZSkge1xuICByZXR1cm4ganNwYi5NZXNzYWdlLnNldE9uZW9mV3JhcHBlckZpZWxkKHRoaXMsIDI5LCBwcm90by5tb2RlbHMucHJvdG8uY29mZC5Db2ZkU2hlZXQub25lb2ZHcm91cHNfWzBdLCB2YWx1ZSk7XG59O1xuXG5cbi8qKlxuICogQ2xlYXJzIHRoZSBtZXNzYWdlIGZpZWxkIG1ha2luZyBpdCB1bmRlZmluZWQuXG4gKiBAcmV0dXJuIHshcHJvdG8ubW9kZWxzLnByb3RvLmNvZmQuQ29mZFNoZWV0fSByZXR1cm5zIHRoaXNcbiAqL1xucHJvdG8ubW9kZWxzLnByb3RvLmNvZmQuQ29mZFNoZWV0LnByb3RvdHlwZS5jbGVhck1hZ2UgPSBmdW5jdGlvbigpIHtcbiAgcmV0dXJuIHRoaXMuc2V0TWFnZSh1bmRlZmluZWQpO1xufTtcblxuXG4vKipcbiAqIFJldHVybnMgd2hldGhlciB0aGlzIGZpZWxkIGlzIHNldC5cbiAqIEByZXR1cm4ge2Jvb2xlYW59XG4gKi9cbnByb3RvLm1vZGVscy5wcm90by5jb2ZkLkNvZmRTaGVldC5wcm90b3R5cGUuaGFzTWFnZSA9IGZ1bmN0aW9uKCkge1xuICByZXR1cm4ganNwYi5NZXNzYWdlLmdldEZpZWxkKHRoaXMsIDI5KSAhPSBudWxsO1xufTtcblxuXG4vKipcbiAqIG9wdGlvbmFsIENoYW5nZWxpbmdGaWVsZHMgY2hhbmdlbGluZyA9IDMwO1xuICogQHJldHVybiB7P3Byb3RvLm1vZGVscy5wcm90by5jb2ZkLkNoYW5nZWxpbmdGaWVsZHN9XG4gKi9cbnByb3RvLm1vZGVscy5wcm90by5jb2ZkLkNvZmRTaGVldC5wcm90b3R5cGUuZ2V0Q2hhbmdlbGluZyA9IGZ1bmN0aW9uKCkge1xuICByZXR1cm4gLyoqIEB0eXBlez9wcm90by5tb2RlbHMucHJvdG8uY29mZC5DaGFuZ2VsaW5nRmllbGRzfSAqLyAoXG4gICAganNwYi5NZXNzYWdlLmdldFdyYXBwZXJGaWVsZCh0aGlzLCBwcm90by5tb2RlbHMucHJvdG8uY29mZC5DaGFuZ2VsaW5nRmllbGRzLCAzMCkpO1xufTtcblxuXG4vKipcbiAqIEBwYXJhbSB7P3Byb3RvLm1vZGVscy5wcm90by5jb2ZkLkNoYW5nZWxpbmdGaWVsZHN8dW5kZWZpbmVkfSB2YWx1ZVxuICogQHJldHVybiB7IXByb3RvLm1vZGVscy5wcm90by5jb2ZkLkNvZmRTaGVldH0gcmV0dXJucyB0aGlzXG4qL1xucHJvdG8ubW9kZWxzLnByb3RvLmNvZmQuQ29mZFNoZWV0LnByb3RvdHlwZS5zZXRDaGFuZ2VsaW5nID0gZnVuY3Rpb24odmFsdWUpIHtcbiAgcmV0dXJuIGpzcGIuTWVzc2FnZS5zZXRPbmVvZldyYXBwZXJGaWVsZCh0aGlzLCAzMCwgcHJvdG8ubW9kZWxzLnByb3RvLmNvZmQuQ29mZFNoZWV0Lm9uZW9mR3JvdXBzX1swXSwgdmFsdWUpO1xufTtcblxuXG4vKipcbiAqIENsZWFycyB0aGUgbWVzc2FnZSBmaWVsZCBtYWtpbmcgaXQgdW5kZWZpbmVkLlxuICogQHJldHVybiB7IXByb3RvLm1vZGVscy5wcm90by5jb2ZkLkNvZmRTaGVldH0gcmV0dXJucyB0aGlzXG4gKi9cbnByb3RvLm1vZGVscy5wcm90by5jb2ZkLkNvZmRTaGVldC5wcm90b3R5cGUuY2xlYXJDaGFuZ2VsaW5nID0gZnVuY3Rpb24oKSB7XG4gIHJldHVybiB0aGlzLnNldENoYW5nZWxpbmcodW5kZWZpbmVkKTtcbn07XG5cblxuLyoqXG4gKiBSZXR1cm5zIHdoZXRoZXIgdGhpcyBmaWVsZCBpcyBzZXQuXG4gKiBAcmV0dXJuIHtib29sZWFufVxuICovXG5wcm90by5tb2RlbHMucHJvdG8uY29mZC5Db2ZkU2hlZXQucHJvdG90eXBlLmhhc0NoYW5nZWxpbmcgPSBmdW5jdGlvbigpIHtcbiAgcmV0dXJuIGpzcGIuTWVzc2FnZS5nZXRGaWVsZCh0aGlzLCAzMCkgIT0gbnVsbDtcbn07XG5cblxuZ29vZy5vYmplY3QuZXh0ZW5kKGV4cG9ydHMsIHByb3RvLm1vZGVscy5wcm90by5jb2ZkKTtcbiJdLCJzb3VyY2VSb290IjoiIn0= \ No newline at end of file diff --git a/static/scripts/build/blah.bundle.js b/static/scripts/build/blah.bundle.js deleted file mode 100644 index 0504145..0000000 --- a/static/scripts/build/blah.bundle.js +++ /dev/null @@ -1,23 +0,0 @@ -(self["webpackChunk"] = self["webpackChunk"] || []).push([["blah"],{ - -/***/ "./src/blah.ts": -/*!*********************!*\ - !*** ./src/blah.ts ***! - \*********************/ -/***/ ((__unused_webpack_module, exports, __webpack_require__) => { - -"use strict"; - -Object.defineProperty(exports, "__esModule", ({ value: true })); -var cofd_api_pb_1 = __webpack_require__(/*! ../_proto/cofd_api_pb */ "./_proto/cofd_api_pb.js"); -var x = new cofd_api_pb_1.UpdateSkillValueRequest(); -x.setCharacterId(1); -x.setCharacterUsername("guy"); -console.log("hello", x); - - -/***/ }) - -}, -0,[["./src/blah.ts","runtime","vendors-node_modules_google-protobuf_google-protobuf_js","_proto_cofd_api_pb_js"]]]); -//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9zcmMvYmxhaC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7OztBQUVBLGdHQUFnRTtBQUVoRSxJQUFJLENBQUMsR0FBRyxJQUFJLHFDQUF1QixFQUFFLENBQUM7QUFDdEMsQ0FBQyxDQUFDLGNBQWMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNwQixDQUFDLENBQUMsb0JBQW9CLENBQUMsS0FBSyxDQUFDLENBQUM7QUFDOUIsT0FBTyxDQUFDLEdBQUcsQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFDLENBQUMiLCJmaWxlIjoiYmxhaC5idW5kbGUuanMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBncnBjIH0gZnJvbSBcIkBpbXByb2JhYmxlLWVuZy9ncnBjLXdlYlwiO1xuaW1wb3J0IHsgQ29mZEFwaSB9IGZyb20gXCIuLi9fcHJvdG8vY29mZF9hcGlfcGJfc2VydmljZVwiO1xuaW1wb3J0IHsgVXBkYXRlU2tpbGxWYWx1ZVJlcXVlc3QgfSBmcm9tIFwiLi4vX3Byb3RvL2NvZmRfYXBpX3BiXCI7XG5cbmxldCB4ID0gbmV3IFVwZGF0ZVNraWxsVmFsdWVSZXF1ZXN0KCk7XG54LnNldENoYXJhY3RlcklkKDEpO1xueC5zZXRDaGFyYWN0ZXJVc2VybmFtZShcImd1eVwiKTtcbmNvbnNvbGUubG9nKFwiaGVsbG9cIiwgeCk7XG4iXSwic291cmNlUm9vdCI6IiJ9 \ No newline at end of file diff --git a/static/scripts/build/index.bundle.js b/static/scripts/build/index.bundle.js deleted file mode 100644 index ca8afeb..0000000 --- a/static/scripts/build/index.bundle.js +++ /dev/null @@ -1,21 +0,0 @@ -(self["webpackChunk"] = self["webpackChunk"] || []).push([["index"],{ - -/***/ "./src/index.ts": -/*!**********************!*\ - !*** ./src/index.ts ***! - \**********************/ -/***/ ((__unused_webpack_module, exports, __webpack_require__) => { - -"use strict"; - -Object.defineProperty(exports, "__esModule", ({ value: true })); -var cofd_api_pb_1 = __webpack_require__(/*! ../_proto/cofd_api_pb */ "./_proto/cofd_api_pb.js"); -var x = new cofd_api_pb_1.UpdateSkillValueRequest(); -console.log("hello from index"); - - -/***/ }) - -}, -0,[["./src/index.ts","runtime","vendors-node_modules_google-protobuf_google-protobuf_js","_proto_cofd_api_pb_js"]]]); -//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7QUFFQSxnR0FBZ0U7QUFFaEUsSUFBSSxDQUFDLEdBQUcsSUFBSSxxQ0FBdUIsRUFBRSxDQUFDO0FBS3RDLE9BQU8sQ0FBQyxHQUFHLENBQUMsa0JBQWtCLENBQUMsQ0FBQyIsImZpbGUiOiJpbmRleC5idW5kbGUuanMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBncnBjIH0gZnJvbSBcIkBpbXByb2JhYmxlLWVuZy9ncnBjLXdlYlwiO1xuLy8gaW1wb3J0IHsgQ29mZEFwaSB9IGZyb20gXCIuLi9fcHJvdG8vY29mZF9hcGlfcGJfc2VydmljZVwiO1xuaW1wb3J0IHsgVXBkYXRlU2tpbGxWYWx1ZVJlcXVlc3QgfSBmcm9tIFwiLi4vX3Byb3RvL2NvZmRfYXBpX3BiXCI7XG5cbmxldCB4ID0gbmV3IFVwZGF0ZVNraWxsVmFsdWVSZXF1ZXN0KCk7XG4vLyB4LnNldENoYXJhY3RlcklkKDEpO1xuLy8geC5zZXRDaGFyYWN0ZXJVc2VybmFtZShcImd1eVwiKTtcbi8vIGNvbnNvbGUubG9nKFwiaGVsbG9cIiwgeCk7XG5cbmNvbnNvbGUubG9nKFwiaGVsbG8gZnJvbSBpbmRleFwiKTtcbiJdLCJzb3VyY2VSb290IjoiIn0= \ No newline at end of file diff --git a/static/scripts/build/runtime.bundle.js b/static/scripts/build/runtime.bundle.js deleted file mode 100644 index 49975eb..0000000 --- a/static/scripts/build/runtime.bundle.js +++ /dev/null @@ -1,146 +0,0 @@ -/******/ (() => { // webpackBootstrap -/******/ "use strict"; -/******/ var __webpack_modules__ = ({}); -/************************************************************************/ -/******/ // The module cache -/******/ var __webpack_module_cache__ = {}; -/******/ -/******/ // The require function -/******/ function __webpack_require__(moduleId) { -/******/ // Check if module is in cache -/******/ if(__webpack_module_cache__[moduleId]) { -/******/ return __webpack_module_cache__[moduleId].exports; -/******/ } -/******/ // Create a new module (and put it into the cache) -/******/ var module = __webpack_module_cache__[moduleId] = { -/******/ // no module.id needed -/******/ // no module.loaded needed -/******/ exports: {} -/******/ }; -/******/ -/******/ // Execute the module function -/******/ __webpack_modules__[moduleId].call(module.exports, module, module.exports, __webpack_require__); -/******/ -/******/ // Return the exports of the module -/******/ return module.exports; -/******/ } -/******/ -/******/ // expose the modules object (__webpack_modules__) -/******/ __webpack_require__.m = __webpack_modules__; -/******/ -/******/ // the startup function -/******/ // It's empty as some runtime module handles the default behavior -/******/ __webpack_require__.x = x => {} -/************************************************************************/ -/******/ /* webpack/runtime/global */ -/******/ (() => { -/******/ __webpack_require__.g = (function() { -/******/ if (typeof globalThis === 'object') return globalThis; -/******/ try { -/******/ return this || new Function('return this')(); -/******/ } catch (e) { -/******/ if (typeof window === 'object') return window; -/******/ } -/******/ })(); -/******/ })(); -/******/ -/******/ /* webpack/runtime/hasOwnProperty shorthand */ -/******/ (() => { -/******/ __webpack_require__.o = (obj, prop) => Object.prototype.hasOwnProperty.call(obj, prop) -/******/ })(); -/******/ -/******/ /* webpack/runtime/jsonp chunk loading */ -/******/ (() => { -/******/ // no baseURI -/******/ -/******/ // object to store loaded and loading chunks -/******/ // undefined = chunk not loaded, null = chunk preloaded/prefetched -/******/ // Promise = chunk loading, 0 = chunk loaded -/******/ var installedChunks = { -/******/ "runtime": 0 -/******/ }; -/******/ -/******/ var deferredModules = [ -/******/ -/******/ ]; -/******/ // no chunk on demand loading -/******/ -/******/ // no prefetching -/******/ -/******/ // no preloaded -/******/ -/******/ // no HMR -/******/ -/******/ // no HMR manifest -/******/ -/******/ var checkDeferredModules = x => {}; -/******/ -/******/ // install a JSONP callback for chunk loading -/******/ var webpackJsonpCallback = (parentChunkLoadingFunction, data) => { -/******/ var [chunkIds, moreModules, runtime, executeModules] = data; -/******/ // add "moreModules" to the modules object, -/******/ // then flag all "chunkIds" as loaded and fire callback -/******/ var moduleId, chunkId, i = 0, resolves = []; -/******/ for(;i < chunkIds.length; i++) { -/******/ chunkId = chunkIds[i]; -/******/ if(__webpack_require__.o(installedChunks, chunkId) && installedChunks[chunkId]) { -/******/ resolves.push(installedChunks[chunkId][0]); -/******/ } -/******/ installedChunks[chunkId] = 0; -/******/ } -/******/ for(moduleId in moreModules) { -/******/ if(__webpack_require__.o(moreModules, moduleId)) { -/******/ __webpack_require__.m[moduleId] = moreModules[moduleId]; -/******/ } -/******/ } -/******/ if(runtime) runtime(__webpack_require__); -/******/ if(parentChunkLoadingFunction) parentChunkLoadingFunction(data); -/******/ while(resolves.length) { -/******/ resolves.shift()(); -/******/ } -/******/ -/******/ // add entry modules from loaded chunk to deferred list -/******/ if(executeModules) deferredModules.push.apply(deferredModules, executeModules); -/******/ -/******/ // run deferred modules when all chunks ready -/******/ return checkDeferredModules(); -/******/ } -/******/ -/******/ var chunkLoadingGlobal = self["webpackChunk"] = self["webpackChunk"] || []; -/******/ chunkLoadingGlobal.forEach(webpackJsonpCallback.bind(null, 0)); -/******/ chunkLoadingGlobal.push = webpackJsonpCallback.bind(null, chunkLoadingGlobal.push.bind(chunkLoadingGlobal)); -/******/ -/******/ function checkDeferredModulesImpl() { -/******/ var result; -/******/ for(var i = 0; i < deferredModules.length; i++) { -/******/ var deferredModule = deferredModules[i]; -/******/ var fulfilled = true; -/******/ for(var j = 1; j < deferredModule.length; j++) { -/******/ var depId = deferredModule[j]; -/******/ if(installedChunks[depId] !== 0) fulfilled = false; -/******/ } -/******/ if(fulfilled) { -/******/ deferredModules.splice(i--, 1); -/******/ result = __webpack_require__(__webpack_require__.s = deferredModule[0]); -/******/ } -/******/ } -/******/ if(deferredModules.length === 0) { -/******/ __webpack_require__.x(); -/******/ __webpack_require__.x = x => {}; -/******/ } -/******/ return result; -/******/ } -/******/ var startup = __webpack_require__.x; -/******/ __webpack_require__.x = () => { -/******/ // reset startup function so it can be called again when more startup code is added -/******/ __webpack_require__.x = startup || (x => {}); -/******/ return (checkDeferredModules = checkDeferredModulesImpl)(); -/******/ }; -/******/ })(); -/******/ -/************************************************************************/ -/******/ // run startup -/******/ return __webpack_require__.x(); -/******/ })() -; -//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vd2VicGFjay9ib290c3RyYXAiLCJ3ZWJwYWNrOi8vL3dlYnBhY2svcnVudGltZS9nbG9iYWwiLCJ3ZWJwYWNrOi8vL3dlYnBhY2svcnVudGltZS9oYXNPd25Qcm9wZXJ0eSBzaG9ydGhhbmQiLCJ3ZWJwYWNrOi8vL3dlYnBhY2svcnVudGltZS9qc29ucCBjaHVuayBsb2FkaW5nIiwid2VicGFjazovLy93ZWJwYWNrL3N0YXJ0dXAiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7OztVQUFBO1VBQ0E7O1VBRUE7VUFDQTtVQUNBO1VBQ0E7VUFDQTtVQUNBO1VBQ0E7VUFDQTtVQUNBO1VBQ0E7VUFDQTtVQUNBOztVQUVBO1VBQ0E7O1VBRUE7VUFDQTtVQUNBOztVQUVBO1VBQ0E7O1VBRUE7VUFDQTtVQUNBOzs7O1dDNUJBO1dBQ0E7V0FDQTtXQUNBO1dBQ0EsRUFBRTtXQUNGO1dBQ0E7V0FDQSxDQUFDLEk7Ozs7O1dDUEQsc0Y7Ozs7O1dDQUE7O1dBRUE7V0FDQTtXQUNBO1dBQ0E7V0FDQTtXQUNBOztXQUVBOztXQUVBO1dBQ0E7O1dBRUE7O1dBRUE7O1dBRUE7O1dBRUE7O1dBRUE7O1dBRUE7V0FDQTtXQUNBO1dBQ0E7V0FDQTtXQUNBO1dBQ0EsTUFBTSxvQkFBb0I7V0FDMUI7V0FDQTtXQUNBO1dBQ0E7V0FDQTtXQUNBO1dBQ0E7V0FDQTtXQUNBO1dBQ0E7V0FDQTtXQUNBO1dBQ0E7V0FDQTtXQUNBO1dBQ0E7O1dBRUE7V0FDQTs7V0FFQTtXQUNBO1dBQ0E7O1dBRUE7V0FDQTtXQUNBOztXQUVBO1dBQ0E7V0FDQSxlQUFlLDRCQUE0QjtXQUMzQztXQUNBO1dBQ0EsZ0JBQWdCLDJCQUEyQjtXQUMzQztXQUNBO1dBQ0E7V0FDQTtXQUNBO1dBQ0E7V0FDQTtXQUNBO1dBQ0E7V0FDQTtXQUNBO1dBQ0E7V0FDQTtXQUNBO1dBQ0E7V0FDQTtXQUNBO1dBQ0EsNENBQTRDO1dBQzVDO1dBQ0EsRTs7OztVQ3BGQTtVQUNBIiwiZmlsZSI6InJ1bnRpbWUuYnVuZGxlLmpzIiwic291cmNlc0NvbnRlbnQiOlsiLy8gVGhlIG1vZHVsZSBjYWNoZVxudmFyIF9fd2VicGFja19tb2R1bGVfY2FjaGVfXyA9IHt9O1xuXG4vLyBUaGUgcmVxdWlyZSBmdW5jdGlvblxuZnVuY3Rpb24gX193ZWJwYWNrX3JlcXVpcmVfXyhtb2R1bGVJZCkge1xuXHQvLyBDaGVjayBpZiBtb2R1bGUgaXMgaW4gY2FjaGVcblx0aWYoX193ZWJwYWNrX21vZHVsZV9jYWNoZV9fW21vZHVsZUlkXSkge1xuXHRcdHJldHVybiBfX3dlYnBhY2tfbW9kdWxlX2NhY2hlX19bbW9kdWxlSWRdLmV4cG9ydHM7XG5cdH1cblx0Ly8gQ3JlYXRlIGEgbmV3IG1vZHVsZSAoYW5kIHB1dCBpdCBpbnRvIHRoZSBjYWNoZSlcblx0dmFyIG1vZHVsZSA9IF9fd2VicGFja19tb2R1bGVfY2FjaGVfX1ttb2R1bGVJZF0gPSB7XG5cdFx0Ly8gbm8gbW9kdWxlLmlkIG5lZWRlZFxuXHRcdC8vIG5vIG1vZHVsZS5sb2FkZWQgbmVlZGVkXG5cdFx0ZXhwb3J0czoge31cblx0fTtcblxuXHQvLyBFeGVjdXRlIHRoZSBtb2R1bGUgZnVuY3Rpb25cblx0X193ZWJwYWNrX21vZHVsZXNfX1ttb2R1bGVJZF0uY2FsbChtb2R1bGUuZXhwb3J0cywgbW9kdWxlLCBtb2R1bGUuZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXyk7XG5cblx0Ly8gUmV0dXJuIHRoZSBleHBvcnRzIG9mIHRoZSBtb2R1bGVcblx0cmV0dXJuIG1vZHVsZS5leHBvcnRzO1xufVxuXG4vLyBleHBvc2UgdGhlIG1vZHVsZXMgb2JqZWN0IChfX3dlYnBhY2tfbW9kdWxlc19fKVxuX193ZWJwYWNrX3JlcXVpcmVfXy5tID0gX193ZWJwYWNrX21vZHVsZXNfXztcblxuLy8gdGhlIHN0YXJ0dXAgZnVuY3Rpb25cbi8vIEl0J3MgZW1wdHkgYXMgc29tZSBydW50aW1lIG1vZHVsZSBoYW5kbGVzIHRoZSBkZWZhdWx0IGJlaGF2aW9yXG5fX3dlYnBhY2tfcmVxdWlyZV9fLnggPSB4ID0+IHt9XG4iLCJfX3dlYnBhY2tfcmVxdWlyZV9fLmcgPSAoZnVuY3Rpb24oKSB7XG5cdGlmICh0eXBlb2YgZ2xvYmFsVGhpcyA9PT0gJ29iamVjdCcpIHJldHVybiBnbG9iYWxUaGlzO1xuXHR0cnkge1xuXHRcdHJldHVybiB0aGlzIHx8IG5ldyBGdW5jdGlvbigncmV0dXJuIHRoaXMnKSgpO1xuXHR9IGNhdGNoIChlKSB7XG5cdFx0aWYgKHR5cGVvZiB3aW5kb3cgPT09ICdvYmplY3QnKSByZXR1cm4gd2luZG93O1xuXHR9XG59KSgpOyIsIl9fd2VicGFja19yZXF1aXJlX18ubyA9IChvYmosIHByb3ApID0+IE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChvYmosIHByb3ApIiwiLy8gbm8gYmFzZVVSSVxuXG4vLyBvYmplY3QgdG8gc3RvcmUgbG9hZGVkIGFuZCBsb2FkaW5nIGNodW5rc1xuLy8gdW5kZWZpbmVkID0gY2h1bmsgbm90IGxvYWRlZCwgbnVsbCA9IGNodW5rIHByZWxvYWRlZC9wcmVmZXRjaGVkXG4vLyBQcm9taXNlID0gY2h1bmsgbG9hZGluZywgMCA9IGNodW5rIGxvYWRlZFxudmFyIGluc3RhbGxlZENodW5rcyA9IHtcblx0XCJydW50aW1lXCI6IDBcbn07XG5cbnZhciBkZWZlcnJlZE1vZHVsZXMgPSBbXG5cbl07XG4vLyBubyBjaHVuayBvbiBkZW1hbmQgbG9hZGluZ1xuXG4vLyBubyBwcmVmZXRjaGluZ1xuXG4vLyBubyBwcmVsb2FkZWRcblxuLy8gbm8gSE1SXG5cbi8vIG5vIEhNUiBtYW5pZmVzdFxuXG52YXIgY2hlY2tEZWZlcnJlZE1vZHVsZXMgPSB4ID0+IHt9O1xuXG4vLyBpbnN0YWxsIGEgSlNPTlAgY2FsbGJhY2sgZm9yIGNodW5rIGxvYWRpbmdcbnZhciB3ZWJwYWNrSnNvbnBDYWxsYmFjayA9IChwYXJlbnRDaHVua0xvYWRpbmdGdW5jdGlvbiwgZGF0YSkgPT4ge1xuXHR2YXIgW2NodW5rSWRzLCBtb3JlTW9kdWxlcywgcnVudGltZSwgZXhlY3V0ZU1vZHVsZXNdID0gZGF0YTtcblx0Ly8gYWRkIFwibW9yZU1vZHVsZXNcIiB0byB0aGUgbW9kdWxlcyBvYmplY3QsXG5cdC8vIHRoZW4gZmxhZyBhbGwgXCJjaHVua0lkc1wiIGFzIGxvYWRlZCBhbmQgZmlyZSBjYWxsYmFja1xuXHR2YXIgbW9kdWxlSWQsIGNodW5rSWQsIGkgPSAwLCByZXNvbHZlcyA9IFtdO1xuXHRmb3IoO2kgPCBjaHVua0lkcy5sZW5ndGg7IGkrKykge1xuXHRcdGNodW5rSWQgPSBjaHVua0lkc1tpXTtcblx0XHRpZihfX3dlYnBhY2tfcmVxdWlyZV9fLm8oaW5zdGFsbGVkQ2h1bmtzLCBjaHVua0lkKSAmJiBpbnN0YWxsZWRDaHVua3NbY2h1bmtJZF0pIHtcblx0XHRcdHJlc29sdmVzLnB1c2goaW5zdGFsbGVkQ2h1bmtzW2NodW5rSWRdWzBdKTtcblx0XHR9XG5cdFx0aW5zdGFsbGVkQ2h1bmtzW2NodW5rSWRdID0gMDtcblx0fVxuXHRmb3IobW9kdWxlSWQgaW4gbW9yZU1vZHVsZXMpIHtcblx0XHRpZihfX3dlYnBhY2tfcmVxdWlyZV9fLm8obW9yZU1vZHVsZXMsIG1vZHVsZUlkKSkge1xuXHRcdFx0X193ZWJwYWNrX3JlcXVpcmVfXy5tW21vZHVsZUlkXSA9IG1vcmVNb2R1bGVzW21vZHVsZUlkXTtcblx0XHR9XG5cdH1cblx0aWYocnVudGltZSkgcnVudGltZShfX3dlYnBhY2tfcmVxdWlyZV9fKTtcblx0aWYocGFyZW50Q2h1bmtMb2FkaW5nRnVuY3Rpb24pIHBhcmVudENodW5rTG9hZGluZ0Z1bmN0aW9uKGRhdGEpO1xuXHR3aGlsZShyZXNvbHZlcy5sZW5ndGgpIHtcblx0XHRyZXNvbHZlcy5zaGlmdCgpKCk7XG5cdH1cblxuXHQvLyBhZGQgZW50cnkgbW9kdWxlcyBmcm9tIGxvYWRlZCBjaHVuayB0byBkZWZlcnJlZCBsaXN0XG5cdGlmKGV4ZWN1dGVNb2R1bGVzKSBkZWZlcnJlZE1vZHVsZXMucHVzaC5hcHBseShkZWZlcnJlZE1vZHVsZXMsIGV4ZWN1dGVNb2R1bGVzKTtcblxuXHQvLyBydW4gZGVmZXJyZWQgbW9kdWxlcyB3aGVuIGFsbCBjaHVua3MgcmVhZHlcblx0cmV0dXJuIGNoZWNrRGVmZXJyZWRNb2R1bGVzKCk7XG59XG5cbnZhciBjaHVua0xvYWRpbmdHbG9iYWwgPSBzZWxmW1wid2VicGFja0NodW5rXCJdID0gc2VsZltcIndlYnBhY2tDaHVua1wiXSB8fCBbXTtcbmNodW5rTG9hZGluZ0dsb2JhbC5mb3JFYWNoKHdlYnBhY2tKc29ucENhbGxiYWNrLmJpbmQobnVsbCwgMCkpO1xuY2h1bmtMb2FkaW5nR2xvYmFsLnB1c2ggPSB3ZWJwYWNrSnNvbnBDYWxsYmFjay5iaW5kKG51bGwsIGNodW5rTG9hZGluZ0dsb2JhbC5wdXNoLmJpbmQoY2h1bmtMb2FkaW5nR2xvYmFsKSk7XG5cbmZ1bmN0aW9uIGNoZWNrRGVmZXJyZWRNb2R1bGVzSW1wbCgpIHtcblx0dmFyIHJlc3VsdDtcblx0Zm9yKHZhciBpID0gMDsgaSA8IGRlZmVycmVkTW9kdWxlcy5sZW5ndGg7IGkrKykge1xuXHRcdHZhciBkZWZlcnJlZE1vZHVsZSA9IGRlZmVycmVkTW9kdWxlc1tpXTtcblx0XHR2YXIgZnVsZmlsbGVkID0gdHJ1ZTtcblx0XHRmb3IodmFyIGogPSAxOyBqIDwgZGVmZXJyZWRNb2R1bGUubGVuZ3RoOyBqKyspIHtcblx0XHRcdHZhciBkZXBJZCA9IGRlZmVycmVkTW9kdWxlW2pdO1xuXHRcdFx0aWYoaW5zdGFsbGVkQ2h1bmtzW2RlcElkXSAhPT0gMCkgZnVsZmlsbGVkID0gZmFsc2U7XG5cdFx0fVxuXHRcdGlmKGZ1bGZpbGxlZCkge1xuXHRcdFx0ZGVmZXJyZWRNb2R1bGVzLnNwbGljZShpLS0sIDEpO1xuXHRcdFx0cmVzdWx0ID0gX193ZWJwYWNrX3JlcXVpcmVfXyhfX3dlYnBhY2tfcmVxdWlyZV9fLnMgPSBkZWZlcnJlZE1vZHVsZVswXSk7XG5cdFx0fVxuXHR9XG5cdGlmKGRlZmVycmVkTW9kdWxlcy5sZW5ndGggPT09IDApIHtcblx0XHRfX3dlYnBhY2tfcmVxdWlyZV9fLngoKTtcblx0XHRfX3dlYnBhY2tfcmVxdWlyZV9fLnggPSB4ID0+IHt9O1xuXHR9XG5cdHJldHVybiByZXN1bHQ7XG59XG52YXIgc3RhcnR1cCA9IF9fd2VicGFja19yZXF1aXJlX18ueDtcbl9fd2VicGFja19yZXF1aXJlX18ueCA9ICgpID0+IHtcblx0Ly8gcmVzZXQgc3RhcnR1cCBmdW5jdGlvbiBzbyBpdCBjYW4gYmUgY2FsbGVkIGFnYWluIHdoZW4gbW9yZSBzdGFydHVwIGNvZGUgaXMgYWRkZWRcblx0X193ZWJwYWNrX3JlcXVpcmVfXy54ID0gc3RhcnR1cCB8fCAoeCA9PiB7fSk7XG5cdHJldHVybiAoY2hlY2tEZWZlcnJlZE1vZHVsZXMgPSBjaGVja0RlZmVycmVkTW9kdWxlc0ltcGwpKCk7XG59OyIsIi8vIHJ1biBzdGFydHVwXG5yZXR1cm4gX193ZWJwYWNrX3JlcXVpcmVfXy54KCk7XG4iXSwic291cmNlUm9vdCI6IiJ9 \ No newline at end of file diff --git a/static/scripts/build/vendors-node_modules_google-protobuf_google-protobuf_js.bundle.js b/static/scripts/build/vendors-node_modules_google-protobuf_google-protobuf_js.bundle.js deleted file mode 100644 index 0330d73..0000000 --- a/static/scripts/build/vendors-node_modules_google-protobuf_google-protobuf_js.bundle.js +++ /dev/null @@ -1,537 +0,0 @@ -(self["webpackChunk"] = self["webpackChunk"] || []).push([["vendors-node_modules_google-protobuf_google-protobuf_js"],{ - -/***/ "../../node_modules/google-protobuf/google-protobuf.js": -/*!*************************************************************!*\ - !*** ../../node_modules/google-protobuf/google-protobuf.js ***! - \*************************************************************/ -/***/ (function(__unused_webpack_module, exports, __webpack_require__) { - -var $jscomp=$jscomp||{};$jscomp.scope={};$jscomp.findInternal=function(a,b,c){a instanceof String&&(a=String(a));for(var d=a.length,e=0;e=e}},"es6","es3");$jscomp.polyfill("Array.prototype.find",function(a){return a?a:function(a,c){return $jscomp.findInternal(this,a,c).v}},"es6","es3"); -$jscomp.polyfill("String.prototype.startsWith",function(a){return a?a:function(a,c){var b=$jscomp.checkStringArgs(this,a,"startsWith");a+="";var e=b.length,f=a.length;c=Math.max(0,Math.min(c|0,b.length));for(var g=0;g=f}},"es6","es3"); -$jscomp.polyfill("String.prototype.repeat",function(a){return a?a:function(a){var b=$jscomp.checkStringArgs(this,null,"repeat");if(0>a||1342177279>>=1)b+=b;return d}},"es6","es3");var COMPILED=!0,goog=goog||{};goog.global=this||self;goog.isDef=function(a){return void 0!==a};goog.isString=function(a){return"string"==typeof a};goog.isBoolean=function(a){return"boolean"==typeof a}; -goog.isNumber=function(a){return"number"==typeof a};goog.exportPath_=function(a,b,c){a=a.split(".");c=c||goog.global;a[0]in c||"undefined"==typeof c.execScript||c.execScript("var "+a[0]);for(var d;a.length&&(d=a.shift());)!a.length&&goog.isDef(b)?c[d]=b:c=c[d]&&c[d]!==Object.prototype[d]?c[d]:c[d]={}}; -goog.define=function(a,b){if(!COMPILED){var c=goog.global.CLOSURE_UNCOMPILED_DEFINES,d=goog.global.CLOSURE_DEFINES;c&&void 0===c.nodeType&&Object.prototype.hasOwnProperty.call(c,a)?b=c[a]:d&&void 0===d.nodeType&&Object.prototype.hasOwnProperty.call(d,a)&&(b=d[a])}return b};goog.FEATURESET_YEAR=2012;goog.DEBUG=!0;goog.LOCALE="en";goog.TRUSTED_SITE=!0;goog.STRICT_MODE_COMPATIBLE=!1;goog.DISALLOW_TEST_ONLY_CODE=COMPILED&&!goog.DEBUG;goog.ENABLE_CHROME_APP_SAFE_SCRIPT_LOADING=!1; -goog.provide=function(a){if(goog.isInModuleLoader_())throw Error("goog.provide cannot be used within a module.");if(!COMPILED&&goog.isProvided_(a))throw Error('Namespace "'+a+'" already declared.');goog.constructNamespace_(a)};goog.constructNamespace_=function(a,b){if(!COMPILED){delete goog.implicitNamespaces_[a];for(var c=a;(c=c.substring(0,c.lastIndexOf(".")))&&!goog.getObjectByName(c);)goog.implicitNamespaces_[c]=!0}goog.exportPath_(a,b)}; -goog.getScriptNonce=function(a){if(a&&a!=goog.global)return goog.getScriptNonce_(a.document);null===goog.cspNonce_&&(goog.cspNonce_=goog.getScriptNonce_(goog.global.document));return goog.cspNonce_};goog.NONCE_PATTERN_=/^[\w+/_-]+[=]{0,2}$/;goog.cspNonce_=null;goog.getScriptNonce_=function(a){return(a=a.querySelector&&a.querySelector("script[nonce]"))&&(a=a.nonce||a.getAttribute("nonce"))&&goog.NONCE_PATTERN_.test(a)?a:""};goog.VALID_MODULE_RE_=/^[a-zA-Z_$][a-zA-Z0-9._$]*$/; -goog.module=function(a){if(!goog.isString(a)||!a||-1==a.search(goog.VALID_MODULE_RE_))throw Error("Invalid module identifier");if(!goog.isInGoogModuleLoader_())throw Error("Module "+a+" has been loaded incorrectly. Note, modules cannot be loaded as normal scripts. They require some kind of pre-processing step. You're likely trying to load a module via a script tag or as a part of a concatenated bundle without rewriting the module. For more info see: https://github.com/google/closure-library/wiki/goog.module:-an-ES6-module-like-alternative-to-goog.provide."); -if(goog.moduleLoaderState_.moduleName)throw Error("goog.module may only be called once per module.");goog.moduleLoaderState_.moduleName=a;if(!COMPILED){if(goog.isProvided_(a))throw Error('Namespace "'+a+'" already declared.');delete goog.implicitNamespaces_[a]}};goog.module.get=function(a){return goog.module.getInternal_(a)}; -goog.module.getInternal_=function(a){if(!COMPILED){if(a in goog.loadedModules_)return goog.loadedModules_[a].exports;if(!goog.implicitNamespaces_[a])return a=goog.getObjectByName(a),null!=a?a:null}return null};goog.ModuleType={ES6:"es6",GOOG:"goog"};goog.moduleLoaderState_=null;goog.isInModuleLoader_=function(){return goog.isInGoogModuleLoader_()||goog.isInEs6ModuleLoader_()};goog.isInGoogModuleLoader_=function(){return!!goog.moduleLoaderState_&&goog.moduleLoaderState_.type==goog.ModuleType.GOOG}; -goog.isInEs6ModuleLoader_=function(){if(goog.moduleLoaderState_&&goog.moduleLoaderState_.type==goog.ModuleType.ES6)return!0;var a=goog.global.$jscomp;return a?"function"!=typeof a.getCurrentModulePath?!1:!!a.getCurrentModulePath():!1}; -goog.module.declareLegacyNamespace=function(){if(!COMPILED&&!goog.isInGoogModuleLoader_())throw Error("goog.module.declareLegacyNamespace must be called from within a goog.module");if(!COMPILED&&!goog.moduleLoaderState_.moduleName)throw Error("goog.module must be called prior to goog.module.declareLegacyNamespace.");goog.moduleLoaderState_.declareLegacyNamespace=!0}; -goog.declareModuleId=function(a){if(!COMPILED){if(!goog.isInEs6ModuleLoader_())throw Error("goog.declareModuleId may only be called from within an ES6 module");if(goog.moduleLoaderState_&&goog.moduleLoaderState_.moduleName)throw Error("goog.declareModuleId may only be called once per module.");if(a in goog.loadedModules_)throw Error('Module with namespace "'+a+'" already exists.');}if(goog.moduleLoaderState_)goog.moduleLoaderState_.moduleName=a;else{var b=goog.global.$jscomp;if(!b||"function"!=typeof b.getCurrentModulePath)throw Error('Module with namespace "'+ -a+'" has been loaded incorrectly.');b=b.require(b.getCurrentModulePath());goog.loadedModules_[a]={exports:b,type:goog.ModuleType.ES6,moduleId:a}}};goog.setTestOnly=function(a){if(goog.DISALLOW_TEST_ONLY_CODE)throw a=a||"",Error("Importing test-only code into non-debug environment"+(a?": "+a:"."));};goog.forwardDeclare=function(a){}; -COMPILED||(goog.isProvided_=function(a){return a in goog.loadedModules_||!goog.implicitNamespaces_[a]&&goog.isDefAndNotNull(goog.getObjectByName(a))},goog.implicitNamespaces_={"goog.module":!0});goog.getObjectByName=function(a,b){a=a.split(".");b=b||goog.global;for(var c=0;c>>0);goog.uidCounter_=0;goog.getHashCode=goog.getUid; -goog.removeHashCode=goog.removeUid;goog.cloneObject=function(a){var b=goog.typeOf(a);if("object"==b||"array"==b){if("function"===typeof a.clone)return a.clone();b="array"==b?[]:{};for(var c in a)b[c]=goog.cloneObject(a[c]);return b}return a};goog.bindNative_=function(a,b,c){return a.call.apply(a.bind,arguments)}; -goog.bindJs_=function(a,b,c){if(!a)throw Error();if(2{"use strict";class X{constructor(){if(new.target!=String)throw 1;this.x=42}}let q=Reflect.construct(X,[],String);if(q.x!=42||!(q instanceof String))throw 1;for(const a of[2,3]){if(a==2)continue;function f(z={a}){let a=0;return z.a}{function f(){return 0;}}return f()==3}})()')}); -a("es7",function(){return b("2 ** 2 == 4")});a("es8",function(){return b("async () => 1, true")});a("es9",function(){return b("({...rest} = {}), true")});a("es_next",function(){return!1});return{target:c,map:d}},goog.Transpiler.prototype.needsTranspile=function(a,b){if("always"==goog.TRANSPILE)return!0;if("never"==goog.TRANSPILE)return!1;if(!this.requiresTranspilation_){var c=this.createRequiresTranspilation_();this.requiresTranspilation_=c.map;this.transpilationTarget_=this.transpilationTarget_|| -c.target}if(a in this.requiresTranspilation_)return this.requiresTranspilation_[a]?!0:!goog.inHtmlDocument_()||"es6"!=b||"noModule"in goog.global.document.createElement("script")?!1:!0;throw Error("Unknown language mode: "+a);},goog.Transpiler.prototype.transpile=function(a,b){return goog.transpile_(a,b,this.transpilationTarget_)},goog.transpiler_=new goog.Transpiler,goog.protectScriptTag_=function(a){return a.replace(/<\/(SCRIPT)/ig,"\\x3c/$1")},goog.DebugLoader_=function(){this.dependencies_={}; -this.idToPath_={};this.written_={};this.loadingDeps_=[];this.depsToLoad_=[];this.paused_=!1;this.factory_=new goog.DependencyFactory(goog.transpiler_);this.deferredCallbacks_={};this.deferredQueue_=[]},goog.DebugLoader_.prototype.bootstrap=function(a,b){function c(){d&&(goog.global.setTimeout(d,0),d=null)}var d=b;if(a.length){b=[];for(var e=0;e\x3c/script>";b.write(goog.TRUSTED_TYPES_POLICY_?goog.TRUSTED_TYPES_POLICY_.createHTML(d):d)}else{var e=b.createElement("script");e.defer=goog.Dependency.defer_;e.async=!1;e.type="text/javascript";(d=goog.getScriptNonce())&&e.setAttribute("nonce",d);goog.DebugLoader_.IS_OLD_IE_? -(a.pause(),e.onreadystatechange=function(){if("loaded"==e.readyState||"complete"==e.readyState)a.loaded(),a.resume()}):e.onload=function(){e.onload=null;a.loaded()};e.src=goog.TRUSTED_TYPES_POLICY_?goog.TRUSTED_TYPES_POLICY_.createScriptURL(this.path):this.path;b.head.appendChild(e)}}else goog.logToConsole_("Cannot use default debug loader outside of HTML documents."),"deps.js"==this.relativePath?(goog.logToConsole_("Consider setting CLOSURE_IMPORT_SCRIPT before loading base.js, or setting CLOSURE_NO_DEPS to true."), -a.loaded()):a.pause()},goog.Es6ModuleDependency=function(a,b,c,d,e){goog.Dependency.call(this,a,b,c,d,e)},goog.inherits(goog.Es6ModuleDependency,goog.Dependency),goog.Es6ModuleDependency.prototype.load=function(a){function b(a,b){a=b?'