Subversion Repository Public Repository

Nextrek

Diff Revisions 1085 vs 1086 for /s2s/data/B37D8739K845BA40B2S8C10EB3F28C88E66B.json

Diff revisions: vs.
  @@ -6,10 +6,10 @@
6 6 "name": "Component_Animator",
7 7 "type": "game_script",
8 8 "order": 13,
9 - "content": "# ===================================================================\n#\n# Script: Component_Animator\n#\n# $$COPYRIGHT$$\n#\n# ===================================================================\nclass Component_Animator extends gs.Component\n ###*\n * An animator-component allows to execute different kind of animations \n * on a game object. The animations are using the game object's \n * dstRect & offset-property to execute.\n *\n * @module gs\n * @class Component_Animator\n * @extends gs.Component\n * @memberof gs\n * @constructor\n ###\n constructor: ->\n super\n \n @moveAnimation = new gs.Component_MoveAnimation()\n @pathAnimation = new gs.Component_PathAnimation()\n @zoomAnimation = new gs.Component_ZoomAnimation()\n @blendAnimation = new gs.Component_BlendAnimation()\n @blurAnimation = new gs.Component_BlurAnimation()\n @pixelateAnimation = new gs.Component_PixelateAnimation()\n @wobbleAnimation = new gs.Component_WobbleAnimation()\n @colorAnimation = new gs.Component_ColorAnimation()\n @imageAnimation = new gs.Component_ImageAnimation()\n @frameAnimation = new gs.Component_FrameAnimation()\n @fieldAnimation = new gs.Component_FieldAnimation()\n @shakeAnimation = new gs.Component_ShakeAnimation()\n @tintAnimation = new gs.Component_TintAnimation()\n @rotateAnimation = new gs.Component_RotateAnimation()\n @maskAnimation = new gs.Component_MaskAnimation()\n @l2dAnimation = new gs.Component_Live2DAnimation()\n \n ###*\n * Standard Callback Routine\n * @property callback\n * @type function\n * @private\n ###\n @callback = (object, animation) -> object.removeComponent(animation)\n \n @onBlendFinish = (object, animation, callback) -> \n object.removeComponent(animation)\n callback?(object)\n \n \n ###*\n * Updates the animator.\n *\n * @method update\n ###\n update: ->\n super\n \n if @object.mask?.source?.videoElement?\n @object.mask.source.update()\n \n ###*\n * Moves the game object with a specified speed.\n *\n * @method move\n * @param {number} speedX The speed on x-axis in pixels per frame.\n * @param {number} speedY The speed on y-axis in pixels per frame.\n * @param {number} duration The duration in frames.\n * @param {Object} easingType The easing-type used for the animation.\n ###\n move: (speedX, speedY, duration, easingType) ->\n @object.addComponent(@moveAnimation)\n @moveAnimation.move(speedX, speedY, duration, easingType, @callback)\n \n return @moveAnimation\n \n ###*\n * Moves the game object to a specified position.\n *\n * @method moveTo\n * @param {number} x The x-coordinate of the position.\n * @param {number} y The y-coordinate of the position.\n * @param {number} duration The duration in frames.\n * @param {Object} easingType The easing-type.\n ### \n moveTo: (x, y, duration, easingType) ->\n @object.addComponent(@moveAnimation)\n @moveAnimation.moveTo(x, y, duration, easingType, @callback)\n \n return @moveAnimation\n \n ###*\n * Moves the game object along a path.\n *\n * @method movePath\n * @param {Object} path The path to follow.\n * @param {gs.AnimationLoopType} loopType The loop-Type.\n * @param {number} duration The duration in frames.\n * @param {Object} easingType The easing-type.\n * @param {Object[]} effects Optional array of effects executed during the path-movement like playing a sound.\n ### \n movePath: (path, loopType, duration, easingType, effects) ->\n c = @object.findComponent(\"Component_PathAnimation\")\n \n if c?\n c.loopType = loopType\n else\n @object.addComponent(@pathAnimation)\n @pathAnimation.start(path, loopType, duration, easingType, effects, @callback)\n \n return @pathAnimation\n \n ###*\n * Scrolls the game object with a specified speed.\n *\n * @method scroll\n * @param {number} speedX The speed on x-axis in pixels per frame.\n * @param {number} speedY The speed on y-axis in pixels per frame.\n * @param {number} duration The duration in frames.\n * @param {Object} easingType The easing-type used for the animation.\n ###\n scroll: (speedX, speedY, duration, easingType) ->\n @object.addComponent(@moveAnimation)\n @moveAnimation.scroll(speedX, speedY, duration, easingType, @callback)\n \n return @moveAnimation\n \n ###*\n * Scrolls the game object to a specified position.\n *\n * @method scrollTo\n * @param {number} x The x-coordinate of the position.\n * @param {number} y The y-coordinate of the position.\n * @param {number} duration The duration in frames.\n * @param {Object} easingType The easing-type.\n ### \n scrollTo: (x, y, duration, easingType) ->\n @object.addComponent(@moveAnimation)\n @moveAnimation.scrollTo(x, y, duration, easingType, @callback)\n \n return @moveAnimation\n \n ###*\n * Scrolls the game object along a path.\n *\n * @method scrollPath\n * @param {Object} path The path to follow.\n * @param {gs.AnimationLoopType} loopType The loop-Type.\n * @param {number} duration The duration in frames.\n * @param {Object} easingType The easing-type.\n ### \n scrollPath: (path, loopType, duration, easingType) ->\n @object.addComponent(@pathAnimation)\n @pathAnimation.scroll(path, loopType, duration, easingType, @callback)\n \n return @pathAnimation\n \n \n ###*\n * Zooms a game object to specified size.\n *\n * @method zoomTo\n * @param {number} x The x-axis zoom-factor.\n * @param {number} y The y-axis zoom-factor.\n * @param {number} duration The duration in frames.\n * @param {Object} easingType The easing-type.\n ### \n zoomTo: (x, y, duration, easingType) ->\n @object.addComponent(@zoomAnimation)\n @zoomAnimation.start(x, y, duration, easingType, @callback)\n \n return @zoomAnimation\n \n \n ###*\n * Blends a game object to specified opacity.\n *\n * @method blendTo\n * @param {number} opacity The target opacity.\n * @param {number} duration The duration in frames.\n * @param {Object} easingType The easing-type.\n * @param {function} [callback] An optional callback called if blending is finished. \n ### \n blendTo: (opacity, duration, easingType, callback) ->\n @object.addComponent(@blendAnimation)\n @blendAnimation.start(opacity, duration, easingType, gs.CallBack(\"onBlendFinish\", this, callback)) \n \n return @blendAnimation\n \n ###*\n * Animates a Live2D model parameter of a Live2D game object to a specified value.\n *\n * @method blendTo\n * @param {string} param The name of the parameter to animate.\n * @param {number} value The target value.\n * @param {number} duration The duration in frames.\n * @param {Object} easingType The easing-type.\n * @param {function} [callback] An optional callback called if blending is finished. \n ###\n l2dParameterTo: (param, value, duration, easingType, callback) ->\n @object.addComponent(@l2dAnimation)\n @l2dAnimation.start(param, value, duration, easingType, gs.CallBack(\"onBlendFinish\", this, callback)) \n \n return @l2dAnimation\n \n ###*\n * Blurs a game object to specified blur-power.\n *\n * @method blurTo\n * @param {number} power The target blur-power.\n * @param {number} duration The duration in frames.\n * @param {Object} easingType The easing-type.\n ### \n blurTo: (power, duration, easingType) ->\n @object.addComponent(@blurAnimation)\n @blurAnimation.start(power, duration, easingType) \n \n return @blurAnimation\n \n ###*\n * Pixelates a game object to specified pixel-size/block-size\n *\n * @method pixelateTo\n * @param {number} width - The target block-width\n * @param {number} height - The target block-height\n * @param {number} duration The duration in frames.\n * @param {Object} easingType The easing-type.\n ### \n pixelateTo: (width, height, duration, easingType) ->\n @object.addComponent(@pixelateAnimation)\n @pixelateAnimation.start(width, height, duration, easingType) \n \n return @pixelateAnimation\n \n ###*\n * Wobbles a game object to specified wobble-power and wobble-speed.\n *\n * @method wobbleTo\n * @param {number} power The target wobble-power.\n * @param {number} speed The target wobble-speed.\n * @param {number} duration The duration in frames.\n * @param {Object} easingType The easing-type.\n ### \n wobbleTo: (power, speed, duration, easingType) ->\n @object.addComponent(@wobbleAnimation)\n @wobbleAnimation.start(power, speed, duration, easingType) \n \n return @wobbleAnimation\n \n ###*\n * Colors a game object to a specified target color.\n *\n * @method colorTo\n * @param {Color} color The target color.\n * @param {number} duration The duration in frames.\n * @param {Object} easingType The easing-type.\n ### \n colorTo: (color, duration, easingType) ->\n @object.addComponent(@colorAnimation)\n @colorAnimation.start(color, duration, easingType, @callback)\n \n return @colorAnimation\n \n ###*\n * An image animation runs from left to right using the game object's\n * image-property.\n *\n * @method changeImages\n * @param {Array} images An array of image names.\n * @param {number} duration The duration in frames.\n * @param {Object} easingType The easing-type.\n ### \n changeImages: (images, duration, easingType) ->\n @object.addComponent(@imageAnimation)\n @imageAnimation.start(images, duration, easingType, @callback)\n \n return @imageAnimation\n \n ###*\n * A frame animation which modifies the game object's srcRect property\n * a play an animation.\n *\n * @method changeFrames\n * @param {gs.Rect[]} frames An array of source rectangles (frames).\n * @param {number} duration The duration in frames.\n * @param {Object} easingType The easing-type.\n ### \n #changeFrames: (frames, duration, easingType) ->\n # animation = new gs.Component_FrameAnimation()\n # @object.addComponent(animation)\n # animation.start(frames, duration, easingType, @callback)\n \n ###*\n * A frame animation which modifies the game object's srcRect property\n * a play an animation.\n *\n * @method playAnimation\n * @param {gs.Rect[]} frames An array of source rectangles (frames).\n * @param {number} duration The duration in frames.\n * @param {Object} easingType The easing-type.\n ### \n playAnimation: (animationRecord) ->\n @frameAnimation.refresh(animationRecord)\n @object.addComponent(@frameAnimation)\n @frameAnimation.start(@callback)\n \n return @frameAnimation\n \n ###*\n * Changes a field of the game object to a specified value.\n *\n * @method change\n * @param {number} Value The target value.\n * @param {string} field The name of the field/property.\n * @param {number} duration The duration in frames.\n * @param {Object} easingType The easing-type.\n ### \n change: (value, field, duration, easingType) ->\n @object.addComponent(@fieldAnimation)\n @fieldAnimation.start(value, field, duration, easingType, @callback)\n \n return @fieldAnimation\n \n ###*\n * Shakes the game object horizontally using the game object's offset-property.\n *\n * @method shake\n * @param {gs.Range} range The horizontal shake-range.\n * @param {number} speed The shake speed.\n * @param {number} duration The duration in frames.\n * @param {Object} easingType The easing-type.\n ### \n shake: (range, speed, duration, easing) ->\n @object.addComponent(@shakeAnimation)\n @shakeAnimation.start(range, speed, duration, easing, @callback)\n \n return @shakeAnimation\n \n ###*\n * Tints the game object to a specified tone.\n *\n * @method tintTo\n * @param {Tone} tone The target tone.\n * @param {number} duration The duration in frames.\n * @param {Object} easingType The easing-type.\n ### \n tintTo: (tone, duration, easingType) ->\n @object.addComponent(@tintAnimation)\n @tintAnimation.start(tone, duration, easingType, @callback)\n \n return @tintAnimation\n \n ###*\n * Rotates the game object around its anchor-point.\n *\n * @method rotate\n * @param {gs.RotationDirection} direction The rotation-direction.\n * @param {number} speed The rotation speed in degrees per frame.\n * @param {number} duration The duration in frames.\n * @param {Object} easingType The easing-type.\n ### \n rotate: (direction, speed, duration, easingType) ->\n @object.addComponent(@rotateAnimation)\n @rotateAnimation.rotate(direction, speed, duration, easingType, @callback)\n \n return @rotateAnimation\n \n ###*\n * Rotates the game object around its anchor-point to a specified angle.\n *\n * @method rotateTo\n * @param {number} angle The target angle.\n * @param {number} duration The duration in frames.\n * @param {Object} easingType The easing-type.\n ### \n rotateTo: (angle, duration, easingType) ->\n @object.addComponent(@rotateAnimation)\n @rotateAnimation.rotateTo(angle, duration, easingType, @callback)\n \n return @rotateAnimation\n \n ###*\n * Lets a game object appear on screen using a masking-effect.\n *\n * @method maskIn\n * @param {gs.Mask} mask The mask used for the animation.\n * @param {number} duration The duration in frames.\n * @param {Object} easingType The easing-type.\n * @param {function} [callback] An optional callback-function called when the animation is finished. \n ### \n maskIn: (mask, duration, easing, callback) ->\n @object.addComponent(@maskAnimation)\n @maskAnimation.maskIn(mask, duration, easing, (object, animation) -> object.removeComponent(animation); callback?(object);)\n \n return @maskAnimation\n \n ###*\n * Description follows...\n *\n * @method maskTo\n * @param {gs.Mask} mask The mask used for the animation.\n * @param {number} duration The duration in frames.\n * @param {Object} easingType The easing-type.\n * @param {function} [callback] An optional callback-function called when the animation is finished. \n ### \n maskTo: (mask, duration, easing, callback) ->\n @object.addComponent(@maskAnimation)\n @maskAnimation.maskTo(mask, duration, easing, (object, animation) -> object.removeComponent(animation); callback?(object);)\n \n return @maskAnimation\n \n ###*\n * Lets a game object disappear from screen using a masking-effect.\n *\n * @method maskOut\n * @param {gs.Mask} mask The mask used for the animation.\n * @param {number} duration The duration in frames.\n * @param {Object} easingType The easing-type.\n * @param {function} [callback] An optional callback-function called when the animation is finished. \n ### \n maskOut: (mask, duration, easing, callback) ->\n @object.addComponent(@maskAnimation)\n @maskAnimation.maskOut(mask, duration, easing, (object, animation) -> object.removeComponent(animation); callback?(object);)\n \n return @maskAnimation\n\n ###*\n * Lets a game object appear on screen from left, top, right or bottom using \n * a move-animation\n *\n * @method moveIn\n * @param {number} x The x-coordinate of the target-position.\n * @param {number} y The y-coordinate of the target-position.\n * @param {number} type The movement-direction from where the game object should move-in.\n * @param {number} duration The duration in frames.\n * @param {Object} easingType The easing-type.\n * @param {function} [callback] An optional callback-function called when the animation is finished. \n ### \n moveIn: (x, y, type, duration, easing, callback) ->\n @object.addComponent(@moveAnimation)\n @moveAnimation.moveIn(x, y, type, duration, easing, (object, animation) -> \n object.removeComponent(animation)\n callback?(object))\n \n return @moveAnimation\n \n ###*\n * Lets a game object disappear from screen to the left, top, right or bottom using \n * a move-animation\n *\n * @method moveOut\n * @param {number} type The movement-direction in which the game object should move-out.\n * @param {number} duration The duration in frames.\n * @param {Object} easingType The easing-type.\n * @param {function} [callback] An optional callback-function called when the animation is finished. \n ### \n moveOut: (type, duration, easing, callback) ->\n @object.addComponent(@moveAnimation)\n @moveAnimation.moveOut(type, duration, easing, (object, animation) -> \n object.removeComponent(animation)\n callback?(object)\n )\n \n return @moveAnimation\n \n ###*\n * Lets a game object appear on screen using blending.\n *\n * @method show\n * @param {number} duration The duration in frames.\n * @param {Object} easing The easing-type.\n * @param {function} [callback] An optional callback-function called when the animation is finished. \n ### \n show: (duration, easing, callback) ->\n @object.opacity = 0\n @object.visual?.update()\n \n return @blendTo(255, duration, easing, callback)\n \n ###*\n * Lets a game object disappear from screen using blending.\n *\n * @method hide\n * @param {number} duration The duration in frames.\n * @param {Object} easing The easing-type.\n * @param {function} [callback] An optional callback-function called when the animation is finished. \n ### \n hide: (duration, easing, callback) ->\n return @blendTo(0, duration, easing, callback)\n \n ###*\n * Changes visible-property to true. This method is deprecated.\n * \n * @method open\n * @deprecated\n ### \n open: -> @object.visible = yes\n \n ###*\n * Changes visible-property to false. This method is deprecated.\n * \n * @method close\n * @deprecated\n ### \n close: -> @object.visible = no\n \n ###*\n * Flashes the game object.\n *\n * @method flash\n * @param {Color} color The flash-color.\n * @param {number} duration The duration in frames.\n ###\n flash: (color, duration) ->\n @object.color = color\n color = new Color(color)\n color.alpha = 0\n return @colorTo(color, duration, gs.Easings.EASE_LINEAR[gs.EasingTypes.EASE_IN])\n \n ###*\n * Lets a game object appear on screen using a specified animation.\n *\n * @method appear\n * @param {number} x The x-coordinate of the target-position.\n * @param {number} y The y-coordinate of the target-position.\n * @param {gs.AppearAnimationInfo} animation The animation info-object.\n * @param {Object} easing The easing-type.\n * @param {number} duration The duration in frames.\n * @param {function} [callback] An optional callback-function called when the animation is finished. \n ### \n appear: (x, y, animation, easing, duration, callback) ->\n easing = easing || gs.Easings.EASE_LINEAR[gs.EasingTypes.EASE_IN]\n @object.visible = yes\n\n if animation.type == gs.AnimationTypes.MOVEMENT\n @moveIn(x, y, animation.movement, duration, easing, callback)\n else if animation.type == gs.AnimationTypes.MASKING\n @maskIn(animation.mask, duration, easing, callback)\n else\n @show(duration, easing, callback)\n \n ###*\n * Lets a game object disappear from screen using a specified animation.\n *\n * @method disappear\n * @param {gs.AppearAnimationInfo} animation The animation info-object.\n * @param {Object} easing The easing-type.\n * @param {number} duration The duration in frames.\n * @param {function} [callback] An optional callback-function called when the animation is finished. \n ### \n disappear: (animation, easing, duration, callback) ->\n @object.visible = yes\n if animation.type == gs.AnimationTypes.MOVEMENT\n @moveOut(animation.movement, duration, easing, callback)\n else if animation.type == gs.AnimationTypes.MASKING\n @maskOut(animation.mask, duration, easing, callback)\n else\n @hide(duration, easing, callback)\n \n\ngs.Animator = Component_Animator\ngs.Component_Animator = Component_Animator",
9 + "content": "# ===================================================================\n#\n# Script: Component_Animator\n#\n# $$COPYRIGHT$$\n#\n# ===================================================================\nclass Component_Animator extends gs.Component\n ###*\n * An animator-component allows to execute different kind of animations \n * on a game object. The animations are using the game object's \n * dstRect & offset-property to execute.\n *\n * @module gs\n * @class Component_Animator\n * @extends gs.Component\n * @memberof gs\n * @constructor\n ###\n constructor: ->\n super\n \n @moveAnimation = new gs.Component_MoveAnimation()\n @pathAnimation = new gs.Component_PathAnimation()\n @zoomAnimation = new gs.Component_ZoomAnimation()\n @blendAnimation = new gs.Component_BlendAnimation()\n @blurAnimation = new gs.Component_BlurAnimation()\n @pixelateAnimation = new gs.Component_PixelateAnimation()\n @wobbleAnimation = new gs.Component_WobbleAnimation()\n @colorAnimation = new gs.Component_ColorAnimation()\n @imageAnimation = new gs.Component_ImageAnimation()\n @frameAnimation = new gs.Component_FrameAnimation()\n @fieldAnimation = new gs.Component_FieldAnimation()\n @shakeAnimation = new gs.Component_ShakeAnimation()\n @tintAnimation = new gs.Component_TintAnimation()\n @rotateAnimation = new gs.Component_RotateAnimation()\n @maskAnimation = new gs.Component_MaskAnimation()\n @l2dAnimation = new gs.Component_Live2DAnimation()\n \n ###*\n * Standard Callback Routine\n * @property callback\n * @type function\n * @private\n ###\n @callback = (object, animation) -> object.removeComponent(animation)\n \n @onBlendFinish = (object, animation, callback) -> \n object.removeComponent(animation)\n callback?(object)\n \n \n @accessors \"isAnimating\", get: -> @object\n ###*\n * Updates the animator.\n *\n * @method update\n ###\n update: ->\n super\n \n if @object.mask?.source?.videoElement?\n @object.mask.source.update()\n \n ###*\n * Moves the game object with a specified speed.\n *\n * @method move\n * @param {number} speedX The speed on x-axis in pixels per frame.\n * @param {number} speedY The speed on y-axis in pixels per frame.\n * @param {number} duration The duration in frames.\n * @param {Object} easingType The easing-type used for the animation.\n ###\n move: (speedX, speedY, duration, easingType) ->\n @object.addComponent(@moveAnimation)\n @moveAnimation.move(speedX, speedY, duration, easingType, @callback)\n \n return @moveAnimation\n \n ###*\n * Moves the game object to a specified position.\n *\n * @method moveTo\n * @param {number} x The x-coordinate of the position.\n * @param {number} y The y-coordinate of the position.\n * @param {number} duration The duration in frames.\n * @param {Object} easingType The easing-type.\n ### \n moveTo: (x, y, duration, easingType) ->\n @object.addComponent(@moveAnimation)\n @moveAnimation.moveTo(x, y, duration, easingType, @callback)\n \n return @moveAnimation\n \n ###*\n * Moves the game object along a path.\n *\n * @method movePath\n * @param {Object} path The path to follow.\n * @param {gs.AnimationLoopType} loopType The loop-Type.\n * @param {number} duration The duration in frames.\n * @param {Object} easingType The easing-type.\n * @param {Object[]} effects Optional array of effects executed during the path-movement like playing a sound.\n ### \n movePath: (path, loopType, duration, easingType, effects) ->\n c = @object.findComponent(\"Component_PathAnimation\")\n \n if c?\n c.loopType = loopType\n else\n @object.addComponent(@pathAnimation)\n @pathAnimation.start(path, loopType, duration, easingType, effects, @callback)\n \n return @pathAnimation\n \n ###*\n * Scrolls the game object with a specified speed.\n *\n * @method scroll\n * @param {number} speedX The speed on x-axis in pixels per frame.\n * @param {number} speedY The speed on y-axis in pixels per frame.\n * @param {number} duration The duration in frames.\n * @param {Object} easingType The easing-type used for the animation.\n ###\n scroll: (speedX, speedY, duration, easingType) ->\n @object.addComponent(@moveAnimation)\n @moveAnimation.scroll(speedX, speedY, duration, easingType, @callback)\n \n return @moveAnimation\n \n ###*\n * Scrolls the game object to a specified position.\n *\n * @method scrollTo\n * @param {number} x The x-coordinate of the position.\n * @param {number} y The y-coordinate of the position.\n * @param {number} duration The duration in frames.\n * @param {Object} easingType The easing-type.\n ### \n scrollTo: (x, y, duration, easingType) ->\n @object.addComponent(@moveAnimation)\n @moveAnimation.scrollTo(x, y, duration, easingType, @callback)\n \n return @moveAnimation\n \n ###*\n * Scrolls the game object along a path.\n *\n * @method scrollPath\n * @param {Object} path The path to follow.\n * @param {gs.AnimationLoopType} loopType The loop-Type.\n * @param {number} duration The duration in frames.\n * @param {Object} easingType The easing-type.\n ### \n scrollPath: (path, loopType, duration, easingType) ->\n @object.addComponent(@pathAnimation)\n @pathAnimation.scroll(path, loopType, duration, easingType, @callback)\n \n return @pathAnimation\n \n \n ###*\n * Zooms a game object to specified size.\n *\n * @method zoomTo\n * @param {number} x The x-axis zoom-factor.\n * @param {number} y The y-axis zoom-factor.\n * @param {number} duration The duration in frames.\n * @param {Object} easingType The easing-type.\n ### \n zoomTo: (x, y, duration, easingType) ->\n @object.addComponent(@zoomAnimation)\n @zoomAnimation.start(x, y, duration, easingType, @callback)\n \n return @zoomAnimation\n \n \n ###*\n * Blends a game object to specified opacity.\n *\n * @method blendTo\n * @param {number} opacity The target opacity.\n * @param {number} duration The duration in frames.\n * @param {Object} easingType The easing-type.\n * @param {function} [callback] An optional callback called if blending is finished. \n ### \n blendTo: (opacity, duration, easingType, callback) ->\n @blendAnimation.stop()\n @object.addComponent(@blendAnimation)\n @blendAnimation.start(opacity, duration, easingType, gs.CallBack(\"onBlendFinish\", this, callback)) \n \n return @blendAnimation\n \n ###*\n * Animates a Live2D model parameter of a Live2D game object to a specified value.\n *\n * @method blendTo\n * @param {string} param The name of the parameter to animate.\n * @param {number} value The target value.\n * @param {number} duration The duration in frames.\n * @param {Object} easingType The easing-type.\n * @param {function} [callback] An optional callback called if blending is finished. \n ###\n l2dParameterTo: (param, value, duration, easingType, callback) ->\n @object.addComponent(@l2dAnimation)\n @l2dAnimation.start(param, value, duration, easingType, gs.CallBack(\"onBlendFinish\", this, callback)) \n \n return @l2dAnimation\n \n ###*\n * Blurs a game object to specified blur-power.\n *\n * @method blurTo\n * @param {number} power The target blur-power.\n * @param {number} duration The duration in frames.\n * @param {Object} easingType The easing-type.\n ### \n blurTo: (power, duration, easingType) ->\n @object.addComponent(@blurAnimation)\n @blurAnimation.start(power, duration, easingType) \n \n return @blurAnimation\n \n ###*\n * Pixelates a game object to specified pixel-size/block-size\n *\n * @method pixelateTo\n * @param {number} width - The target block-width\n * @param {number} height - The target block-height\n * @param {number} duration The duration in frames.\n * @param {Object} easingType The easing-type.\n ### \n pixelateTo: (width, height, duration, easingType) ->\n @object.addComponent(@pixelateAnimation)\n @pixelateAnimation.start(width, height, duration, easingType) \n \n return @pixelateAnimation\n \n ###*\n * Wobbles a game object to specified wobble-power and wobble-speed.\n *\n * @method wobbleTo\n * @param {number} power The target wobble-power.\n * @param {number} speed The target wobble-speed.\n * @param {number} duration The duration in frames.\n * @param {Object} easingType The easing-type.\n ### \n wobbleTo: (power, speed, duration, easingType) ->\n @object.addComponent(@wobbleAnimation)\n @wobbleAnimation.start(power, speed, duration, easingType) \n \n return @wobbleAnimation\n \n ###*\n * Colors a game object to a specified target color.\n *\n * @method colorTo\n * @param {Color} color The target color.\n * @param {number} duration The duration in frames.\n * @param {Object} easingType The easing-type.\n ### \n colorTo: (color, duration, easingType) ->\n @object.addComponent(@colorAnimation)\n @colorAnimation.start(color, duration, easingType, @callback)\n \n return @colorAnimation\n \n ###*\n * An image animation runs from left to right using the game object's\n * image-property.\n *\n * @method changeImages\n * @param {Array} images An array of image names.\n * @param {number} duration The duration in frames.\n * @param {Object} easingType The easing-type.\n ### \n changeImages: (images, duration, easingType) ->\n @object.addComponent(@imageAnimation)\n @imageAnimation.start(images, duration, easingType, @callback)\n \n return @imageAnimation\n \n ###*\n * A frame animation which modifies the game object's srcRect property\n * a play an animation.\n *\n * @method changeFrames\n * @param {gs.Rect[]} frames An array of source rectangles (frames).\n * @param {number} duration The duration in frames.\n * @param {Object} easingType The easing-type.\n ### \n #changeFrames: (frames, duration, easingType) ->\n # animation = new gs.Component_FrameAnimation()\n # @object.addComponent(animation)\n # animation.start(frames, duration, easingType, @callback)\n \n ###*\n * A frame animation which modifies the game object's srcRect property\n * a play an animation.\n *\n * @method playAnimation\n * @param {gs.Rect[]} frames An array of source rectangles (frames).\n * @param {number} duration The duration in frames.\n * @param {Object} easingType The easing-type.\n ### \n playAnimation: (animationRecord) ->\n @frameAnimation.refresh(animationRecord)\n @object.addComponent(@frameAnimation)\n @frameAnimation.start(@callback)\n \n return @frameAnimation\n \n ###*\n * Changes a field of the game object to a specified value.\n *\n * @method change\n * @param {number} Value The target value.\n * @param {string} field The name of the field/property.\n * @param {number} duration The duration in frames.\n * @param {Object} easingType The easing-type.\n ### \n change: (value, field, duration, easingType) ->\n @object.addComponent(@fieldAnimation)\n @fieldAnimation.start(value, field, duration, easingType, @callback)\n \n return @fieldAnimation\n \n ###*\n * Shakes the game object horizontally using the game object's offset-property.\n *\n * @method shake\n * @param {gs.Range} range The horizontal shake-range.\n * @param {number} speed The shake speed.\n * @param {number} duration The duration in frames.\n * @param {Object} easingType The easing-type.\n ### \n shake: (range, speed, duration, easing) ->\n @object.addComponent(@shakeAnimation)\n @shakeAnimation.start(range, speed, duration, easing, @callback)\n \n return @shakeAnimation\n \n ###*\n * Tints the game object to a specified tone.\n *\n * @method tintTo\n * @param {Tone} tone The target tone.\n * @param {number} duration The duration in frames.\n * @param {Object} easingType The easing-type.\n ### \n tintTo: (tone, duration, easingType) ->\n @object.addComponent(@tintAnimation)\n @tintAnimation.start(tone, duration, easingType, @callback)\n \n return @tintAnimation\n \n ###*\n * Rotates the game object around its anchor-point.\n *\n * @method rotate\n * @param {gs.RotationDirection} direction The rotation-direction.\n * @param {number} speed The rotation speed in degrees per frame.\n * @param {number} duration The duration in frames.\n * @param {Object} easingType The easing-type.\n ### \n rotate: (direction, speed, duration, easingType) ->\n @object.addComponent(@rotateAnimation)\n @rotateAnimation.rotate(direction, speed, duration, easingType, @callback)\n \n return @rotateAnimation\n \n ###*\n * Rotates the game object around its anchor-point to a specified angle.\n *\n * @method rotateTo\n * @param {number} angle The target angle.\n * @param {number} duration The duration in frames.\n * @param {Object} easingType The easing-type.\n ### \n rotateTo: (angle, duration, easingType) ->\n @object.addComponent(@rotateAnimation)\n @rotateAnimation.rotateTo(angle, duration, easingType, @callback)\n \n return @rotateAnimation\n \n ###*\n * Lets a game object appear on screen using a masking-effect.\n *\n * @method maskIn\n * @param {gs.Mask} mask The mask used for the animation.\n * @param {number} duration The duration in frames.\n * @param {Object} easingType The easing-type.\n * @param {function} [callback] An optional callback-function called when the animation is finished. \n ### \n maskIn: (mask, duration, easing, callback) ->\n @object.addComponent(@maskAnimation)\n @maskAnimation.maskIn(mask, duration, easing, (object, animation) -> object.removeComponent(animation); callback?(object);)\n \n return @maskAnimation\n \n ###*\n * Description follows...\n *\n * @method maskTo\n * @param {gs.Mask} mask The mask used for the animation.\n * @param {number} duration The duration in frames.\n * @param {Object} easingType The easing-type.\n * @param {function} [callback] An optional callback-function called when the animation is finished. \n ### \n maskTo: (mask, duration, easing, callback) ->\n @object.addComponent(@maskAnimation)\n @maskAnimation.maskTo(mask, duration, easing, (object, animation) -> object.removeComponent(animation); callback?(object);)\n \n return @maskAnimation\n \n ###*\n * Lets a game object disappear from screen using a masking-effect.\n *\n * @method maskOut\n * @param {gs.Mask} mask The mask used for the animation.\n * @param {number} duration The duration in frames.\n * @param {Object} easingType The easing-type.\n * @param {function} [callback] An optional callback-function called when the animation is finished. \n ### \n maskOut: (mask, duration, easing, callback) ->\n @object.addComponent(@maskAnimation)\n @maskAnimation.maskOut(mask, duration, easing, (object, animation) -> object.removeComponent(animation); callback?(object);)\n \n return @maskAnimation\n\n ###*\n * Lets a game object appear on screen from left, top, right or bottom using \n * a move-animation\n *\n * @method moveIn\n * @param {number} x The x-coordinate of the target-position.\n * @param {number} y The y-coordinate of the target-position.\n * @param {number} type The movement-direction from where the game object should move-in.\n * @param {number} duration The duration in frames.\n * @param {Object} easingType The easing-type.\n * @param {function} [callback] An optional callback-function called when the animation is finished. \n ### \n moveIn: (x, y, type, duration, easing, callback) ->\n @object.addComponent(@moveAnimation)\n @moveAnimation.moveIn(x, y, type, duration, easing, (object, animation) -> \n object.removeComponent(animation)\n callback?(object))\n \n return @moveAnimation\n \n ###*\n * Lets a game object disappear from screen to the left, top, right or bottom using \n * a move-animation\n *\n * @method moveOut\n * @param {number} type The movement-direction in which the game object should move-out.\n * @param {number} duration The duration in frames.\n * @param {Object} easingType The easing-type.\n * @param {function} [callback] An optional callback-function called when the animation is finished. \n ### \n moveOut: (type, duration, easing, callback) ->\n @object.addComponent(@moveAnimation)\n @moveAnimation.moveOut(type, duration, easing, (object, animation) -> \n object.removeComponent(animation)\n callback?(object)\n )\n \n return @moveAnimation\n \n ###*\n * Lets a game object appear on screen using blending.\n *\n * @method show\n * @param {number} duration The duration in frames.\n * @param {Object} easing The easing-type.\n * @param {function} [callback] An optional callback-function called when the animation is finished. \n ### \n show: (duration, easing, callback) ->\n @object.opacity = 0\n @object.visual?.update()\n \n return @blendTo(255, duration, easing, callback)\n \n ###*\n * Lets a game object disappear from screen using blending.\n *\n * @method hide\n * @param {number} duration The duration in frames.\n * @param {Object} easing The easing-type.\n * @param {function} [callback] An optional callback-function called when the animation is finished. \n ### \n hide: (duration, easing, callback) ->\n return @blendTo(0, duration, easing, callback)\n \n ###*\n * Changes visible-property to true. This method is deprecated.\n * \n * @method open\n * @deprecated\n ### \n open: -> @object.visible = yes\n \n ###*\n * Changes visible-property to false. This method is deprecated.\n * \n * @method close\n * @deprecated\n ### \n close: -> @object.visible = no\n \n ###*\n * Flashes the game object.\n *\n * @method flash\n * @param {Color} color The flash-color.\n * @param {number} duration The duration in frames.\n ###\n flash: (color, duration) ->\n @object.color = color\n color = new Color(color)\n color.alpha = 0\n return @colorTo(color, duration, gs.Easings.EASE_LINEAR[gs.EasingTypes.EASE_IN])\n \n ###*\n * Lets a game object appear on screen using a specified animation.\n *\n * @method appear\n * @param {number} x The x-coordinate of the target-position.\n * @param {number} y The y-coordinate of the target-position.\n * @param {gs.AppearAnimationInfo} animation The animation info-object.\n * @param {Object} easing The easing-type.\n * @param {number} duration The duration in frames.\n * @param {function} [callback] An optional callback-function called when the animation is finished. \n ### \n appear: (x, y, animation, easing, duration, callback) ->\n easing = easing || gs.Easings.EASE_LINEAR[gs.EasingTypes.EASE_IN]\n @object.visible = yes\n\n if animation.type == gs.AnimationTypes.MOVEMENT\n @moveIn(x, y, animation.movement, duration, easing, callback)\n else if animation.type == gs.AnimationTypes.MASKING\n @maskIn(animation.mask, duration, easing, callback)\n else\n @show(duration, easing, callback)\n \n ###*\n * Lets a game object disappear from screen using a specified animation.\n *\n * @method disappear\n * @param {gs.AppearAnimationInfo} animation The animation info-object.\n * @param {Object} easing The easing-type.\n * @param {number} duration The duration in frames.\n * @param {function} [callback] An optional callback-function called when the animation is finished. \n ### \n disappear: (animation, easing, duration, callback) ->\n @object.visible = yes\n if animation.type == gs.AnimationTypes.MOVEMENT\n @moveOut(animation.movement, duration, easing, callback)\n else if animation.type == gs.AnimationTypes.MASKING\n @maskOut(animation.mask, duration, easing, callback)\n else\n @hide(duration, easing, callback)\n \n\ngs.Animator = Component_Animator\ngs.Component_Animator = Component_Animator",
10 10 "parentId": "D3325122KACDEA4515SB731E37A42B9D779F",
11 11 "folder": false,
12 - "compiledContent": "var Component_Animator,\n extend = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; },\n hasProp = {}.hasOwnProperty;\n\nComponent_Animator = (function(superClass) {\n extend(Component_Animator, superClass);\n\n\n /**\n * An animator-component allows to execute different kind of animations \n * on a game object. The animations are using the game object's \n * dstRect & offset-property to execute.\n *\n * @module gs\n * @class Component_Animator\n * @extends gs.Component\n * @memberof gs\n * @constructor\n */\n\n function Component_Animator() {\n Component_Animator.__super__.constructor.apply(this, arguments);\n this.moveAnimation = new gs.Component_MoveAnimation();\n this.pathAnimation = new gs.Component_PathAnimation();\n this.zoomAnimation = new gs.Component_ZoomAnimation();\n this.blendAnimation = new gs.Component_BlendAnimation();\n this.blurAnimation = new gs.Component_BlurAnimation();\n this.pixelateAnimation = new gs.Component_PixelateAnimation();\n this.wobbleAnimation = new gs.Component_WobbleAnimation();\n this.colorAnimation = new gs.Component_ColorAnimation();\n this.imageAnimation = new gs.Component_ImageAnimation();\n this.frameAnimation = new gs.Component_FrameAnimation();\n this.fieldAnimation = new gs.Component_FieldAnimation();\n this.shakeAnimation = new gs.Component_ShakeAnimation();\n this.tintAnimation = new gs.Component_TintAnimation();\n this.rotateAnimation = new gs.Component_RotateAnimation();\n this.maskAnimation = new gs.Component_MaskAnimation();\n this.l2dAnimation = new gs.Component_Live2DAnimation();\n\n /**\n * Standard Callback Routine\n * @property callback\n * @type function\n * @private\n */\n this.callback = function(object, animation) {\n return object.removeComponent(animation);\n };\n this.onBlendFinish = function(object, animation, callback) {\n object.removeComponent(animation);\n return typeof callback === \"function\" ? callback(object) : void 0;\n };\n }\n\n\n /**\n * Updates the animator.\n *\n * @method update\n */\n\n Component_Animator.prototype.update = function() {\n var ref, ref1;\n Component_Animator.__super__.update.apply(this, arguments);\n if (((ref = this.object.mask) != null ? (ref1 = ref.source) != null ? ref1.videoElement : void 0 : void 0) != null) {\n return this.object.mask.source.update();\n }\n };\n\n\n /**\n * Moves the game object with a specified speed.\n *\n * @method move\n * @param {number} speedX The speed on x-axis in pixels per frame.\n * @param {number} speedY The speed on y-axis in pixels per frame.\n * @param {number} duration The duration in frames.\n * @param {Object} easingType The easing-type used for the animation.\n */\n\n Component_Animator.prototype.move = function(speedX, speedY, duration, easingType) {\n this.object.addComponent(this.moveAnimation);\n this.moveAnimation.move(speedX, speedY, duration, easingType, this.callback);\n return this.moveAnimation;\n };\n\n\n /**\n * Moves the game object to a specified position.\n *\n * @method moveTo\n * @param {number} x The x-coordinate of the position.\n * @param {number} y The y-coordinate of the position.\n * @param {number} duration The duration in frames.\n * @param {Object} easingType The easing-type.\n */\n\n Component_Animator.prototype.moveTo = function(x, y, duration, easingType) {\n this.object.addComponent(this.moveAnimation);\n this.moveAnimation.moveTo(x, y, duration, easingType, this.callback);\n return this.moveAnimation;\n };\n\n\n /**\n * Moves the game object along a path.\n *\n * @method movePath\n * @param {Object} path The path to follow.\n * @param {gs.AnimationLoopType} loopType The loop-Type.\n * @param {number} duration The duration in frames.\n * @param {Object} easingType The easing-type.\n * @param {Object[]} effects Optional array of effects executed during the path-movement like playing a sound.\n */\n\n Component_Animator.prototype.movePath = function(path, loopType, duration, easingType, effects) {\n var c;\n c = this.object.findComponent(\"Component_PathAnimation\");\n if (c != null) {\n c.loopType = loopType;\n } else {\n this.object.addComponent(this.pathAnimation);\n this.pathAnimation.start(path, loopType, duration, easingType, effects, this.callback);\n }\n return this.pathAnimation;\n };\n\n\n /**\n * Scrolls the game object with a specified speed.\n *\n * @method scroll\n * @param {number} speedX The speed on x-axis in pixels per frame.\n * @param {number} speedY The speed on y-axis in pixels per frame.\n * @param {number} duration The duration in frames.\n * @param {Object} easingType The easing-type used for the animation.\n */\n\n Component_Animator.prototype.scroll = function(speedX, speedY, duration, easingType) {\n this.object.addComponent(this.moveAnimation);\n this.moveAnimation.scroll(speedX, speedY, duration, easingType, this.callback);\n return this.moveAnimation;\n };\n\n\n /**\n * Scrolls the game object to a specified position.\n *\n * @method scrollTo\n * @param {number} x The x-coordinate of the position.\n * @param {number} y The y-coordinate of the position.\n * @param {number} duration The duration in frames.\n * @param {Object} easingType The easing-type.\n */\n\n Component_Animator.prototype.scrollTo = function(x, y, duration, easingType) {\n this.object.addComponent(this.moveAnimation);\n this.moveAnimation.scrollTo(x, y, duration, easingType, this.callback);\n return this.moveAnimation;\n };\n\n\n /**\n * Scrolls the game object along a path.\n *\n * @method scrollPath\n * @param {Object} path The path to follow.\n * @param {gs.AnimationLoopType} loopType The loop-Type.\n * @param {number} duration The duration in frames.\n * @param {Object} easingType The easing-type.\n */\n\n Component_Animator.prototype.scrollPath = function(path, loopType, duration, easingType) {\n this.object.addComponent(this.pathAnimation);\n this.pathAnimation.scroll(path, loopType, duration, easingType, this.callback);\n return this.pathAnimation;\n };\n\n\n /**\n * Zooms a game object to specified size.\n *\n * @method zoomTo\n * @param {number} x The x-axis zoom-factor.\n * @param {number} y The y-axis zoom-factor.\n * @param {number} duration The duration in frames.\n * @param {Object} easingType The easing-type.\n */\n\n Component_Animator.prototype.zoomTo = function(x, y, duration, easingType) {\n this.object.addComponent(this.zoomAnimation);\n this.zoomAnimation.start(x, y, duration, easingType, this.callback);\n return this.zoomAnimation;\n };\n\n\n /**\n * Blends a game object to specified opacity.\n *\n * @method blendTo\n * @param {number} opacity The target opacity.\n * @param {number} duration The duration in frames.\n * @param {Object} easingType The easing-type.\n * @param {function} [callback] An optional callback called if blending is finished.\n */\n\n Component_Animator.prototype.blendTo = function(opacity, duration, easingType, callback) {\n this.object.addComponent(this.blendAnimation);\n this.blendAnimation.start(opacity, duration, easingType, gs.CallBack(\"onBlendFinish\", this, callback));\n return this.blendAnimation;\n };\n\n\n /**\n * Animates a Live2D model parameter of a Live2D game object to a specified value.\n *\n * @method blendTo\n * @param {string} param The name of the parameter to animate.\n * @param {number} value The target value.\n * @param {number} duration The duration in frames.\n * @param {Object} easingType The easing-type.\n * @param {function} [callback] An optional callback called if blending is finished.\n */\n\n Component_Animator.prototype.l2dParameterTo = function(param, value, duration, easingType, callback) {\n this.object.addComponent(this.l2dAnimation);\n this.l2dAnimation.start(param, value, duration, easingType, gs.CallBack(\"onBlendFinish\", this, callback));\n return this.l2dAnimation;\n };\n\n\n /**\n * Blurs a game object to specified blur-power.\n *\n * @method blurTo\n * @param {number} power The target blur-power.\n * @param {number} duration The duration in frames.\n * @param {Object} easingType The easing-type.\n */\n\n Component_Animator.prototype.blurTo = function(power, duration, easingType) {\n this.object.addComponent(this.blurAnimation);\n this.blurAnimation.start(power, duration, easingType);\n return this.blurAnimation;\n };\n\n\n /**\n * Pixelates a game object to specified pixel-size/block-size\n *\n * @method pixelateTo\n * @param {number} width - The target block-width\n * @param {number} height - The target block-height\n * @param {number} duration The duration in frames.\n * @param {Object} easingType The easing-type.\n */\n\n Component_Animator.prototype.pixelateTo = function(width, height, duration, easingType) {\n this.object.addComponent(this.pixelateAnimation);\n this.pixelateAnimation.start(width, height, duration, easingType);\n return this.pixelateAnimation;\n };\n\n\n /**\n * Wobbles a game object to specified wobble-power and wobble-speed.\n *\n * @method wobbleTo\n * @param {number} power The target wobble-power.\n * @param {number} speed The target wobble-speed.\n * @param {number} duration The duration in frames.\n * @param {Object} easingType The easing-type.\n */\n\n Component_Animator.prototype.wobbleTo = function(power, speed, duration, easingType) {\n this.object.addComponent(this.wobbleAnimation);\n this.wobbleAnimation.start(power, speed, duration, easingType);\n return this.wobbleAnimation;\n };\n\n\n /**\n * Colors a game object to a specified target color.\n *\n * @method colorTo\n * @param {Color} color The target color.\n * @param {number} duration The duration in frames.\n * @param {Object} easingType The easing-type.\n */\n\n Component_Animator.prototype.colorTo = function(color, duration, easingType) {\n this.object.addComponent(this.colorAnimation);\n this.colorAnimation.start(color, duration, easingType, this.callback);\n return this.colorAnimation;\n };\n\n\n /**\n * An image animation runs from left to right using the game object's\n * image-property.\n *\n * @method changeImages\n * @param {Array} images An array of image names.\n * @param {number} duration The duration in frames.\n * @param {Object} easingType The easing-type.\n */\n\n Component_Animator.prototype.changeImages = function(images, duration, easingType) {\n this.object.addComponent(this.imageAnimation);\n this.imageAnimation.start(images, duration, easingType, this.callback);\n return this.imageAnimation;\n };\n\n\n /**\n * A frame animation which modifies the game object's srcRect property\n * a play an animation.\n *\n * @method changeFrames\n * @param {gs.Rect[]} frames An array of source rectangles (frames).\n * @param {number} duration The duration in frames.\n * @param {Object} easingType The easing-type.\n */\n\n\n /**\n * A frame animation which modifies the game object's srcRect property\n * a play an animation.\n *\n * @method playAnimation\n * @param {gs.Rect[]} frames An array of source rectangles (frames).\n * @param {number} duration The duration in frames.\n * @param {Object} easingType The easing-type.\n */\n\n Component_Animator.prototype.playAnimation = function(animationRecord) {\n this.frameAnimation.refresh(animationRecord);\n this.object.addComponent(this.frameAnimation);\n this.frameAnimation.start(this.callback);\n return this.frameAnimation;\n };\n\n\n /**\n * Changes a field of the game object to a specified value.\n *\n * @method change\n * @param {number} Value The target value.\n * @param {string} field The name of the field/property.\n * @param {number} duration The duration in frames.\n * @param {Object} easingType The easing-type.\n */\n\n Component_Animator.prototype.change = function(value, field, duration, easingType) {\n this.object.addComponent(this.fieldAnimation);\n this.fieldAnimation.start(value, field, duration, easingType, this.callback);\n return this.fieldAnimation;\n };\n\n\n /**\n * Shakes the game object horizontally using the game object's offset-property.\n *\n * @method shake\n * @param {gs.Range} range The horizontal shake-range.\n * @param {number} speed The shake speed.\n * @param {number} duration The duration in frames.\n * @param {Object} easingType The easing-type.\n */\n\n Component_Animator.prototype.shake = function(range, speed, duration, easing) {\n this.object.addComponent(this.shakeAnimation);\n this.shakeAnimation.start(range, speed, duration, easing, this.callback);\n return this.shakeAnimation;\n };\n\n\n /**\n * Tints the game object to a specified tone.\n *\n * @method tintTo\n * @param {Tone} tone The target tone.\n * @param {number} duration The duration in frames.\n * @param {Object} easingType The easing-type.\n */\n\n Component_Animator.prototype.tintTo = function(tone, duration, easingType) {\n this.object.addComponent(this.tintAnimation);\n this.tintAnimation.start(tone, duration, easingType, this.callback);\n return this.tintAnimation;\n };\n\n\n /**\n * Rotates the game object around its anchor-point.\n *\n * @method rotate\n * @param {gs.RotationDirection} direction The rotation-direction.\n * @param {number} speed The rotation speed in degrees per frame.\n * @param {number} duration The duration in frames.\n * @param {Object} easingType The easing-type.\n */\n\n Component_Animator.prototype.rotate = function(direction, speed, duration, easingType) {\n this.object.addComponent(this.rotateAnimation);\n this.rotateAnimation.rotate(direction, speed, duration, easingType, this.callback);\n return this.rotateAnimation;\n };\n\n\n /**\n * Rotates the game object around its anchor-point to a specified angle.\n *\n * @method rotateTo\n * @param {number} angle The target angle.\n * @param {number} duration The duration in frames.\n * @param {Object} easingType The easing-type.\n */\n\n Component_Animator.prototype.rotateTo = function(angle, duration, easingType) {\n this.object.addComponent(this.rotateAnimation);\n this.rotateAnimation.rotateTo(angle, duration, easingType, this.callback);\n return this.rotateAnimation;\n };\n\n\n /**\n * Lets a game object appear on screen using a masking-effect.\n *\n * @method maskIn\n * @param {gs.Mask} mask The mask used for the animation.\n * @param {number} duration The duration in frames.\n * @param {Object} easingType The easing-type.\n * @param {function} [callback] An optional callback-function called when the animation is finished.\n */\n\n Component_Animator.prototype.maskIn = function(mask, duration, easing, callback) {\n this.object.addComponent(this.maskAnimation);\n this.maskAnimation.maskIn(mask, duration, easing, function(object, animation) {\n object.removeComponent(animation);\n return typeof callback === \"function\" ? callback(object) : void 0;\n });\n return this.maskAnimation;\n };\n\n\n /**\n * Description follows...\n *\n * @method maskTo\n * @param {gs.Mask} mask The mask used for the animation.\n * @param {number} duration The duration in frames.\n * @param {Object} easingType The easing-type.\n * @param {function} [callback] An optional callback-function called when the animation is finished.\n */\n\n Component_Animator.prototype.maskTo = function(mask, duration, easing, callback) {\n this.object.addComponent(this.maskAnimation);\n this.maskAnimation.maskTo(mask, duration, easing, function(object, animation) {\n object.removeComponent(animation);\n return typeof callback === \"function\" ? callback(object) : void 0;\n });\n return this.maskAnimation;\n };\n\n\n /**\n * Lets a game object disappear from screen using a masking-effect.\n *\n * @method maskOut\n * @param {gs.Mask} mask The mask used for the animation.\n * @param {number} duration The duration in frames.\n * @param {Object} easingType The easing-type.\n * @param {function} [callback] An optional callback-function called when the animation is finished.\n */\n\n Component_Animator.prototype.maskOut = function(mask, duration, easing, callback) {\n this.object.addComponent(this.maskAnimation);\n this.maskAnimation.maskOut(mask, duration, easing, function(object, animation) {\n object.removeComponent(animation);\n return typeof callback === \"function\" ? callback(object) : void 0;\n });\n return this.maskAnimation;\n };\n\n\n /**\n * Lets a game object appear on screen from left, top, right or bottom using \n * a move-animation\n *\n * @method moveIn\n * @param {number} x The x-coordinate of the target-position.\n * @param {number} y The y-coordinate of the target-position.\n * @param {number} type The movement-direction from where the game object should move-in.\n * @param {number} duration The duration in frames.\n * @param {Object} easingType The easing-type.\n * @param {function} [callback] An optional callback-function called when the animation is finished.\n */\n\n Component_Animator.prototype.moveIn = function(x, y, type, duration, easing, callback) {\n this.object.addComponent(this.moveAnimation);\n this.moveAnimation.moveIn(x, y, type, duration, easing, function(object, animation) {\n object.removeComponent(animation);\n return typeof callback === \"function\" ? callback(object) : void 0;\n });\n return this.moveAnimation;\n };\n\n\n /**\n * Lets a game object disappear from screen to the left, top, right or bottom using \n * a move-animation\n *\n * @method moveOut\n * @param {number} type The movement-direction in which the game object should move-out.\n * @param {number} duration The duration in frames.\n * @param {Object} easingType The easing-type.\n * @param {function} [callback] An optional callback-function called when the animation is finished.\n */\n\n Component_Animator.prototype.moveOut = function(type, duration, easing, callback) {\n this.object.addComponent(this.moveAnimation);\n this.moveAnimation.moveOut(type, duration, easing, function(object, animation) {\n object.removeComponent(animation);\n return typeof callback === \"function\" ? callback(object) : void 0;\n });\n return this.moveAnimation;\n };\n\n\n /**\n * Lets a game object appear on screen using blending.\n *\n * @method show\n * @param {number} duration The duration in frames.\n * @param {Object} easing The easing-type.\n * @param {function} [callback] An optional callback-function called when the animation is finished.\n */\n\n Component_Animator.prototype.show = function(duration, easing, callback) {\n var ref;\n this.object.opacity = 0;\n if ((ref = this.object.visual) != null) {\n ref.update();\n }\n return this.blendTo(255, duration, easing, callback);\n };\n\n\n /**\n * Lets a game object disappear from screen using blending.\n *\n * @method hide\n * @param {number} duration The duration in frames.\n * @param {Object} easing The easing-type.\n * @param {function} [callback] An optional callback-function called when the animation is finished.\n */\n\n Component_Animator.prototype.hide = function(duration, easing, callback) {\n return this.blendTo(0, duration, easing, callback);\n };\n\n\n /**\n * Changes visible-property to true. This method is deprecated.\n * \n * @method open\n * @deprecated\n */\n\n Component_Animator.prototype.open = function() {\n return this.object.visible = true;\n };\n\n\n /**\n * Changes visible-property to false. This method is deprecated.\n * \n * @method close\n * @deprecated\n */\n\n Component_Animator.prototype.close = function() {\n return this.object.visible = false;\n };\n\n\n /**\n * Flashes the game object.\n *\n * @method flash\n * @param {Color} color The flash-color.\n * @param {number} duration The duration in frames.\n */\n\n Component_Animator.prototype.flash = function(color, duration) {\n this.object.color = color;\n color = new Color(color);\n color.alpha = 0;\n return this.colorTo(color, duration, gs.Easings.EASE_LINEAR[gs.EasingTypes.EASE_IN]);\n };\n\n\n /**\n * Lets a game object appear on screen using a specified animation.\n *\n * @method appear\n * @param {number} x The x-coordinate of the target-position.\n * @param {number} y The y-coordinate of the target-position.\n * @param {gs.AppearAnimationInfo} animation The animation info-object.\n * @param {Object} easing The easing-type.\n * @param {number} duration The duration in frames.\n * @param {function} [callback] An optional callback-function called when the animation is finished.\n */\n\n Component_Animator.prototype.appear = function(x, y, animation, easing, duration, callback) {\n easing = easing || gs.Easings.EASE_LINEAR[gs.EasingTypes.EASE_IN];\n this.object.visible = true;\n if (animation.type === gs.AnimationTypes.MOVEMENT) {\n return this.moveIn(x, y, animation.movement, duration, easing, callback);\n } else if (animation.type === gs.AnimationTypes.MASKING) {\n return this.maskIn(animation.mask, duration, easing, callback);\n } else {\n return this.show(duration, easing, callback);\n }\n };\n\n\n /**\n * Lets a game object disappear from screen using a specified animation.\n *\n * @method disappear\n * @param {gs.AppearAnimationInfo} animation The animation info-object.\n * @param {Object} easing The easing-type.\n * @param {number} duration The duration in frames.\n * @param {function} [callback] An optional callback-function called when the animation is finished.\n */\n\n Component_Animator.prototype.disappear = function(animation, easing, duration, callback) {\n this.object.visible = true;\n if (animation.type === gs.AnimationTypes.MOVEMENT) {\n return this.moveOut(animation.movement, duration, easing, callback);\n } else if (animation.type === gs.AnimationTypes.MASKING) {\n return this.maskOut(animation.mask, duration, easing, callback);\n } else {\n return this.hide(duration, easing, callback);\n }\n };\n\n return Component_Animator;\n\n})(gs.Component);\n\ngs.Animator = Component_Animator;\n\ngs.Component_Animator = Component_Animator;\n\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQU9BLElBQUEsa0JBQUE7RUFBQTs7O0FBQU07Ozs7QUFDRjs7Ozs7Ozs7Ozs7O0VBV2EsNEJBQUE7SUFDVCxxREFBQSxTQUFBO0lBRUEsSUFBQyxDQUFBLGFBQUQsR0FBcUIsSUFBQSxFQUFFLENBQUMsdUJBQUgsQ0FBQTtJQUNyQixJQUFDLENBQUEsYUFBRCxHQUFxQixJQUFBLEVBQUUsQ0FBQyx1QkFBSCxDQUFBO0lBQ3JCLElBQUMsQ0FBQSxhQUFELEdBQXFCLElBQUEsRUFBRSxDQUFDLHVCQUFILENBQUE7SUFDckIsSUFBQyxDQUFBLGNBQUQsR0FBc0IsSUFBQSxFQUFFLENBQUMsd0JBQUgsQ0FBQTtJQUN0QixJQUFDLENBQUEsYUFBRCxHQUFxQixJQUFBLEVBQUUsQ0FBQyx1QkFBSCxDQUFBO0lBQ3JCLElBQUMsQ0FBQSxpQkFBRCxHQUF5QixJQUFBLEVBQUUsQ0FBQywyQkFBSCxDQUFBO0lBQ3pCLElBQUMsQ0FBQSxlQUFELEdBQXVCLElBQUEsRUFBRSxDQUFDLHlCQUFILENBQUE7SUFDdkIsSUFBQyxDQUFBLGNBQUQsR0FBc0IsSUFBQSxFQUFFLENBQUMsd0JBQUgsQ0FBQTtJQUN0QixJQUFDLENBQUEsY0FBRCxHQUFzQixJQUFBLEVBQUUsQ0FBQyx3QkFBSCxDQUFBO0lBQ3RCLElBQUMsQ0FBQSxjQUFELEdBQXNCLElBQUEsRUFBRSxDQUFDLHdCQUFILENBQUE7SUFDdEIsSUFBQyxDQUFBLGNBQUQsR0FBc0IsSUFBQSxFQUFFLENBQUMsd0JBQUgsQ0FBQTtJQUN0QixJQUFDLENBQUEsY0FBRCxHQUFzQixJQUFBLEVBQUUsQ0FBQyx3QkFBSCxDQUFBO0lBQ3RCLElBQUMsQ0FBQSxhQUFELEdBQXFCLElBQUEsRUFBRSxDQUFDLHVCQUFILENBQUE7SUFDckIsSUFBQyxDQUFBLGVBQUQsR0FBdUIsSUFBQSxFQUFFLENBQUMseUJBQUgsQ0FBQTtJQUN2QixJ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dGVudCI6WyIjID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiNcbiMgICBTY3JpcHQ6IENvbXBvbmVudF9BbmltYXRvclxuI1xuIyAgICQkQ09QWVJJR0hUJCRcbiNcbiMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuY2xhc3MgQ29tcG9uZW50X0FuaW1hdG9yIGV4dGVuZHMgZ3MuQ29tcG9uZW50XG4gICAgIyMjKlxuICAgICogQW4gYW5pbWF0b3ItY29tcG9uZW50IGFsbG93cyB0byBleGVjdXRlIGRpZmZlcmVudCBraW5kIG9mIGFuaW1hdGlvbnMgXG4gICAgKiBvbiBhIGdhbWUgb2JqZWN0LiBUaGUgYW5pbWF0aW9ucyBhcmUgdXNpbmcgdGhlIGdhbWUgb2JqZWN0J3MgXG4gICAgKiBkc3RSZWN0ICYgb2Zmc2V0LXByb3BlcnR5IHRvIGV4ZWN1dGUuXG4gICAgKlxuICAgICogQG1vZHVsZSBnc1xuICAgICogQGNsYXNzIENvbXBvbmVudF9BbmltYXRvclxuICAgICogQGV4dGVuZHMgZ3MuQ29tcG9uZW50XG4gICAgKiBAbWVtYmVyb2YgZ3NcbiAgICAqIEBjb25zdHJ1Y3RvclxuICAgICMjI1xuICAgIGNvbnN0cnVjdG9yOiAtPlxuICAgICAgICBzdXBlclxuICAgICAgICBcbiAgICAgICAgQG1vdmVBbmltYXRpb24gPSBuZXcgZ3MuQ29tcG9uZW50X01vdmVBbmltYXRpb24oKVxuICAgICAgICBAcGF0aEFuaW1hdGlvbiA9IG5ldyBncy5Db21wb25lbnRfUGF0aEFuaW1hdGlvbigpXG4gICAgICAgIEB6b29tQW5pbWF0aW9uID0gbmV3IGdzLkNvbXBvbmVudF9ab29tQW5pbWF0aW9uKClcbiAgICAgICAgQGJsZW5kQW5pbWF0aW9uID0gbmV3IGdzLkNvbXBvbmVudF9CbGVuZEFuaW1hdGlvbigpXG4gICAgICAgIEBibHVyQW5pbWF0aW9uID0gbmV3IGdzLkNvbXBvbmVudF9CbHVyQW5pbWF0aW9uKClcbiAgICAgICAgQHBpeGVsYXRlQW5pbWF0aW9uID0gbmV3IGdzLkNvbXBvbmVudF9QaXhlbGF0ZUFuaW1hdGlvbigpXG4gICAgICAgIEB3b2JibGVBbmltYXRpb24gPSBuZXcgZ3MuQ29tcG9uZW50X1dvYmJsZUFuaW1hdGlvbigpXG4gICAgICAgIEBjb2xvckFuaW1hdGlvbiA9IG5ldyBncy5Db21wb25lbnRfQ29sb3JBbmltYXRpb24oKVxuICAgICAgICBAaW1hZ2VBbmltYXRpb24gPSBuZXcgZ3MuQ29tcG9uZW50X0ltYWdlQW5pbWF0aW9uKClcbiAgICAgICAgQGZyYW1lQW5pbWF0aW9uID0gbmV3IGdzLkNvbXBvbmVudF9GcmFtZUFuaW1hdGlvbigpXG4gICAgICAgIEBmaWVsZEFuaW1hdGlvbiA9IG5ldyBncy5Db21wb25lbnRfRmllbGRBbmltYXRpb24oKVxuICAgICAgICBAc2hha2VBbmltYXRpb24gPSBuZXcgZ3MuQ29tcG9uZW50X1NoYWtlQW5pbWF0aW9uKClcbiAgICAgICAgQHRpbnRBbmltYXRpb24gPSBuZXcgZ3MuQ29tcG9uZW50X1RpbnRBbmltYXRpb24oKVxuICAgICAgICBAcm90YXRlQW5pbWF0aW9uID0gbmV3IGdzLkNvbXBvbmVudF9Sb3RhdGVBbmltYXRpb24oKVxuICAgICAgICBAbWFza0FuaW1hdGlvbiA9IG5ldyBncy5Db21wb25lbnRfTWFza0FuaW1hdGlvbigpXG4gICAgICAgIEBsMmRBbmltYXRpb24gPSBuZXcgZ3MuQ29tcG9uZW50X0xpdmUyREFuaW1hdGlvbigpXG4gICAgICAgIFxuICAgICAgICAjIyMqXG4gICAgICAgICogU3RhbmRhcmQgQ2FsbGJhY2sgUm91dGluZVxuICAgICAgICAqIEBwcm9wZXJ0eSBjYWxsYmFja1xuICAgICAgICAqIEB0eXBlIGZ1bmN0aW9uXG4gICAgICAgICogQHByaXZhdGVcbiAgICAgICAgIyMjXG4gICAgICAgIEBjYWxsYmFjayA9IChvYmplY3QsIGFuaW1hdGlvbikgLT4gb2JqZWN0LnJlbW92ZUNvbXBvbmVudChhbmltYXRpb24pXG4gICAgICAgIFxuICAgICAgICBAb25CbGVuZEZpbmlzaCA9IChvYmplY3QsIGFuaW1hdGlvbiwgY2FsbGJhY2spIC0+IFxuICAgICAgICAgICAgb2JqZWN0LnJlbW92ZUNvbXBvbmVudChhbmltYXRpb24pXG4gICAgICAgICAgICBjYWxsYmFjaz8ob2JqZWN0KVxuICAgICAgICBcbiAgICAgICAgXG4gICAgIyMjKlxuICAgICogVXBkYXRlcyB0aGUgYW5pbWF0b3IuXG4gICAgKlxuICAgICogQG1ldGhvZCB1cGRhdGVcbiAgICAjIyNcbiAgICB1cGRhdGU6IC0+XG4gICAgICAgIHN1cGVyXG4gICAgICAgIFxuICAgICAgICBpZiBAb2JqZWN0Lm1hc2s/LnNvdXJjZT8udmlkZW9FbGVtZW50P1xuICAgICAgICAgICAgQG9iamVjdC5tYXNrLnNvdXJjZS51cGRhdGUoKVxuICAgICAgICAgICAgXG4gICAgIyMjKlxuICAgICogTW92ZXMgdGhlIGdhbWUgb2JqZWN0IHdpdGggYSBzcGVjaWZpZWQgc3BlZWQuXG4gICAgKlxuICAgICogQG1ldGhvZCBtb3ZlXG4gICAgKiBAcGFyYW0ge251bWJlcn0gc3BlZWRYIFRoZSBzcGVlZCBvbiB4LWF4aXMgaW4gcGl4ZWxzIHBlciBmcmFtZS5cbiAgICAqIEBwYXJhbSB7bnVtYmVyfSBzcGVlZFkgVGhlIHNwZWVkIG9uIHktYXhpcyBpbiBwaXhlbHMgcGVyIGZyYW1lLlxuICAgICogQHBhcmFtIHtudW1iZXJ9IGR1cmF0aW9uIFRoZSBkdXJhdGlvbiBpbiBmcmFtZXMuXG4gICAgKiBAcGFyYW0ge09iamVjdH0gZWFzaW5nVHlwZSBUaGUgZWFzaW5nLXR5cGUgdXNlZCBmb3IgdGhlIGFuaW1hdGlvbi5cbiAgICAjIyNcbiAgICBtb3ZlOiAoc3BlZWRYLCBzcGVlZFksIGR1cmF0aW9uLCBlYXNpbmdUeXBlKSAtPlxuICAgICAgICBAb2JqZWN0LmFkZENvbXBvbmVudChAbW92ZUFuaW1hdGlvbilcbiAgICAgICAgQG1vdmVBbmltYXRpb24ubW92ZShzcGVlZFgsIHNwZWVkWSwgZHVyYXRpb24sIGVhc2luZ1R5cGUsIEBjYWxsYmFjaylcbiAgICAgICAgXG4gICAgICAgIHJldHVybiBAbW92ZUFuaW1hdGlvblxuICAgICAgICBcbiAgICAjIyMqXG4gICAgKiBNb3ZlcyB0aGUgZ2FtZSBvYmplY3QgdG8gYSBzcGVjaWZpZWQgcG9zaXRpb24uXG4gICAgKlxuICAgICogQG1ldGhvZCBtb3ZlVG9cbiAgICAqIEBwYXJhbSB7bnVtYmVyfSB4IFRoZSB4LWNvb3JkaW5hdGUgb2YgdGhlIHBvc2l0aW9uLlxuICAgICogQHBhcmFtIHtudW1iZXJ9IHkgVGhlIHktY29vcmRpbmF0ZSBvZiB0aGUgcG9zaXRpb24uXG4gICAgKiBAcGFyYW0ge251bWJlcn0gZHVyYXRpb24gVGhlIGR1cmF0aW9uIGluIGZyYW1lcy5cbiAgICAqIEBwYXJhbSB7T2JqZWN0fSBlYXNpbmdUeXBlIFRoZSBlYXNpbmctdHlwZS5cbiAgICAjIyMgIFxuICAgIG1vdmVUbzogKHgsIHksIGR1cmF0aW9uLCBlYXNpbmdUeXBlKSAtPlxuICAgICAgICBAb2JqZWN0LmFkZENvbXBvbmVudChAbW92ZUFuaW1hdGlvbilcbiAgICAgICAgQG1vdmVBbmltYXRpb24ubW92ZVRvKHgsIHksIGR1cmF0aW9uLCBlYXNpbmdUeXBlLCBAY2FsbGJhY2spXG4gICAgICAgIFxuICAgICAgICByZXR1cm4gQG1vdmVBbmltYXRpb25cbiAgICBcbiAgICAjIyMqXG4gICAgKiBNb3ZlcyB0aGUgZ2FtZSBvYmplY3QgYWxvbmcgYSBwYXRoLlxuICAgICpcbiAgICAqIEBtZXRob2QgbW92ZVBhdGhcbiAgICAqIEBwYXJhbSB7T2JqZWN0fSBwYXRoIFRoZSBwYXRoIHRvIGZvbGxvdy5cbiAgICAqIEBwYXJhbSB7Z3MuQW5pbWF0aW9uTG9vcFR5cGV9IGxvb3BUeXBlIFRoZSBsb29wLVR5cGUuXG4gICAgKiBAcGFyYW0ge251bWJlcn0gZHVyYXRpb24gVGhlIGR1cmF0aW9uIGluIGZyYW1lcy5cbiAgICAqIEBwYXJhbSB7T2JqZWN0fSBlYXNpbmdUeXBlIFRoZSBlYXNpbmctdHlwZS5cbiAgICAqIEBwYXJhbSB7T2JqZWN0W119IGVmZmVjdHMgT3B0aW9uYWwgYXJyYXkgb2YgZWZmZWN0cyBleGVjdXRlZCBkdXJpbmcgdGhlIHBhdGgtbW92ZW1lbnQgbGlrZSBwbGF5aW5nIGEgc291bmQuXG4gICAgIyMjICBcbiAgICBtb3ZlUGF0aDogKHBhdGgsIGxvb3BUeXBlLCBkdXJhdGlvbiwgZWFzaW5nVHlwZSwgZWZmZWN0cykgLT5cbiAgICAgICAgYyA9IEBvYmplY3QuZmluZENvbXBvbmVudChcIkNvbXBvbmVudF9QYXRoQW5pbWF0aW9uXCIpXG4gICAgICAgIFxuICAgICAgICBpZiBjP1xuICAgICAgICAgICAgYy5sb29wVHlwZSA9IGxvb3BUeXBlXG4gICAgICAgIGVsc2VcbiAgICAgICAgICAgIEBvYmplY3QuYWRkQ29tcG9uZW50KEBwYXRoQW5pbWF0aW9uKVxuICAgICAgICAgICAgQHBhdGhBbmltYXRpb24uc3RhcnQocGF0aCwgbG9vcFR5cGUsIGR1cmF0aW9uLCBlYXNpbmdUeXBlLCBlZmZlY3RzLCBAY2FsbGJhY2spXG4gICAgICAgICAgICBcbiAgICAgICAgcmV0dXJuIEBwYXRoQW5pbWF0aW9uXG4gICAgXG4gICAgIyMjKlxuICAgICogU2Nyb2xscyB0aGUgZ2FtZSBvYmplY3Qgd2l0aCBhIHNwZWNpZmllZCBzcGVlZC5cbiAgICAqXG4gICAgKiBAbWV0aG9kIHNjcm9sbFxuICAgICogQHBhcmFtIHtudW1iZXJ9IHNwZWVkWCBUaGUgc3BlZWQgb24geC1heGlzIGluIHBpeGVscyBwZXIgZnJhbWUuXG4gICAgKiBAcGFyYW0ge251bWJlcn0gc3BlZWRZIFRoZSBzcGVlZCBvbiB5LWF4aXMgaW4gcGl4ZWxzIHBlciBmcmFtZS5cbiAgICAqIEBwYXJhbSB7bnVtYmVyfSBkdXJhdGlvbiBUaGUgZHVyYXRpb24gaW4gZnJhbWVzLlxuICAgICogQHBhcmFtIHtPYmplY3R9IGVhc2luZ1R5cGUgVGhlIGVhc2luZy10eXBlIHVzZWQgZm9yIHRoZSBhbmltYXRpb24uXG4gICAgIyMjXG4gICAgc2Nyb2xsOiAoc3BlZWRYLCBzcGVlZFksIGR1cmF0aW9uLCBlYXNpbmdUeXBlKSAtPlxuICAgICAgICBAb2JqZWN0LmFkZENvbXBvbmVudChAbW92ZUFuaW1hdGlvbilcbiAgICAgICAgQG1vdmVBbmltYXRpb24uc2Nyb2xsKHNwZWVkWCwgc3BlZWRZLCBkdXJhdGlvbiwgZWFzaW5nVHlwZSwgQGNhbGxiYWNrKVxuICAgICAgICBcbiAgICAgICAgcmV0dXJuIEBtb3ZlQW5pbWF0aW9uXG4gICAgICAgIFxuICAgICMjIypcbiAgICAqIFNjcm9sbHMgdGhlIGdhbWUgb2JqZWN0IHRvIGEgc3BlY2lmaWVkIHBvc2l0aW9uLlxuICAgICpcbiAgICAqIEBtZXRob2Qgc2Nyb2xsVG9cbiAgICAqIEBwYXJhbSB7bnVtYmVyfSB4IFRoZSB4LWNvb3JkaW5hdGUgb2YgdGhlIHBvc2l0aW9uLlxuICAgICogQHBhcmFtIHtudW1iZXJ9IHkgVGhlIHktY29vcmRpbmF0ZSBvZiB0aGUgcG9zaXRpb24uXG4gICAgKiBAcGFyYW0ge251bWJlcn0gZHVyYXRpb24gVGhlIGR1cmF0aW9uIGluIGZyYW1lcy5cbiAgICAqIEBwYXJhbSB7T2JqZWN0fSBlYXNpbmdUeXBlIFRoZSBlYXNpbmctdHlwZS5cbiAgICAjIyMgIFxuICAgIHNjcm9sbFRvOiAoeCwgeSwgZHVyYXRpb24sIGVhc2luZ1R5cGUpIC0+XG4gICAgICAgIEBvYmplY3QuYWRkQ29tcG9uZW50KEBtb3ZlQW5pbWF0aW9uKVxuICAgICAgICBAbW92ZUFuaW1hdGlvbi5zY3JvbGxUbyh4LCB5LCBkdXJhdGlvbiwgZWFzaW5nVHlwZSwgQGNhbGxiYWNrKVxuICAgICAgICBcbiAgICAgICAgcmV0dXJuIEBtb3ZlQW5pbWF0aW9uXG4gICAgICAgIFxuICAgICMjIypcbiAgICAqIFNjcm9sbHMgdGhlIGdhbWUgb2JqZWN0IGFsb25nIGEgcGF0aC5cbiAgICAqXG4gICAgKiBAbWV0aG9kIHNjcm9sbFBhdGhcbiAgICAqIEBwYXJhbSB7T2JqZWN0fSBwYXRoIFRoZSBwYXRoIHRvIGZvbGxvdy5cbiAgICAqIEBwYXJhbSB7Z3MuQW5pbWF0aW9uTG9vcFR5cGV9IGxvb3BUeXBlIFRoZSBsb29wLVR5cGUuXG4gICAgKiBAcGFyYW0ge251bWJlcn0gZHVyYXRpb24gVGhlIGR1cmF0aW9uIGluIGZyYW1lcy5cbiAgICAqIEBwYXJhbSB7T2JqZWN0fSBlYXNpbmdUeXBlIFRoZSBlYXNpbmctdHlwZS5cbiAgICAjIyMgIFxuICAgIHNjcm9sbFBhdGg6IChwYXRoLCBsb29wVHlwZSwgZHVyYXRpb24sIGVhc2luZ1R5cGUpIC0+XG4gICAgICAgIEBvYmplY3QuYWRkQ29tcG9uZW50KEBwYXRoQW5pbWF0aW9uKVxuICAgICAgICBAcGF0aEFuaW1hdGlvbi5zY3JvbGwocGF0aCwgbG9vcFR5cGUsIGR1cmF0aW9uLCBlYXNpbmdUeXBlLCBAY2FsbGJhY2spXG4gICAgICAgIFxuICAgICAgICByZXR1cm4gQHBhdGhBbmltYXRpb25cbiAgICBcbiAgICAgICAgXG4gICAgIyMjKlxuICAgICogWm9vbXMgYSBnYW1lIG9iamVjdCB0byBzcGVjaWZpZWQgc2l6ZS5cbiAgICAqXG4gICAgKiBAbWV0aG9kIHpvb21Ub1xuICAgICogQHBhcmFtIHtudW1iZXJ9IHggVGhlIHgtYXhpcyB6b29tLWZhY3Rvci5cbiAgICAqIEBwYXJhbSB7bnVtYmVyfSB5IFRoZSB5LWF4aXMgem9vbS1mYWN0b3IuXG4gICAgKiBAcGFyYW0ge251bWJlcn0gZHVyYXRpb24gVGhlIGR1cmF0aW9uIGluIGZyYW1lcy5cbiAgICAqIEBwYXJhbSB7T2JqZWN0fSBlYXNpbmdUeXBlIFRoZSBlYXNpbmctdHlwZS5cbiAgICAjIyMgICAgICBcbiAgICB6b29tVG86ICh4LCB5LCBkdXJhdGlvbiwgZWFzaW5nVHlwZSkgLT5cbiAgICAgICAgQG9iamVjdC5hZGRDb21wb25lbnQoQHpvb21BbmltYXRpb24pXG4gICAgICAgIEB6b29tQW5pbWF0aW9uLnN0YXJ0KHgsIHksIGR1cmF0aW9uLCBlYXNpbmdUeXBlLCBAY2FsbGJhY2spXG4gICAgICAgIFxuICAgICAgICByZXR1cm4gQHpvb21BbmltYXRpb25cbiAgICAgICAgXG4gICAgXG4gICAgIyMjKlxuICAgICogQmxlbmRzIGEgZ2FtZSBvYmplY3QgdG8gc3BlY2lmaWVkIG9wYWNpdHkuXG4gICAgKlxuICAgICogQG1ldGhvZCBibGVuZFRvXG4gICAgKiBAcGFyYW0ge251bWJlcn0gb3BhY2l0eSBUaGUgdGFyZ2V0IG9wYWNpdHkuXG4gICAgKiBAcGFyYW0ge251bWJlcn0gZHVyYXRpb24gVGhlIGR1cmF0aW9uIGluIGZyYW1lcy5cbiAgICAqIEBwYXJhbSB7T2JqZWN0fSBlYXNpbmdUeXBlIFRoZSBlYXNpbmctdHlwZS5cbiAgICAqIEBwYXJhbSB7ZnVuY3Rpb259IFtjYWxsYmFja10gQW4gb3B0aW9uYWwgY2FsbGJhY2sgY2FsbGVkIGlmIGJsZW5kaW5nIGlzIGZpbmlzaGVkLiBcbiAgICAjIyMgICAgXG4gICAgYmxlbmRUbzogKG9wYWNpdHksIGR1cmF0aW9uLCBlYXNpbmdUeXBlLCBjYWxsYmFjaykgLT5cbiAgICAgICAgQG9iamVjdC5hZGRDb21wb25lbnQoQGJsZW5kQW5pbWF0aW9uKVxuICAgICAgICBAYmxlbmRBbmltYXRpb24uc3RhcnQob3BhY2l0eSwgZHVyYXRpb24sIGVhc2luZ1R5cGUsIGdzLkNhbGxCYWNrKFwib25CbGVuZEZpbmlzaFwiLCB0aGlzLCBjYWxsYmFjaykpIFxuICAgICAgICBcbiAgICAgICAgcmV0dXJuIEBibGVuZEFuaW1hdGlvblxuICAgICBcbiAgICAjIyMqXG4gICAgKiBBbmltYXRlcyBhIExpdmUyRCBtb2RlbCBwYXJhbWV0ZXIgb2YgYSBMaXZlMkQgZ2FtZSBvYmplY3QgdG8gYSBzcGVjaWZpZWQgdmFsdWUuXG4gICAgKlxuICAgICogQG1ldGhvZCBibGVuZFRvXG4gICAgKiBAcGFyYW0ge3N0cmluZ30gcGFyYW0gVGhlIG5hbWUgb2YgdGhlIHBhcmFtZXRlciB0byBhbmltYXRlLlxuICAgICogQHBhcmFtIHtudW1iZXJ9IHZhbHVlIFRoZSB0YXJnZXQgdmFsdWUuXG4gICAgKiBAcGFyYW0ge251bWJlcn0gZHVyYXRpb24gVGhlIGR1cmF0aW9uIGluIGZyYW1lcy5cbiAgICAqIEBwYXJhbSB7T2JqZWN0fSBlYXNpbmdUeXBlIFRoZSBlYXNpbmctdHlwZS5cbiAgICAqIEBwYXJhbSB7ZnVuY3Rpb259IFtjYWxsYmFja10gQW4gb3B0aW9uYWwgY2FsbGJhY2sgY2FsbGVkIGlmIGJsZW5kaW5nIGlzIGZpbmlzaGVkLiBcbiAgICAjIyNcbiAgICBsMmRQYXJhbWV0ZXJUbzogKHBhcmFtLCB2YWx1ZSwgZHVyYXRpb24sIGVhc2luZ1R5cGUsIGNhbGxiYWNrKSAtPlxuICAgICAgICBAb2JqZWN0LmFkZENvbXBvbmVudChAbDJkQW5pbWF0aW9uKVxuICAgICAgICBAbDJkQW5pbWF0aW9uLnN0YXJ0KHBhcmFtLCB2YWx1ZSwgZHVyYXRpb24sIGVhc2luZ1R5cGUsIGdzLkNhbGxCYWNrKFwib25CbGVuZEZpbmlzaFwiLCB0aGlzLCBjYWxsYmFjaykpIFxuICAgICAgICBcbiAgICAgICAgcmV0dXJuIEBsMmRBbmltYXRpb25cbiAgICAgICAgXG4gICAgIyMjKlxuICAgICogQmx1cnMgYSBnYW1lIG9iamVjdCB0byBzcGVjaWZpZWQgYmx1ci1wb3dlci5cbiAgICAqXG4gICAgKiBAbWV0aG9kIGJsdXJUb1xuICAgICogQHBhcmFtIHtudW1iZXJ9IHBvd2VyIFRoZSB0YXJnZXQgYmx1ci1wb3dlci5cbiAgICAqIEBwYXJhbSB7bnVtYmVyfSBkdXJhdGlvbiBUaGUgZHVyYXRpb24gaW4gZnJhbWVzLlxuICAgICogQHBhcmFtIHtPYmplY3R9IGVhc2luZ1R5cGUgVGhlIGVhc2luZy10eXBlLlxuICAgICMjIyAgICAgXG4gICAgYmx1clRvOiAocG93ZXIsIGR1cmF0aW9uLCBlYXNpbmdUeXBlKSAtPlxuICAgICAgICBAb2JqZWN0LmFkZENvbXBvbmVudChAYmx1ckFuaW1hdGlvbilcbiAgICAgICAgQGJsdXJBbmltYXRpb24uc3RhcnQocG93ZXIsIGR1cmF0aW9uLCBlYXNpbmdUeXBlKSBcbiAgICAgICAgXG4gICAgICAgIHJldHVybiBAYmx1ckFuaW1hdGlvblxuICAgICAgICBcbiAgICAjIyMqXG4gICAgKiBQaXhlbGF0ZXMgYSBnYW1lIG9iamVjdCB0byBzcGVjaWZpZWQgcGl4ZWwtc2l6ZS9ibG9jay1zaXplXG4gICAgKlxuICAgICogQG1ldGhvZCBwaXhlbGF0ZVRvXG4gICAgKiBAcGFyYW0ge251bWJlcn0gd2lkdGggLSBUaGUgdGFyZ2V0IGJsb2NrLXdpZHRoXG4gICAgKiBAcGFyYW0ge251bWJlcn0gaGVpZ2h0IC0gVGhlIHRhcmdldCBibG9jay1oZWlnaHRcbiAgICAqIEBwYXJhbSB7bnVtYmVyfSBkdXJhdGlvbiBUaGUgZHVyYXRpb24gaW4gZnJhbWVzLlxuICAgICogQHBhcmFtIHtPYmplY3R9IGVhc2luZ1R5cGUgVGhlIGVhc2luZy10eXBlLlxuICAgICMjIyAgICAgXG4gICAgcGl4ZWxhdGVUbzogKHdpZHRoLCBoZWlnaHQsIGR1cmF0aW9uLCBlYXNpbmdUeXBlKSAtPlxuICAgICAgICBAb2JqZWN0LmFkZENvbXBvbmVudChAcGl4ZWxhdGVBbmltYXRpb24pXG4gICAgICAgIEBwaXhlbGF0ZUFuaW1hdGlvbi5zdGFydCh3aWR0aCwgaGVpZ2h0LCBkdXJhdGlvbiwgZWFzaW5nVHlwZSkgXG4gICAgICAgIFxuICAgICAgICByZXR1cm4gQHBpeGVsYXRlQW5pbWF0aW9uXG4gICAgICAgIFxuICAgICMjIypcbiAgICAqIFdvYmJsZXMgYSBnYW1lIG9iamVjdCB0byBzcGVjaWZpZWQgd29iYmxlLXBvd2VyIGFuZCB3b2JibGUtc3BlZWQuXG4gICAgKlxuICAgICogQG1ldGhvZCB3b2JibGVUb1xuICAgICogQHBhcmFtIHtudW1iZXJ9IHBvd2VyIFRoZSB0YXJnZXQgd29iYmxlLXBvd2VyLlxuICAgICogQHBhcmFtIHtudW1iZXJ9IHNwZWVkIFRoZSB0YXJnZXQgd29iYmxlLXNwZWVkLlxuICAgICogQHBhcmFtIHtudW1iZXJ9IGR1cmF0aW9uIFRoZSBkdXJhdGlvbiBpbiBmcmFtZXMuXG4gICAgKiBAcGFyYW0ge09iamVjdH0gZWFzaW5nVHlwZSBUaGUgZWFzaW5nLXR5cGUuXG4gICAgIyMjICAgICBcbiAgICB3b2JibGVUbzogKHBvd2VyLCBzcGVlZCwgZHVyYXRpb24sIGVhc2luZ1R5cGUpIC0+XG4gICAgICAgIEBvYmplY3QuYWRkQ29tcG9uZW50KEB3b2JibGVBbmltYXRpb24pXG4gICAgICAgIEB3b2JibGVBbmltYXRpb24uc3RhcnQocG93ZXIsIHNwZWVkLCBkdXJhdGlvbiwgZWFzaW5nVHlwZSkgXG4gICAgICAgIFxuICAgICAgICByZXR1cm4gQHdvYmJsZUFuaW1hdGlvblxuICAgICAgICBcbiAgICAjIyMqXG4gICAgKiBDb2xvcnMgYSBnYW1lIG9iamVjdCB0byBhIHNwZWNpZmllZCB0YXJnZXQgY29sb3IuXG4gICAgKlxuICAgICogQG1ldGhvZCBjb2xvclRvXG4gICAgKiBAcGFyYW0ge0NvbG9yfSBjb2xvciBUaGUgdGFyZ2V0IGNvbG9yLlxuICAgICogQHBhcmFtIHtudW1iZXJ9IGR1cmF0aW9uIFRoZSBkdXJhdGlvbiBpbiBmcmFtZXMuXG4gICAgKiBAcGFyYW0ge09iamVjdH0gZWFzaW5nVHlwZSBUaGUgZWFzaW5nLXR5cGUuXG4gICAgIyMjICBcbiAgICBjb2xvclRvOiAoY29sb3IsIGR1cmF0aW9uLCBlYXNpbmdUeXBlKSAtPlxuICAgICAgICBAb2JqZWN0LmFkZENvbXBvbmVudChAY29sb3JBbmltYXRpb24pXG4gICAgICAgIEBjb2xvckFuaW1hdGlvbi5zdGFydChjb2xvciwgZHVyYXRpb24sIGVhc2luZ1R5cGUsIEBjYWxsYmFjaylcbiAgICAgICAgXG4gICAgICAgIHJldHVybiBAY29sb3JBbmltYXRpb25cbiAgICAgICAgXG4gICAgIyMjKlxuICAgICogQW4gaW1hZ2UgYW5pbWF0aW9uIHJ1bnMgZnJvbSBsZWZ0IHRvIHJpZ2h0IHVzaW5nIHRoZSBnYW1lIG9iamVjdCdzXG4gICAgKiBpbWFnZS1wcm9wZXJ0eS5cbiAgICAqXG4gICAgKiBAbWV0aG9kIGNoYW5nZUltYWdlc1xuICAgICogQHBhcmFtIHtBcnJheX0gaW1hZ2VzIEFuIGFycmF5IG9mIGltYWdlIG5hbWVzLlxuICAgICogQHBhcmFtIHtudW1iZXJ9IGR1cmF0aW9uIFRoZSBkdXJhdGlvbiBpbiBmcmFtZXMuXG4gICAgKiBAcGFyYW0ge09iamVjdH0gZWFzaW5nVHlwZSBUaGUgZWFzaW5nLXR5cGUuXG4gICAgIyMjICAgICAgXG4gICAgY2hhbmdlSW1hZ2VzOiAoaW1hZ2VzLCBkdXJhdGlvbiwgZWFzaW5nVHlwZSkgLT5cbiAgICAgICAgQG9iamVjdC5hZGRDb21wb25lbnQoQGltYWdlQW5pbWF0aW9uKVxuICAgICAgICBAaW1hZ2VBbmltYXRpb24uc3RhcnQoaW1hZ2VzLCBkdXJhdGlvbiwgZWFzaW5nVHlwZSwgQGNhbGxiYWNrKVxuICAgICAgICBcbiAgICAgICAgcmV0dXJuIEBpbWFnZUFuaW1hdGlvblxuICAgICAgICBcbiAgICAjIyMqXG4gICAgKiBBIGZyYW1lIGFuaW1hdGlvbiB3aGljaCBtb2RpZmllcyB0aGUgZ2FtZSBvYmplY3QncyBzcmNSZWN0IHByb3BlcnR5XG4gICAgKiBhIHBsYXkgYW4gYW5pbWF0aW9uLlxuICAgICpcbiAgICAqIEBtZXRob2QgY2hhbmdlRnJhbWVzXG4gICAgKiBAcGFyYW0ge2dzLlJlY3RbXX0gZnJhbWVzIEFuIGFycmF5IG9mIHNvdXJjZSByZWN0YW5nbGVzIChmcmFtZXMpLlxuICAgICogQHBhcmFtIHtudW1iZXJ9IGR1cmF0aW9uIFRoZSBkdXJhdGlvbiBpbiBmcmFtZXMuXG4gICAgKiBAcGFyYW0ge09iamVjdH0gZWFzaW5nVHlwZSBUaGUgZWFzaW5nLXR5cGUuXG4gICAgIyMjICAgICAgXG4gICAgI2NoYW5nZUZyYW1lczogKGZyYW1lcywgZHVyYXRpb24sIGVhc2luZ1R5cGUpIC0+XG4gICAgIyAgICBhbmltYXRpb24gPSBuZXcgZ3MuQ29tcG9uZW50X0ZyYW1lQW5pbWF0aW9uKClcbiAgICAjICAgIEBvYmplY3QuYWRkQ29tcG9uZW50KGFuaW1hdGlvbilcbiAgICAjICAgIGFuaW1hdGlvbi5zdGFydChmcmFtZXMsIGR1cmF0aW9uLCBlYXNpbmdUeXBlLCBAY2FsbGJhY2spXG4gICAgICAgXG4gICAgIyMjKlxuICAgICogQSBmcmFtZSBhbmltYXRpb24gd2hpY2ggbW9kaWZpZXMgdGhlIGdhbWUgb2JqZWN0J3Mgc3JjUmVjdCBwcm9wZXJ0eVxuICAgICogYSBwbGF5IGFuIGFuaW1hdGlvbi5cbiAgICAqXG4gICAgKiBAbWV0aG9kIHBsYXlBbmltYXRpb25cbiAgICAqIEBwYXJhbSB7Z3MuUmVjdFtdfSBmcmFtZXMgQW4gYXJyYXkgb2Ygc291cmNlIHJlY3RhbmdsZXMgKGZyYW1lcykuXG4gICAgKiBAcGFyYW0ge251bWJlcn0gZHVyYXRpb24gVGhlIGR1cmF0aW9uIGluIGZyYW1lcy5cbiAgICAqIEBwYXJhbSB7T2JqZWN0fSBlYXNpbmdUeXBlIFRoZSBlYXNpbmctdHlwZS5cbiAgICAjIyMgICAgIFxuICAgIHBsYXlBbmltYXRpb246IChhbmltYXRpb25SZWNvcmQpIC0+XG4gICAgICAgIEBmcmFtZUFuaW1hdGlvbi5yZWZyZXNoKGFuaW1hdGlvblJlY29yZClcbiAgICAgICAgQG9iamVjdC5hZGRDb21wb25lbnQoQGZyYW1lQW5pbWF0aW9uKVxuICAgICAgICBAZnJhbWVBbmltYXRpb24uc3RhcnQoQGNhbGxiYWNrKVxuICAgICAgICBcbiAgICAgICAgcmV0dXJuIEBmcmFtZUFuaW1hdGlvblxuICAgICAgIFxuICAgICMjIypcbiAgICAqIENoYW5nZXMgYSBmaWVsZCBvZiB0aGUgZ2FtZSBvYmplY3QgdG8gYSBzcGVjaWZpZWQgdmFsdWUuXG4gICAgKlxuICAgICogQG1ldGhvZCBjaGFuZ2VcbiAgICAqIEBwYXJhbSB7bnVtYmVyfSBWYWx1ZSBUaGUgdGFyZ2V0IHZhbHVlLlxuICAgICogQHBhcmFtIHtzdHJpbmd9IGZpZWxkIFRoZSBuYW1lIG9mIHRoZSBmaWVsZC9wcm9wZXJ0eS5cbiAgICAqIEBwYXJhbSB7bnVtYmVyfSBkdXJhdGlvbiBUaGUgZHVyYXRpb24gaW4gZnJhbWVzLlxuICAgICogQHBhcmFtIHtPYmplY3R9IGVhc2luZ1R5cGUgVGhlIGVhc2luZy10eXBlLlxuICAgICMjIyAgIFxuICAgIGNoYW5nZTogKHZhbHVlLCBmaWVsZCwgZHVyYXRpb24sIGVhc2luZ1R5cGUpIC0+XG4gICAgICAgIEBvYmplY3QuYWRkQ29tcG9uZW50KEBmaWVsZEFuaW1hdGlvbilcbiAgICAgICAgQGZpZWxkQW5pbWF0aW9uLnN0YXJ0KHZhbHVlLCBmaWVsZCwgZHVyYXRpb24sIGVhc2luZ1R5cGUsIEBjYWxsYmFjaylcbiAgICAgICAgXG4gICAgICAgIHJldHVybiBAZmllbGRBbmltYXRpb25cbiAgICAgICBcbiAgICAjIyMqXG4gICAgKiBTaGFrZXMgdGhlIGdhbWUgb2JqZWN0IGhvcml6b250YWxseSB1c2luZyB0aGUgZ2FtZSBvYmplY3QncyBvZmZzZXQtcHJvcGVydHkuXG4gICAgKlxuICAgICogQG1ldGhvZCBzaGFrZVxuICAgICogQHBhcmFtIHtncy5SYW5nZX0gcmFuZ2UgVGhlIGhvcml6b250YWwgc2hha2UtcmFuZ2UuXG4gICAgKiBAcGFyYW0ge251bWJlcn0gc3BlZWQgVGhlIHNoYWtlIHNwZWVkLlxuICAgICogQHBhcmFtIHtudW1iZXJ9IGR1cmF0aW9uIFRoZSBkdXJhdGlvbiBpbiBmcmFtZXMuXG4gICAgKiBAcGFyYW0ge09iamVjdH0gZWFzaW5nVHlwZSBUaGUgZWFzaW5nLXR5cGUuXG4gICAgIyMjIFxuICAgIHNoYWtlOiAocmFuZ2UsIHNwZWVkLCBkdXJhdGlvbiwgZWFzaW5nKSAtPlxuICAgICAgICBAb2JqZWN0LmFkZENvbXBvbmVudChAc2hha2VBbmltYXRpb24pXG4gICAgICAgIEBzaGFrZUFuaW1hdGlvbi5zdGFydChyYW5nZSwgc3BlZWQsIGR1cmF0aW9uLCBlYXNpbmcsIEBjYWxsYmFjaylcbiAgICAgICAgXG4gICAgICAgIHJldHVybiBAc2hha2VBbmltYXRpb25cbiAgICAgICAgXG4gICAgIyMjKlxuICAgICogVGludHMgdGhlIGdhbWUgb2JqZWN0IHRvIGEgc3BlY2lmaWVkIHRvbmUuXG4gICAgKlxuICAgICogQG1ldGhvZCB0aW50VG9cbiAgICAqIEBwYXJhbSB7VG9uZX0gdG9uZSBUaGUgdGFyZ2V0IHRvbmUuXG4gICAgKiBAcGFyYW0ge251bWJlcn0gZHVyYXRpb24gVGhlIGR1cmF0aW9uIGluIGZyYW1lcy5cbiAgICAqIEBwYXJhbSB7T2JqZWN0fSBlYXNpbmdUeXBlIFRoZSBlYXNpbmctdHlwZS5cbiAgICAjIyMgXG4gICAgdGludFRvOiAodG9uZSwgZHVyYXRpb24sIGVhc2luZ1R5cGUpIC0+XG4gICAgICAgIEBvYmplY3QuYWRkQ29tcG9uZW50KEB0aW50QW5pbWF0aW9uKVxuICAgICAgICBAdGludEFuaW1hdGlvbi5zdGFydCh0b25lLCBkdXJhdGlvbiwgZWFzaW5nVHlwZSwgQGNhbGxiYWNrKVxuICAgICAgICBcbiAgICAgICAgcmV0dXJuIEB0aW50QW5pbWF0aW9uXG4gICAgXG4gICAgIyMjKlxuICAgICogUm90YXRlcyB0aGUgZ2FtZSBvYmplY3QgYXJvdW5kIGl0cyBhbmNob3ItcG9pbnQuXG4gICAgKlxuICAgICogQG1ldGhvZCByb3RhdGVcbiAgICAqIEBwYXJhbSB7Z3MuUm90YXRpb25EaXJlY3Rpb259IGRpcmVjdGlvbiBUaGUgcm90YXRpb24tZGlyZWN0aW9uLlxuICAgICogQHBhcmFtIHtudW1iZXJ9IHNwZWVkIFRoZSByb3RhdGlvbiBzcGVlZCBpbiBkZWdyZWVzIHBlciBmcmFtZS5cbiAgICAqIEBwYXJhbSB7bnVtYmVyfSBkdXJhdGlvbiBUaGUgZHVyYXRpb24gaW4gZnJhbWVzLlxuICAgICogQHBhcmFtIHtPYmplY3R9IGVhc2luZ1R5cGUgVGhlIGVhc2luZy10eXBlLlxuICAgICMjIyBcbiAgICByb3RhdGU6IChkaXJlY3Rpb24sIHNwZWVkLCBkdXJhdGlvbiwgZWFzaW5nVHlwZSkgLT5cbiAgICAgICAgQG9iamVjdC5hZGRDb21wb25lbnQoQHJvdGF0ZUFuaW1hdGlvbilcbiAgICAgICAgQHJvdGF0ZUFuaW1hdGlvbi5yb3RhdGUoZGlyZWN0aW9uLCBzcGVlZCwgZHVyYXRpb24sIGVhc2luZ1R5cGUsIEBjYWxsYmFjaylcbiAgICAgICAgXG4gICAgICAgIHJldHVybiBAcm90YXRlQW5pbWF0aW9uXG4gICAgXG4gICAgIyMjKlxuICAgICogUm90YXRlcyB0aGUgZ2FtZSBvYmplY3QgYXJvdW5kIGl0cyBhbmNob3ItcG9pbnQgdG8gYSBzcGVjaWZpZWQgYW5nbGUuXG4gICAgKlxuICAgICogQG1ldGhvZCByb3RhdGVUb1xuICAgICogQHBhcmFtIHtudW1iZXJ9IGFuZ2xlIFRoZSB0YXJnZXQgYW5nbGUuXG4gICAgKiBAcGFyYW0ge251bWJlcn0gZHVyYXRpb24gVGhlIGR1cmF0aW9uIGluIGZyYW1lcy5cbiAgICAqIEBwYXJhbSB7T2JqZWN0fSBlYXNpbmdUeXBlIFRoZSBlYXNpbmctdHlwZS5cbiAgICAjIyMgXG4gICAgcm90YXRlVG86IChhbmdsZSwgZHVyYXRpb24sIGVhc2luZ1R5cGUpIC0+XG4gICAgICAgIEBvYmplY3QuYWRkQ29tcG9uZW50KEByb3RhdGVBbmltYXRpb24pXG4gICAgICAgIEByb3RhdGVBbmltYXRpb24ucm90YXRlVG8oYW5nbGUsIGR1cmF0aW9uLCBlYXNpbmdUeXBlLCBAY2FsbGJhY2spXG4gICAgICAgIFxuICAgICAgICByZXR1cm4gQHJvdGF0ZUFuaW1hdGlvblxuICAgICAgICBcbiAgICAjIyMqXG4gICAgKiBMZXRzIGEgZ2FtZSBvYmplY3QgYXBwZWFyIG9uIHNjcmVlbiB1c2luZyBhIG1hc2tpbmctZWZmZWN0LlxuICAgICpcbiAgICAqIEBtZXRob2QgbWFza0luXG4gICAgKiBAcGFyYW0ge2dzLk1hc2t9IG1hc2sgVGhlIG1hc2sgdXNlZCBmb3IgdGhlIGFuaW1hdGlvbi5cbiAgICAqIEBwYXJhbSB7bnVtYmVyfSBkdXJhdGlvbiBUaGUgZHVyYXRpb24gaW4gZnJhbWVzLlxuICAgICogQHBhcmFtIHtPYmplY3R9IGVhc2luZ1R5cGUgVGhlIGVhc2luZy10eXBlLlxuICAgICogQHBhcmFtIHtmdW5jdGlvbn0gW2NhbGxiYWNrXSBBbiBvcHRpb25hbCBjYWxsYmFjay1mdW5jdGlvbiBjYWxsZWQgd2hlbiB0aGUgYW5pbWF0aW9uIGlzIGZpbmlzaGVkLiBcbiAgICAjIyMgICAgIFxuICAgIG1hc2tJbjogKG1hc2ssIGR1cmF0aW9uLCBlYXNpbmcsIGNhbGxiYWNrKSAtPlxuICAgICAgICBAb2JqZWN0LmFkZENvbXBvbmVudChAbWFza0FuaW1hdGlvbilcbiAgICAgICAgQG1hc2tBbmltYXRpb24ubWFza0luKG1hc2ssIGR1cmF0aW9uLCBlYXNpbmcsIChvYmplY3QsIGFuaW1hdGlvbikgLT4gb2JqZWN0LnJlbW92ZUNvbXBvbmVudChhbmltYXRpb24pOyBjYWxsYmFjaz8ob2JqZWN0KTspXG4gICAgICAgIFxuICAgICAgICByZXR1cm4gQG1hc2tBbmltYXRpb25cbiAgICAgXG4gICAgIyMjKlxuICAgICogRGVzY3JpcHRpb24gZm9sbG93cy4uLlxuICAgICpcbiAgICAqIEBtZXRob2QgbWFza1RvXG4gICAgKiBAcGFyYW0ge2dzLk1hc2t9IG1hc2sgVGhlIG1hc2sgdXNlZCBmb3IgdGhlIGFuaW1hdGlvbi5cbiAgICAqIEBwYXJhbSB7bnVtYmVyfSBkdXJhdGlvbiBUaGUgZHVyYXRpb24gaW4gZnJhbWVzLlxuICAgICogQHBhcmFtIHtPYmplY3R9IGVhc2luZ1R5cGUgVGhlIGVhc2luZy10eXBlLlxuICAgICogQHBhcmFtIHtmdW5jdGlvbn0gW2NhbGxiYWNrXSBBbiBvcHRpb25hbCBjYWxsYmFjay1mdW5jdGlvbiBjYWxsZWQgd2hlbiB0aGUgYW5pbWF0aW9uIGlzIGZpbmlzaGVkLiBcbiAgICAjIyMgICAgIFxuICAgIG1hc2tUbzogKG1hc2ssIGR1cmF0aW9uLCBlYXNpbmcsIGNhbGxiYWNrKSAtPlxuICAgICAgICBAb2JqZWN0LmFkZENvbXBvbmVudChAbWFza0FuaW1hdGlvbilcbiAgICAgICAgQG1hc2tBbmltYXRpb24ubWFza1RvKG1hc2ssIGR1cmF0aW9uLCBlYXNpbmcsIChvYmplY3QsIGFuaW1hdGlvbikgLT4gb2JqZWN0LnJlbW92ZUNvbXBvbmVudChhbmltYXRpb24pOyBjYWxsYmFjaz8ob2JqZWN0KTspXG4gICAgICAgIFxuICAgICAgICByZXR1cm4gQG1hc2tBbmltYXRpb25cbiAgICAgICAgXG4gICAgIyMjKlxuICAgICogTGV0cyBhIGdhbWUgb2JqZWN0IGRpc2FwcGVhciBmcm9tIHNjcmVlbiB1c2luZyBhIG1hc2tpbmctZWZmZWN0LlxuICAgICpcbiAgICAqIEBtZXRob2QgbWFza091dFxuICAgICogQHBhcmFtIHtncy5NYXNrfSBtYXNrIFRoZSBtYXNrIHVzZWQgZm9yIHRoZSBhbmltYXRpb24uXG4gICAgKiBAcGFyYW0ge251bWJlcn0gZHVyYXRpb24gVGhlIGR1cmF0aW9uIGluIGZyYW1lcy5cbiAgICAqIEBwYXJhbSB7T2JqZWN0fSBlYXNpbmdUeXBlIFRoZSBlYXNpbmctdHlwZS5cbiAgICAqIEBwYXJhbSB7ZnVuY3Rpb259IFtjYWxsYmFja10gQW4gb3B0aW9uYWwgY2FsbGJhY2stZnVuY3Rpb24gY2FsbGVkIHdoZW4gdGhlIGFuaW1hdGlvbiBpcyBmaW5pc2hlZC4gXG4gICAgIyMjICBcbiAgICBtYXNrT3V0OiAobWFzaywgZHVyYXRpb24sIGVhc2luZywgY2FsbGJhY2spIC0+XG4gICAgICAgIEBvYmplY3QuYWRkQ29tcG9uZW50KEBtYXNrQW5pbWF0aW9uKVxuICAgICAgICBAbWFza0FuaW1hdGlvbi5tYXNrT3V0KG1hc2ssIGR1cmF0aW9uLCBlYXNpbmcsIChvYmplY3QsIGFuaW1hdGlvbikgLT4gb2JqZWN0LnJlbW92ZUNvbXBvbmVudChhbmltYXRpb24pOyBjYWxsYmFjaz8ob2JqZWN0KTspXG4gICAgICAgIFxuICAgICAgICByZXR1cm4gQG1hc2tBbmltYXRpb25cblxuICAgICMjIypcbiAgICAqIExldHMgYSBnYW1lIG9iamVjdCBhcHBlYXIgb24gc2NyZWVuIGZyb20gbGVmdCwgdG9wLCByaWdodCBvciBib3R0b20gdXNpbmcgXG4gICAgKiBhIG1vdmUtYW5pbWF0aW9uXG4gICAgKlxuICAgICogQG1ldGhvZCBtb3ZlSW5cbiAgICAqIEBwYXJhbSB7bnVtYmVyfSB4IFRoZSB4LWNvb3JkaW5hdGUgb2YgdGhlIHRhcmdldC1wb3NpdGlvbi5cbiAgICAqIEBwYXJhbSB7bnVtYmVyfSB5IFRoZSB5LWNvb3JkaW5hdGUgb2YgdGhlIHRhcmdldC1wb3NpdGlvbi5cbiAgICAqIEBwYXJhbSB7bnVtYmVyfSB0eXBlIFRoZSBtb3ZlbWVudC1kaXJlY3Rpb24gZnJvbSB3aGVyZSB0aGUgZ2FtZSBvYmplY3Qgc2hvdWxkIG1vdmUtaW4uXG4gICAgKiBAcGFyYW0ge251bWJlcn0gZHVyYXRpb24gVGhlIGR1cmF0aW9uIGluIGZyYW1lcy5cbiAgICAqIEBwYXJhbSB7T2JqZWN0fSBlYXNpbmdUeXBlIFRoZSBlYXNpbmctdHlwZS5cbiAgICAqIEBwYXJhbSB7ZnVuY3Rpb259IFtjYWxsYmFja10gQW4gb3B0aW9uYWwgY2FsbGJhY2stZnVuY3Rpb24gY2FsbGVkIHdoZW4gdGhlIGFuaW1hdGlvbiBpcyBmaW5pc2hlZC4gXG4gICAgIyMjICBcbiAgICBtb3ZlSW46ICh4LCB5LCB0eXBlLCBkdXJhdGlvbiwgZWFzaW5nLCBjYWxsYmFjaykgLT5cbiAgICAgICAgQG9iamVjdC5hZGRDb21wb25lbnQoQG1vdmVBbmltYXRpb24pXG4gICAgICAgIEBtb3ZlQW5pbWF0aW9uLm1vdmVJbih4LCB5LCB0eXBlLCBkdXJhdGlvbiwgZWFzaW5nLCAob2JqZWN0LCBhbmltYXRpb24pIC0+IFxuICAgICAgICAgICAgb2JqZWN0LnJlbW92ZUNvbXBvbmVudChhbmltYXRpb24pXG4gICAgICAgICAgICBjYWxsYmFjaz8ob2JqZWN0KSlcbiAgICAgICAgXG4gICAgICAgIHJldHVybiBAbW92ZUFuaW1hdGlvblxuICAgICAgXG4gICAgIyMjKlxuICAgICogTGV0cyBhIGdhbWUgb2JqZWN0IGRpc2FwcGVhciBmcm9tIHNjcmVlbiB0byB0aGUgbGVmdCwgdG9wLCByaWdodCBvciBib3R0b20gdXNpbmcgXG4gICAgKiBhIG1vdmUtYW5pbWF0aW9uXG4gICAgKlxuICAgICogQG1ldGhvZCBtb3ZlT3V0XG4gICAgKiBAcGFyYW0ge251bWJlcn0gdHlwZSBUaGUgbW92ZW1lbnQtZGlyZWN0aW9uIGluIHdoaWNoIHRoZSBnYW1lIG9iamVjdCBzaG91bGQgbW92ZS1vdXQuXG4gICAgKiBAcGFyYW0ge251bWJlcn0gZHVyYXRpb24gVGhlIGR1cmF0aW9uIGluIGZyYW1lcy5cbiAgICAqIEBwYXJhbSB7T2JqZWN0fSBlYXNpbmdUeXBlIFRoZSBlYXNpbmctdHlwZS5cbiAgICAqIEBwYXJhbSB7ZnVuY3Rpb259IFtjYWxsYmFja10gQW4gb3B0aW9uYWwgY2FsbGJhY2stZnVuY3Rpb24gY2FsbGVkIHdoZW4gdGhlIGFuaW1hdGlvbiBpcyBmaW5pc2hlZC4gXG4gICAgIyMjICAgIFxuICAgIG1vdmVPdXQ6ICh0eXBlLCBkdXJhdGlvbiwgZWFzaW5nLCBjYWxsYmFjaykgLT5cbiAgICAgICAgQG9iamVjdC5hZGRDb21wb25lbnQoQG1vdmVBbmltYXRpb24pXG4gICAgICAgIEBtb3ZlQW5pbWF0aW9uLm1vdmVPdXQodHlwZSwgZHVyYXRpb24sIGVhc2luZywgKG9iamVjdCwgYW5pbWF0aW9uKSAtPiBcbiAgICAgICAgICAgIG9iamVjdC5yZW1vdmVDb21wb25lbnQoYW5pbWF0aW9uKVxuICAgICAgICAgICAgY2FsbGJhY2s/KG9iamVjdClcbiAgICAgICAgKVxuICAgICAgICBcbiAgICAgICAgcmV0dXJuIEBtb3ZlQW5pbWF0aW9uXG4gICAgICAgIFxuICAgICMjIypcbiAgICAqIExldHMgYSBnYW1lIG9iamVjdCBhcHBlYXIgb24gc2NyZWVuIHVzaW5nIGJsZW5kaW5nLlxuICAgICpcbiAgICAqIEBtZXRob2Qgc2hvd1xuICAgICogQHBhcmFtIHtudW1iZXJ9IGR1cmF0aW9uIFRoZSBkdXJhdGlvbiBpbiBmcmFtZXMuXG4gICAgKiBAcGFyYW0ge09iamVjdH0gZWFzaW5nIFRoZSBlYXNpbmctdHlwZS5cbiAgICAqIEBwYXJhbSB7ZnVuY3Rpb259IFtjYWxsYmFja10gQW4gb3B0aW9uYWwgY2FsbGJhY2stZnVuY3Rpb24gY2FsbGVkIHdoZW4gdGhlIGFuaW1hdGlvbiBpcyBmaW5pc2hlZC4gXG4gICAgIyMjICBcbiAgICBzaG93OiAoZHVyYXRpb24sIGVhc2luZywgY2FsbGJhY2spIC0+XG4gICAgICAgIEBvYmplY3Qub3BhY2l0eSA9IDBcbiAgICAgICAgQG9iamVjdC52aXN1YWw/LnVwZGF0ZSgpXG4gICAgICAgIFxuICAgICAgICByZXR1cm4gQGJsZW5kVG8oMjU1LCBkdXJhdGlvbiwgZWFzaW5nLCBjYWxsYmFjaylcbiAgICAgXG4gICAgIyMjKlxuICAgICogTGV0cyBhIGdhbWUgb2JqZWN0IGRpc2FwcGVhciBmcm9tIHNjcmVlbiB1c2luZyBibGVuZGluZy5cbiAgICAqXG4gICAgKiBAbWV0aG9kIGhpZGVcbiAgICAqIEBwYXJhbSB7bnVtYmVyfSBkdXJhdGlvbiBUaGUgZHVyYXRpb24gaW4gZnJhbWVzLlxuICAgICogQHBhcmFtIHtPYmplY3R9IGVhc2luZyBUaGUgZWFzaW5nLXR5cGUuXG4gICAgKiBAcGFyYW0ge2Z1bmN0aW9ufSBbY2FsbGJhY2tdIEFuIG9wdGlvbmFsIGNhbGxiYWNrLWZ1bmN0aW9uIGNhbGxlZCB3aGVuIHRoZSBhbmltYXRpb24gaXMgZmluaXNoZWQuIFxuICAgICMjIyAgICAgXG4gICAgaGlkZTogKGR1cmF0aW9uLCBlYXNpbmcsIGNhbGxiYWNrKSAtPlxuICAgICAgICByZXR1cm4gQGJsZW5kVG8oMCwgZHVyYXRpb24sIGVhc2luZywgY2FsbGJhY2spXG4gICAgICAgXG4gICAgIyMjKlxuICAgICogQ2hhbmdlcyB2aXNpYmxlLXByb3BlcnR5IHRvIHRydWUuIFRoaXMgbWV0aG9kIGlzIGRlcHJlY2F0ZWQuXG4gICAgKiBcbiAgICAqIEBtZXRob2Qgb3BlblxuICAgICogQGRlcHJlY2F0ZWRcbiAgICAjIyMgICBcbiAgICBvcGVuOiAtPiBAb2JqZWN0LnZpc2libGUgPSB5ZXNcbiAgICBcbiAgICAjIyMqXG4gICAgKiBDaGFuZ2VzIHZpc2libGUtcHJvcGVydHkgdG8gZmFsc2UuIFRoaXMgbWV0aG9kIGlzIGRlcHJlY2F0ZWQuXG4gICAgKiBcbiAgICAqIEBtZXRob2QgY2xvc2VcbiAgICAqIEBkZXByZWNhdGVkXG4gICAgIyMjICAgXG4gICAgY2xvc2U6IC0+IEBvYmplY3QudmlzaWJsZSA9IG5vXG4gICAgXG4gICAgIyMjKlxuICAgICogRmxhc2hlcyB0aGUgZ2FtZSBvYmplY3QuXG4gICAgKlxuICAgICogQG1ldGhvZCBmbGFzaFxuICAgICogQHBhcmFtIHtDb2xvcn0gY29sb3IgVGhlIGZsYXNoLWNvbG9yLlxuICAgICogQHBhcmFtIHtudW1iZXJ9IGR1cmF0aW9uIFRoZSBkdXJhdGlvbiBpbiBmcmFtZXMuXG4gICAgIyMjXG4gICAgZmxhc2g6IChjb2xvciwgZHVyYXRpb24pIC0+XG4gICAgICAgIEBvYmplY3QuY29sb3IgPSBjb2xvclxuICAgICAgICBjb2xvciA9IG5ldyBDb2xvcihjb2xvcilcbiAgICAgICAgY29sb3IuYWxwaGEgPSAwXG4gICAgICAgIHJldHVybiBAY29sb3JUbyhjb2xvciwgZHVyYXRpb24sIGdzLkVhc2luZ3MuRUFTRV9MSU5FQVJbZ3MuRWFzaW5nVHlwZXMuRUFTRV9JTl0pXG4gICAgXG4gICAgIyMjKlxuICAgICogTGV0cyBhIGdhbWUgb2JqZWN0IGFwcGVhciBvbiBzY3JlZW4gdXNpbmcgYSBzcGVjaWZpZWQgYW5pbWF0aW9uLlxuICAgICpcbiAgICAqIEBtZXRob2QgYXBwZWFyXG4gICAgKiBAcGFyYW0ge251bWJlcn0geCBUaGUgeC1jb29yZGluYXRlIG9mIHRoZSB0YXJnZXQtcG9zaXRpb24uXG4gICAgKiBAcGFyYW0ge251bWJlcn0geSBUaGUgeS1jb29yZGluYXRlIG9mIHRoZSB0YXJnZXQtcG9zaXRpb24uXG4gICAgKiBAcGFyYW0ge2dzLkFwcGVhckFuaW1hdGlvbkluZm99IGFuaW1hdGlvbiBUaGUgYW5pbWF0aW9uIGluZm8tb2JqZWN0LlxuICAgICogQHBhcmFtIHtPYmplY3R9IGVhc2luZyBUaGUgZWFzaW5nLXR5cGUuXG4gICAgKiBAcGFyYW0ge251bWJlcn0gZHVyYXRpb24gVGhlIGR1cmF0aW9uIGluIGZyYW1lcy5cbiAgICAqIEBwYXJhbSB7ZnVuY3Rpb259IFtjYWxsYmFja10gQW4gb3B0aW9uYWwgY2FsbGJhY2stZnVuY3Rpb24gY2FsbGVkIHdoZW4gdGhlIGFuaW1hdGlvbiBpcyBmaW5pc2hlZC4gXG4gICAgIyMjICAgICAgXG4gICAgYXBwZWFyOiAoeCwgeSwgYW5pbWF0aW9uLCBlYXNpbmcsIGR1cmF0aW9uLCBjYWxsYmFjaykgLT5cbiAgICAgICAgZWFzaW5nID0gZWFzaW5nIHx8IGdzLkVhc2luZ3MuRUFTRV9MSU5FQVJbZ3MuRWFzaW5nVHlwZXMuRUFTRV9JTl1cbiAgICAgICAgQG9iamVjdC52aXNpYmxlID0geWVzXG5cbiAgICAgICAgaWYgYW5pbWF0aW9uLnR5cGUgPT0gZ3MuQW5pbWF0aW9uVHlwZXMuTU9WRU1FTlRcbiAgICAgICAgICAgIEBtb3ZlSW4oeCwgeSwgYW5pbWF0aW9uLm1vdmVtZW50LCBkdXJhdGlvbiwgZWFzaW5nLCBjYWxsYmFjaylcbiAgICAgICAgZWxzZSBpZiBhbmltYXRpb24udHlwZSA9PSBncy5BbmltYXRpb25UeXBlcy5NQVNLSU5HXG4gICAgICAgICAgICBAbWFza0luKGFuaW1hdGlvbi5tYXNrLCBkdXJhdGlvbiwgZWFzaW5nLCBjYWxsYmFjaylcbiAgICAgICAgZWxzZVxuICAgICAgICAgICAgQHNob3coZHVyYXRpb24sIGVhc2luZywgY2FsbGJhY2spXG4gICAgXG4gICAgIyMjKlxuICAgICogTGV0cyBhIGdhbWUgb2JqZWN0IGRpc2FwcGVhciBmcm9tIHNjcmVlbiB1c2luZyBhIHNwZWNpZmllZCBhbmltYXRpb24uXG4gICAgKlxuICAgICogQG1ldGhvZCBkaXNhcHBlYXJcbiAgICAqIEBwYXJhbSB7Z3MuQXBwZWFyQW5pbWF0aW9uSW5mb30gYW5pbWF0aW9uIFRoZSBhbmltYXRpb24gaW5mby1vYmplY3QuXG4gICAgKiBAcGFyYW0ge09iamVjdH0gZWFzaW5nIFRoZSBlYXNpbmctdHlwZS5cbiAgICAqIEBwYXJhbSB7bnVtYmVyfSBkdXJhdGlvbiBUaGUgZHVyYXRpb24gaW4gZnJhbWVzLlxuICAgICogQHBhcmFtIHtmdW5jdGlvbn0gW2NhbGxiYWNrXSBBbiBvcHRpb25hbCBjYWxsYmFjay1mdW5jdGlvbiBjYWxsZWQgd2hlbiB0aGUgYW5pbWF0aW9uIGlzIGZpbmlzaGVkLiBcbiAgICAjIyMgICAgICAgXG4gICAgZGlzYXBwZWFyOiAoYW5pbWF0aW9uLCBlYXNpbmcsIGR1cmF0aW9uLCBjYWxsYmFjaykgLT5cbiAgICAgICAgQG9iamVjdC52aXNpYmxlID0geWVzXG4gICAgICAgIGlmIGFuaW1hdGlvbi50eXBlID09IGdzLkFuaW1hdGlvblR5cGVzLk1PVkVNRU5UXG4gICAgICAgICAgICBAbW92ZU91dChhbmltYXRpb24ubW92ZW1lbnQsIGR1cmF0aW9uLCBlYXNpbmcsIGNhbGxiYWNrKVxuICAgICAgICBlbHNlIGlmIGFuaW1hdGlvbi50eXBlID09IGdzLkFuaW1hdGlvblR5cGVzLk1BU0tJTkdcbiAgICAgICAgICAgIEBtYXNrT3V0KGFuaW1hdGlvbi5tYXNrLCBkdXJhdGlvbiwgZWFzaW5nLCBjYWxsYmFjaylcbiAgICAgICAgZWxzZVxuICAgICAgICAgICAgQGhpZGUoZHVyYXRpb24sIGVhc2luZywgY2FsbGJhY2spXG4gICAgICAgIFxuXG5ncy5BbmltYXRvciA9IENvbXBvbmVudF9BbmltYXRvclxuZ3MuQ29tcG9uZW50X0FuaW1hdG9yID0gQ29tcG9uZW50X0FuaW1hdG9yIl19\n//# sourceURL=Component_Animator_139.js"
12 + "compiledContent": "var Component_Animator,\n extend = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; },\n hasProp = {}.hasOwnProperty;\n\nComponent_Animator = (function(superClass) {\n extend(Component_Animator, superClass);\n\n\n /**\n * An animator-component allows to execute different kind of animations \n * on a game object. The animations are using the game object's \n * dstRect & offset-property to execute.\n *\n * @module gs\n * @class Component_Animator\n * @extends gs.Component\n * @memberof gs\n * @constructor\n */\n\n function Component_Animator() {\n Component_Animator.__super__.constructor.apply(this, arguments);\n this.moveAnimation = new gs.Component_MoveAnimation();\n this.pathAnimation = new gs.Component_PathAnimation();\n this.zoomAnimation = new gs.Component_ZoomAnimation();\n this.blendAnimation = new gs.Component_BlendAnimation();\n this.blurAnimation = new gs.Component_BlurAnimation();\n this.pixelateAnimation = new gs.Component_PixelateAnimation();\n this.wobbleAnimation = new gs.Component_WobbleAnimation();\n this.colorAnimation = new gs.Component_ColorAnimation();\n this.imageAnimation = new gs.Component_ImageAnimation();\n this.frameAnimation = new gs.Component_FrameAnimation();\n this.fieldAnimation = new gs.Component_FieldAnimation();\n this.shakeAnimation = new gs.Component_ShakeAnimation();\n this.tintAnimation = new gs.Component_TintAnimation();\n this.rotateAnimation = new gs.Component_RotateAnimation();\n this.maskAnimation = new gs.Component_MaskAnimation();\n this.l2dAnimation = new gs.Component_Live2DAnimation();\n\n /**\n * Standard Callback Routine\n * @property callback\n * @type function\n * @private\n */\n this.callback = function(object, animation) {\n return object.removeComponent(animation);\n };\n this.onBlendFinish = function(object, animation, callback) {\n object.removeComponent(animation);\n return typeof callback === \"function\" ? callback(object) : void 0;\n };\n }\n\n Component_Animator.accessors(\"isAnimating\", {\n get: function() {\n return this.object;\n }\n\n /**\n * Updates the animator.\n *\n * @method update\n */\n });\n\n Component_Animator.prototype.update = function() {\n var ref, ref1;\n Component_Animator.__super__.update.apply(this, arguments);\n if (((ref = this.object.mask) != null ? (ref1 = ref.source) != null ? ref1.videoElement : void 0 : void 0) != null) {\n return this.object.mask.source.update();\n }\n };\n\n\n /**\n * Moves the game object with a specified speed.\n *\n * @method move\n * @param {number} speedX The speed on x-axis in pixels per frame.\n * @param {number} speedY The speed on y-axis in pixels per frame.\n * @param {number} duration The duration in frames.\n * @param {Object} easingType The easing-type used for the animation.\n */\n\n Component_Animator.prototype.move = function(speedX, speedY, duration, easingType) {\n this.object.addComponent(this.moveAnimation);\n this.moveAnimation.move(speedX, speedY, duration, easingType, this.callback);\n return this.moveAnimation;\n };\n\n\n /**\n * Moves the game object to a specified position.\n *\n * @method moveTo\n * @param {number} x The x-coordinate of the position.\n * @param {number} y The y-coordinate of the position.\n * @param {number} duration The duration in frames.\n * @param {Object} easingType The easing-type.\n */\n\n Component_Animator.prototype.moveTo = function(x, y, duration, easingType) {\n this.object.addComponent(this.moveAnimation);\n this.moveAnimation.moveTo(x, y, duration, easingType, this.callback);\n return this.moveAnimation;\n };\n\n\n /**\n * Moves the game object along a path.\n *\n * @method movePath\n * @param {Object} path The path to follow.\n * @param {gs.AnimationLoopType} loopType The loop-Type.\n * @param {number} duration The duration in frames.\n * @param {Object} easingType The easing-type.\n * @param {Object[]} effects Optional array of effects executed during the path-movement like playing a sound.\n */\n\n Component_Animator.prototype.movePath = function(path, loopType, duration, easingType, effects) {\n var c;\n c = this.object.findComponent(\"Component_PathAnimation\");\n if (c != null) {\n c.loopType = loopType;\n } else {\n this.object.addComponent(this.pathAnimation);\n this.pathAnimation.start(path, loopType, duration, easingType, effects, this.callback);\n }\n return this.pathAnimation;\n };\n\n\n /**\n * Scrolls the game object with a specified speed.\n *\n * @method scroll\n * @param {number} speedX The speed on x-axis in pixels per frame.\n * @param {number} speedY The speed on y-axis in pixels per frame.\n * @param {number} duration The duration in frames.\n * @param {Object} easingType The easing-type used for the animation.\n */\n\n Component_Animator.prototype.scroll = function(speedX, speedY, duration, easingType) {\n this.object.addComponent(this.moveAnimation);\n this.moveAnimation.scroll(speedX, speedY, duration, easingType, this.callback);\n return this.moveAnimation;\n };\n\n\n /**\n * Scrolls the game object to a specified position.\n *\n * @method scrollTo\n * @param {number} x The x-coordinate of the position.\n * @param {number} y The y-coordinate of the position.\n * @param {number} duration The duration in frames.\n * @param {Object} easingType The easing-type.\n */\n\n Component_Animator.prototype.scrollTo = function(x, y, duration, easingType) {\n this.object.addComponent(this.moveAnimation);\n this.moveAnimation.scrollTo(x, y, duration, easingType, this.callback);\n return this.moveAnimation;\n };\n\n\n /**\n * Scrolls the game object along a path.\n *\n * @method scrollPath\n * @param {Object} path The path to follow.\n * @param {gs.AnimationLoopType} loopType The loop-Type.\n * @param {number} duration The duration in frames.\n * @param {Object} easingType The easing-type.\n */\n\n Component_Animator.prototype.scrollPath = function(path, loopType, duration, easingType) {\n this.object.addComponent(this.pathAnimation);\n this.pathAnimation.scroll(path, loopType, duration, easingType, this.callback);\n return this.pathAnimation;\n };\n\n\n /**\n * Zooms a game object to specified size.\n *\n * @method zoomTo\n * @param {number} x The x-axis zoom-factor.\n * @param {number} y The y-axis zoom-factor.\n * @param {number} duration The duration in frames.\n * @param {Object} easingType The easing-type.\n */\n\n Component_Animator.prototype.zoomTo = function(x, y, duration, easingType) {\n this.object.addComponent(this.zoomAnimation);\n this.zoomAnimation.start(x, y, duration, easingType, this.callback);\n return this.zoomAnimation;\n };\n\n\n /**\n * Blends a game object to specified opacity.\n *\n * @method blendTo\n * @param {number} opacity The target opacity.\n * @param {number} duration The duration in frames.\n * @param {Object} easingType The easing-type.\n * @param {function} [callback] An optional callback called if blending is finished.\n */\n\n Component_Animator.prototype.blendTo = function(opacity, duration, easingType, callback) {\n this.blendAnimation.stop();\n this.object.addComponent(this.blendAnimation);\n this.blendAnimation.start(opacity, duration, easingType, gs.CallBack(\"onBlendFinish\", this, callback));\n return this.blendAnimation;\n };\n\n\n /**\n * Animates a Live2D model parameter of a Live2D game object to a specified value.\n *\n * @method blendTo\n * @param {string} param The name of the parameter to animate.\n * @param {number} value The target value.\n * @param {number} duration The duration in frames.\n * @param {Object} easingType The easing-type.\n * @param {function} [callback] An optional callback called if blending is finished.\n */\n\n Component_Animator.prototype.l2dParameterTo = function(param, value, duration, easingType, callback) {\n this.object.addComponent(this.l2dAnimation);\n this.l2dAnimation.start(param, value, duration, easingType, gs.CallBack(\"onBlendFinish\", this, callback));\n return this.l2dAnimation;\n };\n\n\n /**\n * Blurs a game object to specified blur-power.\n *\n * @method blurTo\n * @param {number} power The target blur-power.\n * @param {number} duration The duration in frames.\n * @param {Object} easingType The easing-type.\n */\n\n Component_Animator.prototype.blurTo = function(power, duration, easingType) {\n this.object.addComponent(this.blurAnimation);\n this.blurAnimation.start(power, duration, easingType);\n return this.blurAnimation;\n };\n\n\n /**\n * Pixelates a game object to specified pixel-size/block-size\n *\n * @method pixelateTo\n * @param {number} width - The target block-width\n * @param {number} height - The target block-height\n * @param {number} duration The duration in frames.\n * @param {Object} easingType The easing-type.\n */\n\n Component_Animator.prototype.pixelateTo = function(width, height, duration, easingType) {\n this.object.addComponent(this.pixelateAnimation);\n this.pixelateAnimation.start(width, height, duration, easingType);\n return this.pixelateAnimation;\n };\n\n\n /**\n * Wobbles a game object to specified wobble-power and wobble-speed.\n *\n * @method wobbleTo\n * @param {number} power The target wobble-power.\n * @param {number} speed The target wobble-speed.\n * @param {number} duration The duration in frames.\n * @param {Object} easingType The easing-type.\n */\n\n Component_Animator.prototype.wobbleTo = function(power, speed, duration, easingType) {\n this.object.addComponent(this.wobbleAnimation);\n this.wobbleAnimation.start(power, speed, duration, easingType);\n return this.wobbleAnimation;\n };\n\n\n /**\n * Colors a game object to a specified target color.\n *\n * @method colorTo\n * @param {Color} color The target color.\n * @param {number} duration The duration in frames.\n * @param {Object} easingType The easing-type.\n */\n\n Component_Animator.prototype.colorTo = function(color, duration, easingType) {\n this.object.addComponent(this.colorAnimation);\n this.colorAnimation.start(color, duration, easingType, this.callback);\n return this.colorAnimation;\n };\n\n\n /**\n * An image animation runs from left to right using the game object's\n * image-property.\n *\n * @method changeImages\n * @param {Array} images An array of image names.\n * @param {number} duration The duration in frames.\n * @param {Object} easingType The easing-type.\n */\n\n Component_Animator.prototype.changeImages = function(images, duration, easingType) {\n this.object.addComponent(this.imageAnimation);\n this.imageAnimation.start(images, duration, easingType, this.callback);\n return this.imageAnimation;\n };\n\n\n /**\n * A frame animation which modifies the game object's srcRect property\n * a play an animation.\n *\n * @method changeFrames\n * @param {gs.Rect[]} frames An array of source rectangles (frames).\n * @param {number} duration The duration in frames.\n * @param {Object} easingType The easing-type.\n */\n\n\n /**\n * A frame animation which modifies the game object's srcRect property\n * a play an animation.\n *\n * @method playAnimation\n * @param {gs.Rect[]} frames An array of source rectangles (frames).\n * @param {number} duration The duration in frames.\n * @param {Object} easingType The easing-type.\n */\n\n Component_Animator.prototype.playAnimation = function(animationRecord) {\n this.frameAnimation.refresh(animationRecord);\n this.object.addComponent(this.frameAnimation);\n this.frameAnimation.start(this.callback);\n return this.frameAnimation;\n };\n\n\n /**\n * Changes a field of the game object to a specified value.\n *\n * @method change\n * @param {number} Value The target value.\n * @param {string} field The name of the field/property.\n * @param {number} duration The duration in frames.\n * @param {Object} easingType The easing-type.\n */\n\n Component_Animator.prototype.change = function(value, field, duration, easingType) {\n this.object.addComponent(this.fieldAnimation);\n this.fieldAnimation.start(value, field, duration, easingType, this.callback);\n return this.fieldAnimation;\n };\n\n\n /**\n * Shakes the game object horizontally using the game object's offset-property.\n *\n * @method shake\n * @param {gs.Range} range The horizontal shake-range.\n * @param {number} speed The shake speed.\n * @param {number} duration The duration in frames.\n * @param {Object} easingType The easing-type.\n */\n\n Component_Animator.prototype.shake = function(range, speed, duration, easing) {\n this.object.addComponent(this.shakeAnimation);\n this.shakeAnimation.start(range, speed, duration, easing, this.callback);\n return this.shakeAnimation;\n };\n\n\n /**\n * Tints the game object to a specified tone.\n *\n * @method tintTo\n * @param {Tone} tone The target tone.\n * @param {number} duration The duration in frames.\n * @param {Object} easingType The easing-type.\n */\n\n Component_Animator.prototype.tintTo = function(tone, duration, easingType) {\n this.object.addComponent(this.tintAnimation);\n this.tintAnimation.start(tone, duration, easingType, this.callback);\n return this.tintAnimation;\n };\n\n\n /**\n * Rotates the game object around its anchor-point.\n *\n * @method rotate\n * @param {gs.RotationDirection} direction The rotation-direction.\n * @param {number} speed The rotation speed in degrees per frame.\n * @param {number} duration The duration in frames.\n * @param {Object} easingType The easing-type.\n */\n\n Component_Animator.prototype.rotate = function(direction, speed, duration, easingType) {\n this.object.addComponent(this.rotateAnimation);\n this.rotateAnimation.rotate(direction, speed, duration, easingType, this.callback);\n return this.rotateAnimation;\n };\n\n\n /**\n * Rotates the game object around its anchor-point to a specified angle.\n *\n * @method rotateTo\n * @param {number} angle The target angle.\n * @param {number} duration The duration in frames.\n * @param {Object} easingType The easing-type.\n */\n\n Component_Animator.prototype.rotateTo = function(angle, duration, easingType) {\n this.object.addComponent(this.rotateAnimation);\n this.rotateAnimation.rotateTo(angle, duration, easingType, this.callback);\n return this.rotateAnimation;\n };\n\n\n /**\n * Lets a game object appear on screen using a masking-effect.\n *\n * @method maskIn\n * @param {gs.Mask} mask The mask used for the animation.\n * @param {number} duration The duration in frames.\n * @param {Object} easingType The easing-type.\n * @param {function} [callback] An optional callback-function called when the animation is finished.\n */\n\n Component_Animator.prototype.maskIn = function(mask, duration, easing, callback) {\n this.object.addComponent(this.maskAnimation);\n this.maskAnimation.maskIn(mask, duration, easing, function(object, animation) {\n object.removeComponent(animation);\n return typeof callback === \"function\" ? callback(object) : void 0;\n });\n return this.maskAnimation;\n };\n\n\n /**\n * Description follows...\n *\n * @method maskTo\n * @param {gs.Mask} mask The mask used for the animation.\n * @param {number} duration The duration in frames.\n * @param {Object} easingType The easing-type.\n * @param {function} [callback] An optional callback-function called when the animation is finished.\n */\n\n Component_Animator.prototype.maskTo = function(mask, duration, easing, callback) {\n this.object.addComponent(this.maskAnimation);\n this.maskAnimation.maskTo(mask, duration, easing, function(object, animation) {\n object.removeComponent(animation);\n return typeof callback === \"function\" ? callback(object) : void 0;\n });\n return this.maskAnimation;\n };\n\n\n /**\n * Lets a game object disappear from screen using a masking-effect.\n *\n * @method maskOut\n * @param {gs.Mask} mask The mask used for the animation.\n * @param {number} duration The duration in frames.\n * @param {Object} easingType The easing-type.\n * @param {function} [callback] An optional callback-function called when the animation is finished.\n */\n\n Component_Animator.prototype.maskOut = function(mask, duration, easing, callback) {\n this.object.addComponent(this.maskAnimation);\n this.maskAnimation.maskOut(mask, duration, easing, function(object, animation) {\n object.removeComponent(animation);\n return typeof callback === \"function\" ? callback(object) : void 0;\n });\n return this.maskAnimation;\n };\n\n\n /**\n * Lets a game object appear on screen from left, top, right or bottom using \n * a move-animation\n *\n * @method moveIn\n * @param {number} x The x-coordinate of the target-position.\n * @param {number} y The y-coordinate of the target-position.\n * @param {number} type The movement-direction from where the game object should move-in.\n * @param {number} duration The duration in frames.\n * @param {Object} easingType The easing-type.\n * @param {function} [callback] An optional callback-function called when the animation is finished.\n */\n\n Component_Animator.prototype.moveIn = function(x, y, type, duration, easing, callback) {\n this.object.addComponent(this.moveAnimation);\n this.moveAnimation.moveIn(x, y, type, duration, easing, function(object, animation) {\n object.removeComponent(animation);\n return typeof callback === \"function\" ? callback(object) : void 0;\n });\n return this.moveAnimation;\n };\n\n\n /**\n * Lets a game object disappear from screen to the left, top, right or bottom using \n * a move-animation\n *\n * @method moveOut\n * @param {number} type The movement-direction in which the game object should move-out.\n * @param {number} duration The duration in frames.\n * @param {Object} easingType The easing-type.\n * @param {function} [callback] An optional callback-function called when the animation is finished.\n */\n\n Component_Animator.prototype.moveOut = function(type, duration, easing, callback) {\n this.object.addComponent(this.moveAnimation);\n this.moveAnimation.moveOut(type, duration, easing, function(object, animation) {\n object.removeComponent(animation);\n return typeof callback === \"function\" ? callback(object) : void 0;\n });\n return this.moveAnimation;\n };\n\n\n /**\n * Lets a game object appear on screen using blending.\n *\n * @method show\n * @param {number} duration The duration in frames.\n * @param {Object} easing The easing-type.\n * @param {function} [callback] An optional callback-function called when the animation is finished.\n */\n\n Component_Animator.prototype.show = function(duration, easing, callback) {\n var ref;\n this.object.opacity = 0;\n if ((ref = this.object.visual) != null) {\n ref.update();\n }\n return this.blendTo(255, duration, easing, callback);\n };\n\n\n /**\n * Lets a game object disappear from screen using blending.\n *\n * @method hide\n * @param {number} duration The duration in frames.\n * @param {Object} easing The easing-type.\n * @param {function} [callback] An optional callback-function called when the animation is finished.\n */\n\n Component_Animator.prototype.hide = function(duration, easing, callback) {\n return this.blendTo(0, duration, easing, callback);\n };\n\n\n /**\n * Changes visible-property to true. This method is deprecated.\n * \n * @method open\n * @deprecated\n */\n\n Component_Animator.prototype.open = function() {\n return this.object.visible = true;\n };\n\n\n /**\n * Changes visible-property to false. This method is deprecated.\n * \n * @method close\n * @deprecated\n */\n\n Component_Animator.prototype.close = function() {\n return this.object.visible = false;\n };\n\n\n /**\n * Flashes the game object.\n *\n * @method flash\n * @param {Color} color The flash-color.\n * @param {number} duration The duration in frames.\n */\n\n Component_Animator.prototype.flash = function(color, duration) {\n this.object.color = color;\n color = new Color(color);\n color.alpha = 0;\n return this.colorTo(color, duration, gs.Easings.EASE_LINEAR[gs.EasingTypes.EASE_IN]);\n };\n\n\n /**\n * Lets a game object appear on screen using a specified animation.\n *\n * @method appear\n * @param {number} x The x-coordinate of the target-position.\n * @param {number} y The y-coordinate of the target-position.\n * @param {gs.AppearAnimationInfo} animation The animation info-object.\n * @param {Object} easing The easing-type.\n * @param {number} duration The duration in frames.\n * @param {function} [callback] An optional callback-function called when the animation is finished.\n */\n\n Component_Animator.prototype.appear = function(x, y, animation, easing, duration, callback) {\n easing = easing || gs.Easings.EASE_LINEAR[gs.EasingTypes.EASE_IN];\n this.object.visible = true;\n if (animation.type === gs.AnimationTypes.MOVEMENT) {\n return this.moveIn(x, y, animation.movement, duration, easing, callback);\n } else if (animation.type === gs.AnimationTypes.MASKING) {\n return this.maskIn(animation.mask, duration, easing, callback);\n } else {\n return this.show(duration, easing, callback);\n }\n };\n\n\n /**\n * Lets a game object disappear from screen using a specified animation.\n *\n * @method disappear\n * @param {gs.AppearAnimationInfo} animation The animation info-object.\n * @param {Object} easing The easing-type.\n * @param {number} duration The duration in frames.\n * @param {function} [callback] An optional callback-function called when the animation is finished.\n */\n\n Component_Animator.prototype.disappear = function(animation, easing, duration, callback) {\n this.object.visible = true;\n if (animation.type === gs.AnimationTypes.MOVEMENT) {\n return this.moveOut(animation.movement, duration, easing, callback);\n } else if (animation.type === gs.AnimationTypes.MASKING) {\n return this.maskOut(animation.mask, duration, easing, callback);\n } else {\n return this.hide(duration, easing, callback);\n }\n };\n\n return Component_Animator;\n\n})(gs.Component);\n\ngs.Animator = Component_Animator;\n\ngs.Component_Animator = Component_Animator;\n\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQU9BLElBQUEsa0JBQUE7RUFBQTs7O0FBQU07Ozs7QUFDRjs7Ozs7Ozs7Ozs7O0VBV2EsNEJBQUE7SUFDVCxxREFBQSxTQUFBO0lBRUEsSUFBQyxDQUFBLGFBQUQsR0FBcUIsSUFBQSxFQUFFLENBQUMsdUJBQUgsQ0FBQTtJQUNyQixJQUFDLENBQUEsYUFBRCxHQUFxQixJQUFBLEVBQUUsQ0FBQyx1QkFBSCxDQUFBO0lBQ3JCLElBQUMsQ0FBQSxhQUFELEdBQXFCLElBQUEsRUFBRSxDQUFDLHVCQUFILENBQUE7SUFDckIsSUFBQyxDQUFBLGNBQUQsR0FBc0IsSUFBQSxFQUFFLENBQUMsd0JBQUgsQ0FBQTtJQUN0QixJQUFDLENBQUEsYUFBRCxHQUFxQixJQUFBLEVBQUUsQ0FBQyx1QkFBSCxDQUFBO0lBQ3JCLElBQUMsQ0FBQSxpQkFBRCxHQUF5QixJQUFBLEVBQUUsQ0FBQywyQkFBSCxDQUFBO0lBQ3pCLElBQUMsQ0FBQSxlQUFELEdBQXVCLElBQUEsRUFBRSxDQUFDLHlCQUFILENBQUE7SUFDdkIsSUFBQyxDQUFBLGNBQUQsR0FBc0IsSUFBQSxFQUFFLENBQUMsd0JBQUgsQ0FBQTtJQUN0QixJQUFDLENBQUEsY0FBRCxHQUFzQixJQUFBLEVBQUUsQ0FBQyx3QkFBSCxDQUFBO0lBQ3RCLElBQUMsQ0FBQSxjQUFELEdBQXNCLElBQUEsRUFBRSxDQUFDLHdCQUFILENBQUE7SUFDdEIsSUFBQyxDQUFBLGNBQUQsR0FBc0IsSUFBQSxFQUFFLENBQUMsd0JBQUgsQ0FBQTtJQUN0QixJQUFDLENBQUEsY0FBRCxHQUFzQixJQUFBLEVBQUUsQ0FBQyx3QkFBSCxDQUFBO0lBQ3RCLElBQUMsQ0FBQSxhQUFELEdBQXFCLElBQUEsRUFBRSxDQUFDLHVCQUFILENBQUE7SUFDckIsSUFBQyxDQUFBLGVBQUQsR0FBdUIsSUFBQSxFQUFFLENBQUMseUJBQUgsQ0FBQTtJQUN2QixJ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RUFBZ0IsTUFBaEIsRUFBd0IsUUFBeEIsRUFIQzs7RUFKRTs7OztHQW5pQmtCLEVBQUUsQ0FBQzs7QUE2aUJwQyxFQUFFLENBQUMsUUFBSCxHQUFjOztBQUNkLEVBQUUsQ0FBQyxrQkFBSCxHQUF3QiIsInNvdXJjZXNDb250ZW50IjpbIiMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuI1xuIyAgIFNjcmlwdDogQ29tcG9uZW50X0FuaW1hdG9yXG4jXG4jICAgJCRDT1BZUklHSFQkJFxuI1xuIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5jbGFzcyBDb21wb25lbnRfQW5pbWF0b3IgZXh0ZW5kcyBncy5Db21wb25lbnRcbiAgICAjIyMqXG4gICAgKiBBbiBhbmltYXRvci1jb21wb25lbnQgYWxsb3dzIHRvIGV4ZWN1dGUgZGlmZmVyZW50IGtpbmQgb2YgYW5pbWF0aW9ucyBcbiAgICAqIG9uIGEgZ2FtZSBvYmplY3QuIFRoZSBhbmltYXRpb25zIGFyZSB1c2luZyB0aGUgZ2FtZSBvYmplY3QncyBcbiAgICAqIGRzdFJlY3QgJiBvZmZzZXQtcHJvcGVydHkgdG8gZXhlY3V0ZS5cbiAgICAqXG4gICAgKiBAbW9kdWxlIGdzXG4gICAgKiBAY2xhc3MgQ29tcG9uZW50X0FuaW1hdG9yXG4gICAgKiBAZXh0ZW5kcyBncy5Db21wb25lbnRcbiAgICAqIEBtZW1iZXJvZiBnc1xuICAgICogQGNvbnN0cnVjdG9yXG4gICAgIyMjXG4gICAgY29uc3RydWN0b3I6IC0+XG4gICAgICAgIHN1cGVyXG4gICAgICAgIFxuICAgICAgICBAbW92ZUFuaW1hdGlvbiA9IG5ldyBncy5Db21wb25lbnRfTW92ZUFuaW1hdGlvbigpXG4gICAgICAgIEBwYXRoQW5pbWF0aW9uID0gbmV3IGdzLkNvbXBvbmVudF9QYXRoQW5pbWF0aW9uKClcbiAgICAgICAgQHpvb21BbmltYXRpb24gPSBuZXcgZ3MuQ29tcG9uZW50X1pvb21BbmltYXRpb24oKVxuICAgICAgICBAYmxlbmRBbmltYXRpb24gPSBuZXcgZ3MuQ29tcG9uZW50X0JsZW5kQW5pbWF0aW9uKClcbiAgICAgICAgQGJsdXJBbmltYXRpb24gPSBuZXcgZ3MuQ29tcG9uZW50X0JsdXJBbmltYXRpb24oKVxuICAgICAgICBAcGl4ZWxhdGVBbmltYXRpb24gPSBuZXcgZ3MuQ29tcG9uZW50X1BpeGVsYXRlQW5pbWF0aW9uKClcbiAgICAgICAgQHdvYmJsZUFuaW1hdGlvbiA9IG5ldyBncy5Db21wb25lbnRfV29iYmxlQW5pbWF0aW9uKClcbiAgICAgICAgQGNvbG9yQW5pbWF0aW9uID0gbmV3IGdzLkNvbXBvbmVudF9Db2xvckFuaW1hdGlvbigpXG4gICAgICAgIEBpbWFnZUFuaW1hdGlvbiA9IG5ldyBncy5Db21wb25lbnRfSW1hZ2VBbmltYXRpb24oKVxuICAgICAgICBAZnJhbWVBbmltYXRpb24gPSBuZXcgZ3MuQ29tcG9uZW50X0ZyYW1lQW5pbWF0aW9uKClcbiAgICAgICAgQGZpZWxkQW5pbWF0aW9uID0gbmV3IGdzLkNvbXBvbmVudF9GaWVsZEFuaW1hdGlvbigpXG4gICAgICAgIEBzaGFrZUFuaW1hdGlvbiA9IG5ldyBncy5Db21wb25lbnRfU2hha2VBbmltYXRpb24oKVxuICAgICAgICBAdGludEFuaW1hdGlvbiA9IG5ldyBncy5Db21wb25lbnRfVGludEFuaW1hdGlvbigpXG4gICAgICAgIEByb3RhdGVBbmltYXRpb24gPSBuZXcgZ3MuQ29tcG9uZW50X1JvdGF0ZUFuaW1hdGlvbigpXG4gICAgICAgIEBtYXNrQW5pbWF0aW9uID0gbmV3IGdzLkNvbXBvbmVudF9NYXNrQW5pbWF0aW9uKClcbiAgICAgICAgQGwyZEFuaW1hdGlvbiA9IG5ldyBncy5Db21wb25lbnRfTGl2ZTJEQW5pbWF0aW9uKClcbiAgICAgICAgXG4gICAgICAgICMjIypcbiAgICAgICAgKiBTdGFuZGFyZCBDYWxsYmFjayBSb3V0aW5lXG4gICAgICAgICogQHByb3BlcnR5IGNhbGxiYWNrXG4gICAgICAgICogQHR5cGUgZnVuY3Rpb25cbiAgICAgICAgKiBAcHJpdmF0ZVxuICAgICAgICAjIyNcbiAgICAgICAgQGNhbGxiYWNrID0gKG9iamVjdCwgYW5pbWF0aW9uKSAtPiBvYmplY3QucmVtb3ZlQ29tcG9uZW50KGFuaW1hdGlvbilcbiAgICAgICAgXG4gICAgICAgIEBvbkJsZW5kRmluaXNoID0gKG9iamVjdCwgYW5pbWF0aW9uLCBjYWxsYmFjaykgLT4gXG4gICAgICAgICAgICBvYmplY3QucmVtb3ZlQ29tcG9uZW50KGFuaW1hdGlvbilcbiAgICAgICAgICAgIGNhbGxiYWNrPyhvYmplY3QpXG4gICAgICAgIFxuICAgICAgICBcbiAgICBAYWNjZXNzb3JzIFwiaXNBbmltYXRpbmdcIiwgZ2V0OiAtPiBAb2JqZWN0XG4gICAgIyMjKlxuICAgICogVXBkYXRlcyB0aGUgYW5pbWF0b3IuXG4gICAgKlxuICAgICogQG1ldGhvZCB1cGRhdGVcbiAgICAjIyNcbiAgICB1cGRhdGU6IC0+XG4gICAgICAgIHN1cGVyXG4gICAgICAgIFxuICAgICAgICBpZiBAb2JqZWN0Lm1hc2s/LnNvdXJjZT8udmlkZW9FbGVtZW50P1xuICAgICAgICAgICAgQG9iamVjdC5tYXNrLnNvdXJjZS51cGRhdGUoKVxuICAgICAgICBcbiAgICAjIyMqXG4gICAgKiBNb3ZlcyB0aGUgZ2FtZSBvYmplY3Qgd2l0aCBhIHNwZWNpZmllZCBzcGVlZC5cbiAgICAqXG4gICAgKiBAbWV0aG9kIG1vdmVcbiAgICAqIEBwYXJhbSB7bnVtYmVyfSBzcGVlZFggVGhlIHNwZWVkIG9uIHgtYXhpcyBpbiBwaXhlbHMgcGVyIGZyYW1lLlxuICAgICogQHBhcmFtIHtudW1iZXJ9IHNwZWVkWSBUaGUgc3BlZWQgb24geS1heGlzIGluIHBpeGVscyBwZXIgZnJhbWUuXG4gICAgKiBAcGFyYW0ge251bWJlcn0gZHVyYXRpb24gVGhlIGR1cmF0aW9uIGluIGZyYW1lcy5cbiAgICAqIEBwYXJhbSB7T2JqZWN0fSBlYXNpbmdUeXBlIFRoZSBlYXNpbmctdHlwZSB1c2VkIGZvciB0aGUgYW5pbWF0aW9uLlxuICAgICMjI1xuICAgIG1vdmU6IChzcGVlZFgsIHNwZWVkWSwgZHVyYXRpb24sIGVhc2luZ1R5cGUpIC0+XG4gICAgICAgIEBvYmplY3QuYWRkQ29tcG9uZW50KEBtb3ZlQW5pbWF0aW9uKVxuICAgICAgICBAbW92ZUFuaW1hdGlvbi5tb3ZlKHNwZWVkWCwgc3BlZWRZLCBkdXJhdGlvbiwgZWFzaW5nVHlwZSwgQGNhbGxiYWNrKVxuICAgICAgICBcbiAgICAgICAgcmV0dXJuIEBtb3ZlQW5pbWF0aW9uXG4gICAgICAgIFxuICAgICMjIypcbiAgICAqIE1vdmVzIHRoZSBnYW1lIG9iamVjdCB0byBhIHNwZWNpZmllZCBwb3NpdGlvbi5cbiAgICAqXG4gICAgKiBAbWV0aG9kIG1vdmVUb1xuICAgICogQHBhcmFtIHtudW1iZXJ9IHggVGhlIHgtY29vcmRpbmF0ZSBvZiB0aGUgcG9zaXRpb24uXG4gICAgKiBAcGFyYW0ge251bWJlcn0geSBUaGUgeS1jb29yZGluYXRlIG9mIHRoZSBwb3NpdGlvbi5cbiAgICAqIEBwYXJhbSB7bnVtYmVyfSBkdXJhdGlvbiBUaGUgZHVyYXRpb24gaW4gZnJhbWVzLlxuICAgICogQHBhcmFtIHtPYmplY3R9IGVhc2luZ1R5cGUgVGhlIGVhc2luZy10eXBlLlxuICAgICMjIyAgXG4gICAgbW92ZVRvOiAoeCwgeSwgZHVyYXRpb24sIGVhc2luZ1R5cGUpIC0+XG4gICAgICAgIEBvYmplY3QuYWRkQ29tcG9uZW50KEBtb3ZlQW5pbWF0aW9uKVxuICAgICAgICBAbW92ZUFuaW1hdGlvbi5tb3ZlVG8oeCwgeSwgZHVyYXRpb24sIGVhc2luZ1R5cGUsIEBjYWxsYmFjaylcbiAgICAgICAgXG4gICAgICAgIHJldHVybiBAbW92ZUFuaW1hdGlvblxuICAgIFxuICAgICMjIypcbiAgICAqIE1vdmVzIHRoZSBnYW1lIG9iamVjdCBhbG9uZyBhIHBhdGguXG4gICAgKlxuICAgICogQG1ldGhvZCBtb3ZlUGF0aFxuICAgICogQHBhcmFtIHtPYmplY3R9IHBhdGggVGhlIHBhdGggdG8gZm9sbG93LlxuICAgICogQHBhcmFtIHtncy5BbmltYXRpb25Mb29wVHlwZX0gbG9vcFR5cGUgVGhlIGxvb3AtVHlwZS5cbiAgICAqIEBwYXJhbSB7bnVtYmVyfSBkdXJhdGlvbiBUaGUgZHVyYXRpb24gaW4gZnJhbWVzLlxuICAgICogQHBhcmFtIHtPYmplY3R9IGVhc2luZ1R5cGUgVGhlIGVhc2luZy10eXBlLlxuICAgICogQHBhcmFtIHtPYmplY3RbXX0gZWZmZWN0cyBPcHRpb25hbCBhcnJheSBvZiBlZmZlY3RzIGV4ZWN1dGVkIGR1cmluZyB0aGUgcGF0aC1tb3ZlbWVudCBsaWtlIHBsYXlpbmcgYSBzb3VuZC5cbiAgICAjIyMgIFxuICAgIG1vdmVQYXRoOiAocGF0aCwgbG9vcFR5cGUsIGR1cmF0aW9uLCBlYXNpbmdUeXBlLCBlZmZlY3RzKSAtPlxuICAgICAgICBjID0gQG9iamVjdC5maW5kQ29tcG9uZW50KFwiQ29tcG9uZW50X1BhdGhBbmltYXRpb25cIilcbiAgICAgICAgXG4gICAgICAgIGlmIGM/XG4gICAgICAgICAgICBjLmxvb3BUeXBlID0gbG9vcFR5cGVcbiAgICAgICAgZWxzZVxuICAgICAgICAgICAgQG9iamVjdC5hZGRDb21wb25lbnQoQHBhdGhBbmltYXRpb24pXG4gICAgICAgICAgICBAcGF0aEFuaW1hdGlvbi5zdGFydChwYXRoLCBsb29wVHlwZSwgZHVyYXRpb24sIGVhc2luZ1R5cGUsIGVmZmVjdHMsIEBjYWxsYmFjaylcbiAgICAgICAgICAgIFxuICAgICAgICByZXR1cm4gQHBhdGhBbmltYXRpb25cbiAgICBcbiAgICAjIyMqXG4gICAgKiBTY3JvbGxzIHRoZSBnYW1lIG9iamVjdCB3aXRoIGEgc3BlY2lmaWVkIHNwZWVkLlxuICAgICpcbiAgICAqIEBtZXRob2Qgc2Nyb2xsXG4gICAgKiBAcGFyYW0ge251bWJlcn0gc3BlZWRYIFRoZSBzcGVlZCBvbiB4LWF4aXMgaW4gcGl4ZWxzIHBlciBmcmFtZS5cbiAgICAqIEBwYXJhbSB7bnVtYmVyfSBzcGVlZFkgVGhlIHNwZWVkIG9uIHktYXhpcyBpbiBwaXhlbHMgcGVyIGZyYW1lLlxuICAgICogQHBhcmFtIHtudW1iZXJ9IGR1cmF0aW9uIFRoZSBkdXJhdGlvbiBpbiBmcmFtZXMuXG4gICAgKiBAcGFyYW0ge09iamVjdH0gZWFzaW5nVHlwZSBUaGUgZWFzaW5nLXR5cGUgdXNlZCBmb3IgdGhlIGFuaW1hdGlvbi5cbiAgICAjIyNcbiAgICBzY3JvbGw6IChzcGVlZFgsIHNwZWVkWSwgZHVyYXRpb24sIGVhc2luZ1R5cGUpIC0+XG4gICAgICAgIEBvYmplY3QuYWRkQ29tcG9uZW50KEBtb3ZlQW5pbWF0aW9uKVxuICAgICAgICBAbW92ZUFuaW1hdGlvbi5zY3JvbGwoc3BlZWRYLCBzcGVlZFksIGR1cmF0aW9uLCBlYXNpbmdUeXBlLCBAY2FsbGJhY2spXG4gICAgICAgIFxuICAgICAgICByZXR1cm4gQG1vdmVBbmltYXRpb25cbiAgICAgICAgXG4gICAgIyMjKlxuICAgICogU2Nyb2xscyB0aGUgZ2FtZSBvYmplY3QgdG8gYSBzcGVjaWZpZWQgcG9zaXRpb24uXG4gICAgKlxuICAgICogQG1ldGhvZCBzY3JvbGxUb1xuICAgICogQHBhcmFtIHtudW1iZXJ9IHggVGhlIHgtY29vcmRpbmF0ZSBvZiB0aGUgcG9zaXRpb24uXG4gICAgKiBAcGFyYW0ge251bWJlcn0geSBUaGUgeS1jb29yZGluYXRlIG9mIHRoZSBwb3NpdGlvbi5cbiAgICAqIEBwYXJhbSB7bnVtYmVyfSBkdXJhdGlvbiBUaGUgZHVyYXRpb24gaW4gZnJhbWVzLlxuICAgICogQHBhcmFtIHtPYmplY3R9IGVhc2luZ1R5cGUgVGhlIGVhc2luZy10eXBlLlxuICAgICMjIyAgXG4gICAgc2Nyb2xsVG86ICh4LCB5LCBkdXJhdGlvbiwgZWFzaW5nVHlwZSkgLT5cbiAgICAgICAgQG9iamVjdC5hZGRDb21wb25lbnQoQG1vdmVBbmltYXRpb24pXG4gICAgICAgIEBtb3ZlQW5pbWF0aW9uLnNjcm9sbFRvKHgsIHksIGR1cmF0aW9uLCBlYXNpbmdUeXBlLCBAY2FsbGJhY2spXG4gICAgICAgIFxuICAgICAgICByZXR1cm4gQG1vdmVBbmltYXRpb25cbiAgICAgICAgXG4gICAgIyMjKlxuICAgICogU2Nyb2xscyB0aGUgZ2FtZSBvYmplY3QgYWxvbmcgYSBwYXRoLlxuICAgICpcbiAgICAqIEBtZXRob2Qgc2Nyb2xsUGF0aFxuICAgICogQHBhcmFtIHtPYmplY3R9IHBhdGggVGhlIHBhdGggdG8gZm9sbG93LlxuICAgICogQHBhcmFtIHtncy5BbmltYXRpb25Mb29wVHlwZX0gbG9vcFR5cGUgVGhlIGxvb3AtVHlwZS5cbiAgICAqIEBwYXJhbSB7bnVtYmVyfSBkdXJhdGlvbiBUaGUgZHVyYXRpb24gaW4gZnJhbWVzLlxuICAgICogQHBhcmFtIHtPYmplY3R9IGVhc2luZ1R5cGUgVGhlIGVhc2luZy10eXBlLlxuICAgICMjIyAgXG4gICAgc2Nyb2xsUGF0aDogKHBhdGgsIGxvb3BUeXBlLCBkdXJhdGlvbiwgZWFzaW5nVHlwZSkgLT5cbiAgICAgICAgQG9iamVjdC5hZGRDb21wb25lbnQoQHBhdGhBbmltYXRpb24pXG4gICAgICAgIEBwYXRoQW5pbWF0aW9uLnNjcm9sbChwYXRoLCBsb29wVHlwZSwgZHVyYXRpb24sIGVhc2luZ1R5cGUsIEBjYWxsYmFjaylcbiAgICAgICAgXG4gICAgICAgIHJldHVybiBAcGF0aEFuaW1hdGlvblxuICAgIFxuICAgICAgICBcbiAgICAjIyMqXG4gICAgKiBab29tcyBhIGdhbWUgb2JqZWN0IHRvIHNwZWNpZmllZCBzaXplLlxuICAgICpcbiAgICAqIEBtZXRob2Qgem9vbVRvXG4gICAgKiBAcGFyYW0ge251bWJlcn0geCBUaGUgeC1heGlzIHpvb20tZmFjdG9yLlxuICAgICogQHBhcmFtIHtudW1iZXJ9IHkgVGhlIHktYXhpcyB6b29tLWZhY3Rvci5cbiAgICAqIEBwYXJhbSB7bnVtYmVyfSBkdXJhdGlvbiBUaGUgZHVyYXRpb24gaW4gZnJhbWVzLlxuICAgICogQHBhcmFtIHtPYmplY3R9IGVhc2luZ1R5cGUgVGhlIGVhc2luZy10eXBlLlxuICAgICMjIyAgICAgIFxuICAgIHpvb21UbzogKHgsIHksIGR1cmF0aW9uLCBlYXNpbmdUeXBlKSAtPlxuICAgICAgICBAb2JqZWN0LmFkZENvbXBvbmVudChAem9vbUFuaW1hdGlvbilcbiAgICAgICAgQHpvb21BbmltYXRpb24uc3RhcnQoeCwgeSwgZHVyYXRpb24sIGVhc2luZ1R5cGUsIEBjYWxsYmFjaylcbiAgICAgICAgXG4gICAgICAgIHJldHVybiBAem9vbUFuaW1hdGlvblxuICAgICAgICBcbiAgICBcbiAgICAjIyMqXG4gICAgKiBCbGVuZHMgYSBnYW1lIG9iamVjdCB0byBzcGVjaWZpZWQgb3BhY2l0eS5cbiAgICAqXG4gICAgKiBAbWV0aG9kIGJsZW5kVG9cbiAgICAqIEBwYXJhbSB7bnVtYmVyfSBvcGFjaXR5IFRoZSB0YXJnZXQgb3BhY2l0eS5cbiAgICAqIEBwYXJhbSB7bnVtYmVyfSBkdXJhdGlvbiBUaGUgZHVyYXRpb24gaW4gZnJhbWVzLlxuICAgICogQHBhcmFtIHtPYmplY3R9IGVhc2luZ1R5cGUgVGhlIGVhc2luZy10eXBlLlxuICAgICogQHBhcmFtIHtmdW5jdGlvbn0gW2NhbGxiYWNrXSBBbiBvcHRpb25hbCBjYWxsYmFjayBjYWxsZWQgaWYgYmxlbmRpbmcgaXMgZmluaXNoZWQuIFxuICAgICMjIyAgICBcbiAgICBibGVuZFRvOiAob3BhY2l0eSwgZHVyYXRpb24sIGVhc2luZ1R5cGUsIGNhbGxiYWNrKSAtPlxuICAgICAgICBAYmxlbmRBbmltYXRpb24uc3RvcCgpXG4gICAgICAgIEBvYmplY3QuYWRkQ29tcG9uZW50KEBibGVuZEFuaW1hdGlvbilcbiAgICAgICAgQGJsZW5kQW5pbWF0aW9uLnN0YXJ0KG9wYWNpdHksIGR1cmF0aW9uLCBlYXNpbmdUeXBlLCBncy5DYWxsQmFjayhcIm9uQmxlbmRGaW5pc2hcIiwgdGhpcywgY2FsbGJhY2spKSBcbiAgICAgICAgXG4gICAgICAgIHJldHVybiBAYmxlbmRBbmltYXRpb25cbiAgICAgXG4gICAgIyMjKlxuICAgICogQW5pbWF0ZXMgYSBMaXZlMkQgbW9kZWwgcGFyYW1ldGVyIG9mIGEgTGl2ZTJEIGdhbWUgb2JqZWN0IHRvIGEgc3BlY2lmaWVkIHZhbHVlLlxuICAgICpcbiAgICAqIEBtZXRob2QgYmxlbmRUb1xuICAgICogQHBhcmFtIHtzdHJpbmd9IHBhcmFtIFRoZSBuYW1lIG9mIHRoZSBwYXJhbWV0ZXIgdG8gYW5pbWF0ZS5cbiAgICAqIEBwYXJhbSB7bnVtYmVyfSB2YWx1ZSBUaGUgdGFyZ2V0IHZhbHVlLlxuICAgICogQHBhcmFtIHtudW1iZXJ9IGR1cmF0aW9uIFRoZSBkdXJhdGlvbiBpbiBmcmFtZXMuXG4gICAgKiBAcGFyYW0ge09iamVjdH0gZWFzaW5nVHlwZSBUaGUgZWFzaW5nLXR5cGUuXG4gICAgKiBAcGFyYW0ge2Z1bmN0aW9ufSBbY2FsbGJhY2tdIEFuIG9wdGlvbmFsIGNhbGxiYWNrIGNhbGxlZCBpZiBibGVuZGluZyBpcyBmaW5pc2hlZC4gXG4gICAgIyMjXG4gICAgbDJkUGFyYW1ldGVyVG86IChwYXJhbSwgdmFsdWUsIGR1cmF0aW9uLCBlYXNpbmdUeXBlLCBjYWxsYmFjaykgLT5cbiAgICAgICAgQG9iamVjdC5hZGRDb21wb25lbnQoQGwyZEFuaW1hdGlvbilcbiAgICAgICAgQGwyZEFuaW1hdGlvbi5zdGFydChwYXJhbSwgdmFsdWUsIGR1cmF0aW9uLCBlYXNpbmdUeXBlLCBncy5DYWxsQmFjayhcIm9uQmxlbmRGaW5pc2hcIiwgdGhpcywgY2FsbGJhY2spKSBcbiAgICAgICAgXG4gICAgICAgIHJldHVybiBAbDJkQW5pbWF0aW9uXG4gICAgICAgIFxuICAgICMjIypcbiAgICAqIEJsdXJzIGEgZ2FtZSBvYmplY3QgdG8gc3BlY2lmaWVkIGJsdXItcG93ZXIuXG4gICAgKlxuICAgICogQG1ldGhvZCBibHVyVG9cbiAgICAqIEBwYXJhbSB7bnVtYmVyfSBwb3dlciBUaGUgdGFyZ2V0IGJsdXItcG93ZXIuXG4gICAgKiBAcGFyYW0ge251bWJlcn0gZHVyYXRpb24gVGhlIGR1cmF0aW9uIGluIGZyYW1lcy5cbiAgICAqIEBwYXJhbSB7T2JqZWN0fSBlYXNpbmdUeXBlIFRoZSBlYXNpbmctdHlwZS5cbiAgICAjIyMgICAgIFxuICAgIGJsdXJUbzogKHBvd2VyLCBkdXJhdGlvbiwgZWFzaW5nVHlwZSkgLT5cbiAgICAgICAgQG9iamVjdC5hZGRDb21wb25lbnQoQGJsdXJBbmltYXRpb24pXG4gICAgICAgIEBibHVyQW5pbWF0aW9uLnN0YXJ0KHBvd2VyLCBkdXJhdGlvbiwgZWFzaW5nVHlwZSkgXG4gICAgICAgIFxuICAgICAgICByZXR1cm4gQGJsdXJBbmltYXRpb25cbiAgICAgICAgXG4gICAgIyMjKlxuICAgICogUGl4ZWxhdGVzIGEgZ2FtZSBvYmplY3QgdG8gc3BlY2lmaWVkIHBpeGVsLXNpemUvYmxvY2stc2l6ZVxuICAgICpcbiAgICAqIEBtZXRob2QgcGl4ZWxhdGVUb1xuICAgICogQHBhcmFtIHtudW1iZXJ9IHdpZHRoIC0gVGhlIHRhcmdldCBibG9jay13aWR0aFxuICAgICogQHBhcmFtIHtudW1iZXJ9IGhlaWdodCAtIFRoZSB0YXJnZXQgYmxvY2staGVpZ2h0XG4gICAgKiBAcGFyYW0ge251bWJlcn0gZHVyYXRpb24gVGhlIGR1cmF0aW9uIGluIGZyYW1lcy5cbiAgICAqIEBwYXJhbSB7T2JqZWN0fSBlYXNpbmdUeXBlIFRoZSBlYXNpbmctdHlwZS5cbiAgICAjIyMgICAgIFxuICAgIHBpeGVsYXRlVG86ICh3aWR0aCwgaGVpZ2h0LCBkdXJhdGlvbiwgZWFzaW5nVHlwZSkgLT5cbiAgICAgICAgQG9iamVjdC5hZGRDb21wb25lbnQoQHBpeGVsYXRlQW5pbWF0aW9uKVxuICAgICAgICBAcGl4ZWxhdGVBbmltYXRpb24uc3RhcnQod2lkdGgsIGhlaWdodCwgZHVyYXRpb24sIGVhc2luZ1R5cGUpIFxuICAgICAgICBcbiAgICAgICAgcmV0dXJuIEBwaXhlbGF0ZUFuaW1hdGlvblxuICAgICAgICBcbiAgICAjIyMqXG4gICAgKiBXb2JibGVzIGEgZ2FtZSBvYmplY3QgdG8gc3BlY2lmaWVkIHdvYmJsZS1wb3dlciBhbmQgd29iYmxlLXNwZWVkLlxuICAgICpcbiAgICAqIEBtZXRob2Qgd29iYmxlVG9cbiAgICAqIEBwYXJhbSB7bnVtYmVyfSBwb3dlciBUaGUgdGFyZ2V0IHdvYmJsZS1wb3dlci5cbiAgICAqIEBwYXJhbSB7bnVtYmVyfSBzcGVlZCBUaGUgdGFyZ2V0IHdvYmJsZS1zcGVlZC5cbiAgICAqIEBwYXJhbSB7bnVtYmVyfSBkdXJhdGlvbiBUaGUgZHVyYXRpb24gaW4gZnJhbWVzLlxuICAgICogQHBhcmFtIHtPYmplY3R9IGVhc2luZ1R5cGUgVGhlIGVhc2luZy10eXBlLlxuICAgICMjIyAgICAgXG4gICAgd29iYmxlVG86IChwb3dlciwgc3BlZWQsIGR1cmF0aW9uLCBlYXNpbmdUeXBlKSAtPlxuICAgICAgICBAb2JqZWN0LmFkZENvbXBvbmVudChAd29iYmxlQW5pbWF0aW9uKVxuICAgICAgICBAd29iYmxlQW5pbWF0aW9uLnN0YXJ0KHBvd2VyLCBzcGVlZCwgZHVyYXRpb24sIGVhc2luZ1R5cGUpIFxuICAgICAgICBcbiAgICAgICAgcmV0dXJuIEB3b2JibGVBbmltYXRpb25cbiAgICAgICAgXG4gICAgIyMjKlxuICAgICogQ29sb3JzIGEgZ2FtZSBvYmplY3QgdG8gYSBzcGVjaWZpZWQgdGFyZ2V0IGNvbG9yLlxuICAgICpcbiAgICAqIEBtZXRob2QgY29sb3JUb1xuICAgICogQHBhcmFtIHtDb2xvcn0gY29sb3IgVGhlIHRhcmdldCBjb2xvci5cbiAgICAqIEBwYXJhbSB7bnVtYmVyfSBkdXJhdGlvbiBUaGUgZHVyYXRpb24gaW4gZnJhbWVzLlxuICAgICogQHBhcmFtIHtPYmplY3R9IGVhc2luZ1R5cGUgVGhlIGVhc2luZy10eXBlLlxuICAgICMjIyAgXG4gICAgY29sb3JUbzogKGNvbG9yLCBkdXJhdGlvbiwgZWFzaW5nVHlwZSkgLT5cbiAgICAgICAgQG9iamVjdC5hZGRDb21wb25lbnQoQGNvbG9yQW5pbWF0aW9uKVxuICAgICAgICBAY29sb3JBbmltYXRpb24uc3RhcnQoY29sb3IsIGR1cmF0aW9uLCBlYXNpbmdUeXBlLCBAY2FsbGJhY2spXG4gICAgICAgIFxuICAgICAgICByZXR1cm4gQGNvbG9yQW5pbWF0aW9uXG4gICAgICAgIFxuICAgICMjIypcbiAgICAqIEFuIGltYWdlIGFuaW1hdGlvbiBydW5zIGZyb20gbGVmdCB0byByaWdodCB1c2luZyB0aGUgZ2FtZSBvYmplY3Qnc1xuICAgICogaW1hZ2UtcHJvcGVydHkuXG4gICAgKlxuICAgICogQG1ldGhvZCBjaGFuZ2VJbWFnZXNcbiAgICAqIEBwYXJhbSB7QXJyYXl9IGltYWdlcyBBbiBhcnJheSBvZiBpbWFnZSBuYW1lcy5cbiAgICAqIEBwYXJhbSB7bnVtYmVyfSBkdXJhdGlvbiBUaGUgZHVyYXRpb24gaW4gZnJhbWVzLlxuICAgICogQHBhcmFtIHtPYmplY3R9IGVhc2luZ1R5cGUgVGhlIGVhc2luZy10eXBlLlxuICAgICMjIyAgICAgIFxuICAgIGNoYW5nZUltYWdlczogKGltYWdlcywgZHVyYXRpb24sIGVhc2luZ1R5cGUpIC0+XG4gICAgICAgIEBvYmplY3QuYWRkQ29tcG9uZW50KEBpbWFnZUFuaW1hdGlvbilcbiAgICAgICAgQGltYWdlQW5pbWF0aW9uLnN0YXJ0KGltYWdlcywgZHVyYXRpb24sIGVhc2luZ1R5cGUsIEBjYWxsYmFjaylcbiAgICAgICAgXG4gICAgICAgIHJldHVybiBAaW1hZ2VBbmltYXRpb25cbiAgICAgICAgXG4gICAgIyMjKlxuICAgICogQSBmcmFtZSBhbmltYXRpb24gd2hpY2ggbW9kaWZpZXMgdGhlIGdhbWUgb2JqZWN0J3Mgc3JjUmVjdCBwcm9wZXJ0eVxuICAgICogYSBwbGF5IGFuIGFuaW1hdGlvbi5cbiAgICAqXG4gICAgKiBAbWV0aG9kIGNoYW5nZUZyYW1lc1xuICAgICogQHBhcmFtIHtncy5SZWN0W119IGZyYW1lcyBBbiBhcnJheSBvZiBzb3VyY2UgcmVjdGFuZ2xlcyAoZnJhbWVzKS5cbiAgICAqIEBwYXJhbSB7bnVtYmVyfSBkdXJhdGlvbiBUaGUgZHVyYXRpb24gaW4gZnJhbWVzLlxuICAgICogQHBhcmFtIHtPYmplY3R9IGVhc2luZ1R5cGUgVGhlIGVhc2luZy10eXBlLlxuICAgICMjIyAgICAgIFxuICAgICNjaGFuZ2VGcmFtZXM6IChmcmFtZXMsIGR1cmF0aW9uLCBlYXNpbmdUeXBlKSAtPlxuICAgICMgICAgYW5pbWF0aW9uID0gbmV3IGdzLkNvbXBvbmVudF9GcmFtZUFuaW1hdGlvbigpXG4gICAgIyAgICBAb2JqZWN0LmFkZENvbXBvbmVudChhbmltYXRpb24pXG4gICAgIyAgICBhbmltYXRpb24uc3RhcnQoZnJhbWVzLCBkdXJhdGlvbiwgZWFzaW5nVHlwZSwgQGNhbGxiYWNrKVxuICAgICAgIFxuICAgICMjIypcbiAgICAqIEEgZnJhbWUgYW5pbWF0aW9uIHdoaWNoIG1vZGlmaWVzIHRoZSBnYW1lIG9iamVjdCdzIHNyY1JlY3QgcHJvcGVydHlcbiAgICAqIGEgcGxheSBhbiBhbmltYXRpb24uXG4gICAgKlxuICAgICogQG1ldGhvZCBwbGF5QW5pbWF0aW9uXG4gICAgKiBAcGFyYW0ge2dzLlJlY3RbXX0gZnJhbWVzIEFuIGFycmF5IG9mIHNvdXJjZSByZWN0YW5nbGVzIChmcmFtZXMpLlxuICAgICogQHBhcmFtIHtudW1iZXJ9IGR1cmF0aW9uIFRoZSBkdXJhdGlvbiBpbiBmcmFtZXMuXG4gICAgKiBAcGFyYW0ge09iamVjdH0gZWFzaW5nVHlwZSBUaGUgZWFzaW5nLXR5cGUuXG4gICAgIyMjICAgICBcbiAgICBwbGF5QW5pbWF0aW9uOiAoYW5pbWF0aW9uUmVjb3JkKSAtPlxuICAgICAgICBAZnJhbWVBbmltYXRpb24ucmVmcmVzaChhbmltYXRpb25SZWNvcmQpXG4gICAgICAgIEBvYmplY3QuYWRkQ29tcG9uZW50KEBmcmFtZUFuaW1hdGlvbilcbiAgICAgICAgQGZyYW1lQW5pbWF0aW9uLnN0YXJ0KEBjYWxsYmFjaylcbiAgICAgICAgXG4gICAgICAgIHJldHVybiBAZnJhbWVBbmltYXRpb25cbiAgICAgICBcbiAgICAjIyMqXG4gICAgKiBDaGFuZ2VzIGEgZmllbGQgb2YgdGhlIGdhbWUgb2JqZWN0IHRvIGEgc3BlY2lmaWVkIHZhbHVlLlxuICAgICpcbiAgICAqIEBtZXRob2QgY2hhbmdlXG4gICAgKiBAcGFyYW0ge251bWJlcn0gVmFsdWUgVGhlIHRhcmdldCB2YWx1ZS5cbiAgICAqIEBwYXJhbSB7c3RyaW5nfSBmaWVsZCBUaGUgbmFtZSBvZiB0aGUgZmllbGQvcHJvcGVydHkuXG4gICAgKiBAcGFyYW0ge251bWJlcn0gZHVyYXRpb24gVGhlIGR1cmF0aW9uIGluIGZyYW1lcy5cbiAgICAqIEBwYXJhbSB7T2JqZWN0fSBlYXNpbmdUeXBlIFRoZSBlYXNpbmctdHlwZS5cbiAgICAjIyMgICBcbiAgICBjaGFuZ2U6ICh2YWx1ZSwgZmllbGQsIGR1cmF0aW9uLCBlYXNpbmdUeXBlKSAtPlxuICAgICAgICBAb2JqZWN0LmFkZENvbXBvbmVudChAZmllbGRBbmltYXRpb24pXG4gICAgICAgIEBmaWVsZEFuaW1hdGlvbi5zdGFydCh2YWx1ZSwgZmllbGQsIGR1cmF0aW9uLCBlYXNpbmdUeXBlLCBAY2FsbGJhY2spXG4gICAgICAgIFxuICAgICAgICByZXR1cm4gQGZpZWxkQW5pbWF0aW9uXG4gICAgICAgXG4gICAgIyMjKlxuICAgICogU2hha2VzIHRoZSBnYW1lIG9iamVjdCBob3Jpem9udGFsbHkgdXNpbmcgdGhlIGdhbWUgb2JqZWN0J3Mgb2Zmc2V0LXByb3BlcnR5LlxuICAgICpcbiAgICAqIEBtZXRob2Qgc2hha2VcbiAgICAqIEBwYXJhbSB7Z3MuUmFuZ2V9IHJhbmdlIFRoZSBob3Jpem9udGFsIHNoYWtlLXJhbmdlLlxuICAgICogQHBhcmFtIHtudW1iZXJ9IHNwZWVkIFRoZSBzaGFrZSBzcGVlZC5cbiAgICAqIEBwYXJhbSB7bnVtYmVyfSBkdXJhdGlvbiBUaGUgZHVyYXRpb24gaW4gZnJhbWVzLlxuICAgICogQHBhcmFtIHtPYmplY3R9IGVhc2luZ1R5cGUgVGhlIGVhc2luZy10eXBlLlxuICAgICMjIyBcbiAgICBzaGFrZTogKHJhbmdlLCBzcGVlZCwgZHVyYXRpb24sIGVhc2luZykgLT5cbiAgICAgICAgQG9iamVjdC5hZGRDb21wb25lbnQoQHNoYWtlQW5pbWF0aW9uKVxuICAgICAgICBAc2hha2VBbmltYXRpb24uc3RhcnQocmFuZ2UsIHNwZWVkLCBkdXJhdGlvbiwgZWFzaW5nLCBAY2FsbGJhY2spXG4gICAgICAgIFxuICAgICAgICByZXR1cm4gQHNoYWtlQW5pbWF0aW9uXG4gICAgICAgIFxuICAgICMjIypcbiAgICAqIFRpbnRzIHRoZSBnYW1lIG9iamVjdCB0byBhIHNwZWNpZmllZCB0b25lLlxuICAgICpcbiAgICAqIEBtZXRob2QgdGludFRvXG4gICAgKiBAcGFyYW0ge1RvbmV9IHRvbmUgVGhlIHRhcmdldCB0b25lLlxuICAgICogQHBhcmFtIHtudW1iZXJ9IGR1cmF0aW9uIFRoZSBkdXJhdGlvbiBpbiBmcmFtZXMuXG4gICAgKiBAcGFyYW0ge09iamVjdH0gZWFzaW5nVHlwZSBUaGUgZWFzaW5nLXR5cGUuXG4gICAgIyMjIFxuICAgIHRpbnRUbzogKHRvbmUsIGR1cmF0aW9uLCBlYXNpbmdUeXBlKSAtPlxuICAgICAgICBAb2JqZWN0LmFkZENvbXBvbmVudChAdGludEFuaW1hdGlvbilcbiAgICAgICAgQHRpbnRBbmltYXRpb24uc3RhcnQodG9uZSwgZHVyYXRpb24sIGVhc2luZ1R5cGUsIEBjYWxsYmFjaylcbiAgICAgICAgXG4gICAgICAgIHJldHVybiBAdGludEFuaW1hdGlvblxuICAgIFxuICAgICMjIypcbiAgICAqIFJvdGF0ZXMgdGhlIGdhbWUgb2JqZWN0IGFyb3VuZCBpdHMgYW5jaG9yLXBvaW50LlxuICAgICpcbiAgICAqIEBtZXRob2Qgcm90YXRlXG4gICAgKiBAcGFyYW0ge2dzLlJvdGF0aW9uRGlyZWN0aW9ufSBkaXJlY3Rpb24gVGhlIHJvdGF0aW9uLWRpcmVjdGlvbi5cbiAgICAqIEBwYXJhbSB7bnVtYmVyfSBzcGVlZCBUaGUgcm90YXRpb24gc3BlZWQgaW4gZGVncmVlcyBwZXIgZnJhbWUuXG4gICAgKiBAcGFyYW0ge251bWJlcn0gZHVyYXRpb24gVGhlIGR1cmF0aW9uIGluIGZyYW1lcy5cbiAgICAqIEBwYXJhbSB7T2JqZWN0fSBlYXNpbmdUeXBlIFRoZSBlYXNpbmctdHlwZS5cbiAgICAjIyMgXG4gICAgcm90YXRlOiAoZGlyZWN0aW9uLCBzcGVlZCwgZHVyYXRpb24sIGVhc2luZ1R5cGUpIC0+XG4gICAgICAgIEBvYmplY3QuYWRkQ29tcG9uZW50KEByb3RhdGVBbmltYXRpb24pXG4gICAgICAgIEByb3RhdGVBbmltYXRpb24ucm90YXRlKGRpcmVjdGlvbiwgc3BlZWQsIGR1cmF0aW9uLCBlYXNpbmdUeXBlLCBAY2FsbGJhY2spXG4gICAgICAgIFxuICAgICAgICByZXR1cm4gQHJvdGF0ZUFuaW1hdGlvblxuICAgIFxuICAgICMjIypcbiAgICAqIFJvdGF0ZXMgdGhlIGdhbWUgb2JqZWN0IGFyb3VuZCBpdHMgYW5jaG9yLXBvaW50IHRvIGEgc3BlY2lmaWVkIGFuZ2xlLlxuICAgICpcbiAgICAqIEBtZXRob2Qgcm90YXRlVG9cbiAgICAqIEBwYXJhbSB7bnVtYmVyfSBhbmdsZSBUaGUgdGFyZ2V0IGFuZ2xlLlxuICAgICogQHBhcmFtIHtudW1iZXJ9IGR1cmF0aW9uIFRoZSBkdXJhdGlvbiBpbiBmcmFtZXMuXG4gICAgKiBAcGFyYW0ge09iamVjdH0gZWFzaW5nVHlwZSBUaGUgZWFzaW5nLXR5cGUuXG4gICAgIyMjIFxuICAgIHJvdGF0ZVRvOiAoYW5nbGUsIGR1cmF0aW9uLCBlYXNpbmdUeXBlKSAtPlxuICAgICAgICBAb2JqZWN0LmFkZENvbXBvbmVudChAcm90YXRlQW5pbWF0aW9uKVxuICAgICAgICBAcm90YXRlQW5pbWF0aW9uLnJvdGF0ZVRvKGFuZ2xlLCBkdXJhdGlvbiwgZWFzaW5nVHlwZSwgQGNhbGxiYWNrKVxuICAgICAgICBcbiAgICAgICAgcmV0dXJuIEByb3RhdGVBbmltYXRpb25cbiAgICAgICAgXG4gICAgIyMjKlxuICAgICogTGV0cyBhIGdhbWUgb2JqZWN0IGFwcGVhciBvbiBzY3JlZW4gdXNpbmcgYSBtYXNraW5nLWVmZmVjdC5cbiAgICAqXG4gICAgKiBAbWV0aG9kIG1hc2tJblxuICAgICogQHBhcmFtIHtncy5NYXNrfSBtYXNrIFRoZSBtYXNrIHVzZWQgZm9yIHRoZSBhbmltYXRpb24uXG4gICAgKiBAcGFyYW0ge251bWJlcn0gZHVyYXRpb24gVGhlIGR1cmF0aW9uIGluIGZyYW1lcy5cbiAgICAqIEBwYXJhbSB7T2JqZWN0fSBlYXNpbmdUeXBlIFRoZSBlYXNpbmctdHlwZS5cbiAgICAqIEBwYXJhbSB7ZnVuY3Rpb259IFtjYWxsYmFja10gQW4gb3B0aW9uYWwgY2FsbGJhY2stZnVuY3Rpb24gY2FsbGVkIHdoZW4gdGhlIGFuaW1hdGlvbiBpcyBmaW5pc2hlZC4gXG4gICAgIyMjICAgICBcbiAgICBtYXNrSW46IChtYXNrLCBkdXJhdGlvbiwgZWFzaW5nLCBjYWxsYmFjaykgLT5cbiAgICAgICAgQG9iamVjdC5hZGRDb21wb25lbnQoQG1hc2tBbmltYXRpb24pXG4gICAgICAgIEBtYXNrQW5pbWF0aW9uLm1hc2tJbihtYXNrLCBkdXJhdGlvbiwgZWFzaW5nLCAob2JqZWN0LCBhbmltYXRpb24pIC0+IG9iamVjdC5yZW1vdmVDb21wb25lbnQoYW5pbWF0aW9uKTsgY2FsbGJhY2s/KG9iamVjdCk7KVxuICAgICAgICBcbiAgICAgICAgcmV0dXJuIEBtYXNrQW5pbWF0aW9uXG4gICAgIFxuICAgICMjIypcbiAgICAqIERlc2NyaXB0aW9uIGZvbGxvd3MuLi5cbiAgICAqXG4gICAgKiBAbWV0aG9kIG1hc2tUb1xuICAgICogQHBhcmFtIHtncy5NYXNrfSBtYXNrIFRoZSBtYXNrIHVzZWQgZm9yIHRoZSBhbmltYXRpb24uXG4gICAgKiBAcGFyYW0ge251bWJlcn0gZHVyYXRpb24gVGhlIGR1cmF0aW9uIGluIGZyYW1lcy5cbiAgICAqIEBwYXJhbSB7T2JqZWN0fSBlYXNpbmdUeXBlIFRoZSBlYXNpbmctdHlwZS5cbiAgICAqIEBwYXJhbSB7ZnVuY3Rpb259IFtjYWxsYmFja10gQW4gb3B0aW9uYWwgY2FsbGJhY2stZnVuY3Rpb24gY2FsbGVkIHdoZW4gdGhlIGFuaW1hdGlvbiBpcyBmaW5pc2hlZC4gXG4gICAgIyMjICAgICBcbiAgICBtYXNrVG86IChtYXNrLCBkdXJhdGlvbiwgZWFzaW5nLCBjYWxsYmFjaykgLT5cbiAgICAgICAgQG9iamVjdC5hZGRDb21wb25lbnQoQG1hc2tBbmltYXRpb24pXG4gICAgICAgIEBtYXNrQW5pbWF0aW9uLm1hc2tUbyhtYXNrLCBkdXJhdGlvbiwgZWFzaW5nLCAob2JqZWN0LCBhbmltYXRpb24pIC0+IG9iamVjdC5yZW1vdmVDb21wb25lbnQoYW5pbWF0aW9uKTsgY2FsbGJhY2s/KG9iamVjdCk7KVxuICAgICAgICBcbiAgICAgICAgcmV0dXJuIEBtYXNrQW5pbWF0aW9uXG4gICAgICAgIFxuICAgICMjIypcbiAgICAqIExldHMgYSBnYW1lIG9iamVjdCBkaXNhcHBlYXIgZnJvbSBzY3JlZW4gdXNpbmcgYSBtYXNraW5nLWVmZmVjdC5cbiAgICAqXG4gICAgKiBAbWV0aG9kIG1hc2tPdXRcbiAgICAqIEBwYXJhbSB7Z3MuTWFza30gbWFzayBUaGUgbWFzayB1c2VkIGZvciB0aGUgYW5pbWF0aW9uLlxuICAgICogQHBhcmFtIHtudW1iZXJ9IGR1cmF0aW9uIFRoZSBkdXJhdGlvbiBpbiBmcmFtZXMuXG4gICAgKiBAcGFyYW0ge09iamVjdH0gZWFzaW5nVHlwZSBUaGUgZWFzaW5nLXR5cGUuXG4gICAgKiBAcGFyYW0ge2Z1bmN0aW9ufSBbY2FsbGJhY2tdIEFuIG9wdGlvbmFsIGNhbGxiYWNrLWZ1bmN0aW9uIGNhbGxlZCB3aGVuIHRoZSBhbmltYXRpb24gaXMgZmluaXNoZWQuIFxuICAgICMjIyAgXG4gICAgbWFza091dDogKG1hc2ssIGR1cmF0aW9uLCBlYXNpbmcsIGNhbGxiYWNrKSAtPlxuICAgICAgICBAb2JqZWN0LmFkZENvbXBvbmVudChAbWFza0FuaW1hdGlvbilcbiAgICAgICAgQG1hc2tBbmltYXRpb24ubWFza091dChtYXNrLCBkdXJhdGlvbiwgZWFzaW5nLCAob2JqZWN0LCBhbmltYXRpb24pIC0+IG9iamVjdC5yZW1vdmVDb21wb25lbnQoYW5pbWF0aW9uKTsgY2FsbGJhY2s/KG9iamVjdCk7KVxuICAgICAgICBcbiAgICAgICAgcmV0dXJuIEBtYXNrQW5pbWF0aW9uXG5cbiAgICAjIyMqXG4gICAgKiBMZXRzIGEgZ2FtZSBvYmplY3QgYXBwZWFyIG9uIHNjcmVlbiBmcm9tIGxlZnQsIHRvcCwgcmlnaHQgb3IgYm90dG9tIHVzaW5nIFxuICAgICogYSBtb3ZlLWFuaW1hdGlvblxuICAgICpcbiAgICAqIEBtZXRob2QgbW92ZUluXG4gICAgKiBAcGFyYW0ge251bWJlcn0geCBUaGUgeC1jb29yZGluYXRlIG9mIHRoZSB0YXJnZXQtcG9zaXRpb24uXG4gICAgKiBAcGFyYW0ge251bWJlcn0geSBUaGUgeS1jb29yZGluYXRlIG9mIHRoZSB0YXJnZXQtcG9zaXRpb24uXG4gICAgKiBAcGFyYW0ge251bWJlcn0gdHlwZSBUaGUgbW92ZW1lbnQtZGlyZWN0aW9uIGZyb20gd2hlcmUgdGhlIGdhbWUgb2JqZWN0IHNob3VsZCBtb3ZlLWluLlxuICAgICogQHBhcmFtIHtudW1iZXJ9IGR1cmF0aW9uIFRoZSBkdXJhdGlvbiBpbiBmcmFtZXMuXG4gICAgKiBAcGFyYW0ge09iamVjdH0gZWFzaW5nVHlwZSBUaGUgZWFzaW5nLXR5cGUuXG4gICAgKiBAcGFyYW0ge2Z1bmN0aW9ufSBbY2FsbGJhY2tdIEFuIG9wdGlvbmFsIGNhbGxiYWNrLWZ1bmN0aW9uIGNhbGxlZCB3aGVuIHRoZSBhbmltYXRpb24gaXMgZmluaXNoZWQuIFxuICAgICMjIyAgXG4gICAgbW92ZUluOiAoeCwgeSwgdHlwZSwgZHVyYXRpb24sIGVhc2luZywgY2FsbGJhY2spIC0+XG4gICAgICAgIEBvYmplY3QuYWRkQ29tcG9uZW50KEBtb3ZlQW5pbWF0aW9uKVxuICAgICAgICBAbW92ZUFuaW1hdGlvbi5tb3ZlSW4oeCwgeSwgdHlwZSwgZHVyYXRpb24sIGVhc2luZywgKG9iamVjdCwgYW5pbWF0aW9uKSAtPiBcbiAgICAgICAgICAgIG9iamVjdC5yZW1vdmVDb21wb25lbnQoYW5pbWF0aW9uKVxuICAgICAgICAgICAgY2FsbGJhY2s/KG9iamVjdCkpXG4gICAgICAgIFxuICAgICAgICByZXR1cm4gQG1vdmVBbmltYXRpb25cbiAgICAgIFxuICAgICMjIypcbiAgICAqIExldHMgYSBnYW1lIG9iamVjdCBkaXNhcHBlYXIgZnJvbSBzY3JlZW4gdG8gdGhlIGxlZnQsIHRvcCwgcmlnaHQgb3IgYm90dG9tIHVzaW5nIFxuICAgICogYSBtb3ZlLWFuaW1hdGlvblxuICAgICpcbiAgICAqIEBtZXRob2QgbW92ZU91dFxuICAgICogQHBhcmFtIHtudW1iZXJ9IHR5cGUgVGhlIG1vdmVtZW50LWRpcmVjdGlvbiBpbiB3aGljaCB0aGUgZ2FtZSBvYmplY3Qgc2hvdWxkIG1vdmUtb3V0LlxuICAgICogQHBhcmFtIHtudW1iZXJ9IGR1cmF0aW9uIFRoZSBkdXJhdGlvbiBpbiBmcmFtZXMuXG4gICAgKiBAcGFyYW0ge09iamVjdH0gZWFzaW5nVHlwZSBUaGUgZWFzaW5nLXR5cGUuXG4gICAgKiBAcGFyYW0ge2Z1bmN0aW9ufSBbY2FsbGJhY2tdIEFuIG9wdGlvbmFsIGNhbGxiYWNrLWZ1bmN0aW9uIGNhbGxlZCB3aGVuIHRoZSBhbmltYXRpb24gaXMgZmluaXNoZWQuIFxuICAgICMjIyAgICBcbiAgICBtb3ZlT3V0OiAodHlwZSwgZHVyYXRpb24sIGVhc2luZywgY2FsbGJhY2spIC0+XG4gICAgICAgIEBvYmplY3QuYWRkQ29tcG9uZW50KEBtb3ZlQW5pbWF0aW9uKVxuICAgICAgICBAbW92ZUFuaW1hdGlvbi5tb3ZlT3V0KHR5cGUsIGR1cmF0aW9uLCBlYXNpbmcsIChvYmplY3QsIGFuaW1hdGlvbikgLT4gXG4gICAgICAgICAgICBvYmplY3QucmVtb3ZlQ29tcG9uZW50KGFuaW1hdGlvbilcbiAgICAgICAgICAgIGNhbGxiYWNrPyhvYmplY3QpXG4gICAgICAgIClcbiAgICAgICAgXG4gICAgICAgIHJldHVybiBAbW92ZUFuaW1hdGlvblxuICAgICAgICBcbiAgICAjIyMqXG4gICAgKiBMZXRzIGEgZ2FtZSBvYmplY3QgYXBwZWFyIG9uIHNjcmVlbiB1c2luZyBibGVuZGluZy5cbiAgICAqXG4gICAgKiBAbWV0aG9kIHNob3dcbiAgICAqIEBwYXJhbSB7bnVtYmVyfSBkdXJhdGlvbiBUaGUgZHVyYXRpb24gaW4gZnJhbWVzLlxuICAgICogQHBhcmFtIHtPYmplY3R9IGVhc2luZyBUaGUgZWFzaW5nLXR5cGUuXG4gICAgKiBAcGFyYW0ge2Z1bmN0aW9ufSBbY2FsbGJhY2tdIEFuIG9wdGlvbmFsIGNhbGxiYWNrLWZ1bmN0aW9uIGNhbGxlZCB3aGVuIHRoZSBhbmltYXRpb24gaXMgZmluaXNoZWQuIFxuICAgICMjIyAgXG4gICAgc2hvdzogKGR1cmF0aW9uLCBlYXNpbmcsIGNhbGxiYWNrKSAtPlxuICAgICAgICBAb2JqZWN0Lm9wYWNpdHkgPSAwXG4gICAgICAgIEBvYmplY3QudmlzdWFsPy51cGRhdGUoKVxuICAgICAgICBcbiAgICAgICAgcmV0dXJuIEBibGVuZFRvKDI1NSwgZHVyYXRpb24sIGVhc2luZywgY2FsbGJhY2spXG4gICAgIFxuICAgICMjIypcbiAgICAqIExldHMgYSBnYW1lIG9iamVjdCBkaXNhcHBlYXIgZnJvbSBzY3JlZW4gdXNpbmcgYmxlbmRpbmcuXG4gICAgKlxuICAgICogQG1ldGhvZCBoaWRlXG4gICAgKiBAcGFyYW0ge251bWJlcn0gZHVyYXRpb24gVGhlIGR1cmF0aW9uIGluIGZyYW1lcy5cbiAgICAqIEBwYXJhbSB7T2JqZWN0fSBlYXNpbmcgVGhlIGVhc2luZy10eXBlLlxuICAgICogQHBhcmFtIHtmdW5jdGlvbn0gW2NhbGxiYWNrXSBBbiBvcHRpb25hbCBjYWxsYmFjay1mdW5jdGlvbiBjYWxsZWQgd2hlbiB0aGUgYW5pbWF0aW9uIGlzIGZpbmlzaGVkLiBcbiAgICAjIyMgICAgIFxuICAgIGhpZGU6IChkdXJhdGlvbiwgZWFzaW5nLCBjYWxsYmFjaykgLT5cbiAgICAgICAgcmV0dXJuIEBibGVuZFRvKDAsIGR1cmF0aW9uLCBlYXNpbmcsIGNhbGxiYWNrKVxuICAgICAgIFxuICAgICMjIypcbiAgICAqIENoYW5nZXMgdmlzaWJsZS1wcm9wZXJ0eSB0byB0cnVlLiBUaGlzIG1ldGhvZCBpcyBkZXByZWNhdGVkLlxuICAgICogXG4gICAgKiBAbWV0aG9kIG9wZW5cbiAgICAqIEBkZXByZWNhdGVkXG4gICAgIyMjICAgXG4gICAgb3BlbjogLT4gQG9iamVjdC52aXNpYmxlID0geWVzXG4gICAgXG4gICAgIyMjKlxuICAgICogQ2hhbmdlcyB2aXNpYmxlLXByb3BlcnR5IHRvIGZhbHNlLiBUaGlzIG1ldGhvZCBpcyBkZXByZWNhdGVkLlxuICAgICogXG4gICAgKiBAbWV0aG9kIGNsb3NlXG4gICAgKiBAZGVwcmVjYXRlZFxuICAgICMjIyAgIFxuICAgIGNsb3NlOiAtPiBAb2JqZWN0LnZpc2libGUgPSBub1xuICAgIFxuICAgICMjIypcbiAgICAqIEZsYXNoZXMgdGhlIGdhbWUgb2JqZWN0LlxuICAgICpcbiAgICAqIEBtZXRob2QgZmxhc2hcbiAgICAqIEBwYXJhbSB7Q29sb3J9IGNvbG9yIFRoZSBmbGFzaC1jb2xvci5cbiAgICAqIEBwYXJhbSB7bnVtYmVyfSBkdXJhdGlvbiBUaGUgZHVyYXRpb24gaW4gZnJhbWVzLlxuICAgICMjI1xuICAgIGZsYXNoOiAoY29sb3IsIGR1cmF0aW9uKSAtPlxuICAgICAgICBAb2JqZWN0LmNvbG9yID0gY29sb3JcbiAgICAgICAgY29sb3IgPSBuZXcgQ29sb3IoY29sb3IpXG4gICAgICAgIGNvbG9yLmFscGhhID0gMFxuICAgICAgICByZXR1cm4gQGNvbG9yVG8oY29sb3IsIGR1cmF0aW9uLCBncy5FYXNpbmdzLkVBU0VfTElORUFSW2dzLkVhc2luZ1R5cGVzLkVBU0VfSU5dKVxuICAgIFxuICAgICMjIypcbiAgICAqIExldHMgYSBnYW1lIG9iamVjdCBhcHBlYXIgb24gc2NyZWVuIHVzaW5nIGEgc3BlY2lmaWVkIGFuaW1hdGlvbi5cbiAgICAqXG4gICAgKiBAbWV0aG9kIGFwcGVhclxuICAgICogQHBhcmFtIHtudW1iZXJ9IHggVGhlIHgtY29vcmRpbmF0ZSBvZiB0aGUgdGFyZ2V0LXBvc2l0aW9uLlxuICAgICogQHBhcmFtIHtudW1iZXJ9IHkgVGhlIHktY29vcmRpbmF0ZSBvZiB0aGUgdGFyZ2V0LXBvc2l0aW9uLlxuICAgICogQHBhcmFtIHtncy5BcHBlYXJBbmltYXRpb25JbmZvfSBhbmltYXRpb24gVGhlIGFuaW1hdGlvbiBpbmZvLW9iamVjdC5cbiAgICAqIEBwYXJhbSB7T2JqZWN0fSBlYXNpbmcgVGhlIGVhc2luZy10eXBlLlxuICAgICogQHBhcmFtIHtudW1iZXJ9IGR1cmF0aW9uIFRoZSBkdXJhdGlvbiBpbiBmcmFtZXMuXG4gICAgKiBAcGFyYW0ge2Z1bmN0aW9ufSBbY2FsbGJhY2tdIEFuIG9wdGlvbmFsIGNhbGxiYWNrLWZ1bmN0aW9uIGNhbGxlZCB3aGVuIHRoZSBhbmltYXRpb24gaXMgZmluaXNoZWQuIFxuICAgICMjIyAgICAgIFxuICAgIGFwcGVhcjogKHgsIHksIGFuaW1hdGlvbiwgZWFzaW5nLCBkdXJhdGlvbiwgY2FsbGJhY2spIC0+XG4gICAgICAgIGVhc2luZyA9IGVhc2luZyB8fCBncy5FYXNpbmdzLkVBU0VfTElORUFSW2dzLkVhc2luZ1R5cGVzLkVBU0VfSU5dXG4gICAgICAgIEBvYmplY3QudmlzaWJsZSA9IHllc1xuXG4gICAgICAgIGlmIGFuaW1hdGlvbi50eXBlID09IGdzLkFuaW1hdGlvblR5cGVzLk1PVkVNRU5UXG4gICAgICAgICAgICBAbW92ZUluKHgsIHksIGFuaW1hdGlvbi5tb3ZlbWVudCwgZHVyYXRpb24sIGVhc2luZywgY2FsbGJhY2spXG4gICAgICAgIGVsc2UgaWYgYW5pbWF0aW9uLnR5cGUgPT0gZ3MuQW5pbWF0aW9uVHlwZXMuTUFTS0lOR1xuICAgICAgICAgICAgQG1hc2tJbihhbmltYXRpb24ubWFzaywgZHVyYXRpb24sIGVhc2luZywgY2FsbGJhY2spXG4gICAgICAgIGVsc2VcbiAgICAgICAgICAgIEBzaG93KGR1cmF0aW9uLCBlYXNpbmcsIGNhbGxiYWNrKVxuICAgIFxuICAgICMjIypcbiAgICAqIExldHMgYSBnYW1lIG9iamVjdCBkaXNhcHBlYXIgZnJvbSBzY3JlZW4gdXNpbmcgYSBzcGVjaWZpZWQgYW5pbWF0aW9uLlxuICAgICpcbiAgICAqIEBtZXRob2QgZGlzYXBwZWFyXG4gICAgKiBAcGFyYW0ge2dzLkFwcGVhckFuaW1hdGlvbkluZm99IGFuaW1hdGlvbiBUaGUgYW5pbWF0aW9uIGluZm8tb2JqZWN0LlxuICAgICogQHBhcmFtIHtPYmplY3R9IGVhc2luZyBUaGUgZWFzaW5nLXR5cGUuXG4gICAgKiBAcGFyYW0ge251bWJlcn0gZHVyYXRpb24gVGhlIGR1cmF0aW9uIGluIGZyYW1lcy5cbiAgICAqIEBwYXJhbSB7ZnVuY3Rpb259IFtjYWxsYmFja10gQW4gb3B0aW9uYWwgY2FsbGJhY2stZnVuY3Rpb24gY2FsbGVkIHdoZW4gdGhlIGFuaW1hdGlvbiBpcyBmaW5pc2hlZC4gXG4gICAgIyMjICAgICAgIFxuICAgIGRpc2FwcGVhcjogKGFuaW1hdGlvbiwgZWFzaW5nLCBkdXJhdGlvbiwgY2FsbGJhY2spIC0+XG4gICAgICAgIEBvYmplY3QudmlzaWJsZSA9IHllc1xuICAgICAgICBpZiBhbmltYXRpb24udHlwZSA9PSBncy5BbmltYXRpb25UeXBlcy5NT1ZFTUVOVFxuICAgICAgICAgICAgQG1vdmVPdXQoYW5pbWF0aW9uLm1vdmVtZW50LCBkdXJhdGlvbiwgZWFzaW5nLCBjYWxsYmFjaylcbiAgICAgICAgZWxzZSBpZiBhbmltYXRpb24udHlwZSA9PSBncy5BbmltYXRpb25UeXBlcy5NQVNLSU5HXG4gICAgICAgICAgICBAbWFza091dChhbmltYXRpb24ubWFzaywgZHVyYXRpb24sIGVhc2luZywgY2FsbGJhY2spXG4gICAgICAgIGVsc2VcbiAgICAgICAgICAgIEBoaWRlKGR1cmF0aW9uLCBlYXNpbmcsIGNhbGxiYWNrKVxuICAgICAgICBcblxuZ3MuQW5pbWF0b3IgPSBDb21wb25lbnRfQW5pbWF0b3JcbmdzLkNvbXBvbmVudF9BbmltYXRvciA9IENvbXBvbmVudF9BbmltYXRvciJdfQ==\n//# sourceURL=Component_Animator_139.js"
13 13 },
14 14 "summary": [
15 15 "name",