[
  {
    "path": ".gitignore",
    "content": "# OS X files\n.DS_Store\n\n# Node.js files\nnode_modules\n"
  },
  {
    "path": "README.md",
    "content": "# Netscope CNN Analyzer\n\navailable here: http://dgschwend.github.io/netscope \n\nThis is a CNN Analyzer tool, based on Netscope by [ethereon](https://github.com/ethereon).\nNetscope is a web-based tool for visualizing neural network topologies. It currently supports UC Berkeley's [Caffe framework](https://github.com/bvlc/caffe).\n\nThis fork adds analysis capabilities, enabling the computation of network complexity (number of operations) and network size (number of parameters) for easy comparison of different networks.\n\n### Documentation\n- Netscope [Quick Start Guide](http://dgschwend.github.io/netscope/quickstart.html)\n\n### Demo\n- :new: [Visualization of ZynqNet CNN](http://dgschwend.github.io/netscope/#/preset/zynqnet)\n- [Visualization of the Deep Convolutional Neural Network \"SqueezeNet\"](http://dgschwend.github.io/netscope/#/preset/squeezenet)\n\n### License\n\nReleased under the MIT license.\nAll included network models provided under their respective licenses.\n"
  },
  {
    "path": "assets/css/codemirror.css",
    "content": "/* BASICS */\n\n.CodeMirror {\n  /* Set height, width, borders, and global font properties here */\n  font-family: monospace;\n  height: 300px;\n  color: black;\n}\n\n/* PADDING */\n\n.CodeMirror-lines {\n  padding: 4px 0; /* Vertical padding around content */\n}\n.CodeMirror pre {\n  padding: 0 4px; /* Horizontal padding of content */\n}\n\n.CodeMirror-scrollbar-filler, .CodeMirror-gutter-filler {\n  background-color: white; /* The little square between H and V scrollbars */\n}\n\n/* GUTTER */\n\n.CodeMirror-gutters {\n  border-right: 1px solid #ddd;\n  background-color: #f7f7f7;\n  white-space: nowrap;\n}\n.CodeMirror-linenumbers {}\n.CodeMirror-linenumber {\n  padding: 0 3px 0 5px;\n  min-width: 20px;\n  text-align: right;\n  color: #999;\n  white-space: nowrap;\n}\n\n.CodeMirror-guttermarker { color: black; }\n.CodeMirror-guttermarker-subtle { color: #999; }\n\n/* CURSOR */\n\n.CodeMirror div.CodeMirror-cursor {\n  border-left: 1px solid black;\n}\n/* Shown when moving in bi-directional text */\n.CodeMirror div.CodeMirror-secondarycursor {\n  border-left: 1px solid silver;\n}\n.CodeMirror.cm-fat-cursor div.CodeMirror-cursor {\n  width: auto;\n  border: 0;\n  background: #7e7;\n}\n.CodeMirror.cm-fat-cursor div.CodeMirror-cursors {\n  z-index: 1;\n}\n\n.cm-animate-fat-cursor {\n  width: auto;\n  border: 0;\n  -webkit-animation: blink 1.06s steps(1) infinite;\n  -moz-animation: blink 1.06s steps(1) infinite;\n  animation: blink 1.06s steps(1) infinite;\n  background-color: #7e7;\n}\n@-moz-keyframes blink {\n  0% {}\n  50% { background-color: transparent; }\n  100% {}\n}\n@-webkit-keyframes blink {\n  0% {}\n  50% { background-color: transparent; }\n  100% {}\n}\n@keyframes blink {\n  0% {}\n  50% { background-color: transparent; }\n  100% {}\n}\n\n/* Can style cursor different in overwrite (non-insert) mode */\ndiv.CodeMirror-overwrite div.CodeMirror-cursor {}\n\n.cm-tab { display: inline-block; text-decoration: inherit; }\n\n.CodeMirror-ruler {\n  border-left: 1px solid #ccc;\n  position: absolute;\n}\n\n/* DEFAULT THEME */\n\n.CodeMirror .CodeMirror-scroll {\n    background-color: #2c2c2c;\n    color: #E6E1DC;\n}\n\n.CodeMirror .CodeMirror-gutters {\n    background-color: #3B3B3B;\n    border-right: none;\n}\n\n.CodeMirror-focused .CodeMirror-activeline-background {\n    background: #232323 !important;\n}\n\n.show-line-padding .CodeMirror-focused .CodeMirror-activeline-background {\n    box-shadow: inset 15px 0 0 0 #000;\n}\n\n.CodeMirror-focused .CodeMirror-activeline .CodeMirror-gutter-elt {\n        background: #232323;\n        color: #fff;\n}\n\n.CodeMirror-focused .CodeMirror-activeline .inline-widget .CodeMirror-gutter-elt {\n        color: #787878;\n}\n\n.CodeMirror.find-highlighting div.CodeMirror-selected,\n.CodeMirror .CodeMirror.find-highlighting div.CodeMirror-selected {\n    background: red;\n}\n\n.CodeMirror-cursor {\n    border-left: 1px solid #c5c8c6 !important;\n}\n\n.CodeMirror-overwrite .CodeMirror-cursor {\n    border-left: none !important;\n    border-bottom: 1px solid #c5c8c6;\n}\n\n.CodeMirror-focused .CodeMirror-activeline .CodeMirror-gutter-elt {\n    color: #fff;\n}\n\n.CodeMirror .CodeMirror-selected {\n    background: #333333;\n}\n.CodeMirror-focused .CodeMirror-selected {\n    background: #3c3c3c;\n}\n\n.CodeMirror-matchingbracket, .CodeMirror-matchingtag {\n    /* Ensure visibility against gray inline editor background */\n    background-color: #000000;\n    color: #8bff04 !important;\n}\n\n.cm-atom { color: #E0E2E4; }\n.cm-qualifier { color: #FFC66D; }\n.cm-def { color: #D1E0DD; }\n.cm-keyword { color: #EE786E; }\n.cm-comment { color: #9D9B96; }\n.cm-string {color: #CA99C2;}\n.cm-string-2 {color: #A5C261;}\n.cm-variable { color: #D0D0FF; }\n.cm-variable-2 { color: #D0D0FF; }\n.cm-variable-3 { color: #D0D0FF; }\n.cm-tag { color: #E8BF6A; }\n.cm-attribute { color: #FFC66D; }\n.cm-property { color: #6E9CBE; }\n.cm-number {color: #FDCD50; }\n.cm-meta {color: #FFC66D; }\n.cm-operator {color: #CC7833; }\n.cm-builtin { color: #CC7833; }\n.cm-hr { color: #A5C261; }\n.cm-plus { color: #FFC66D; }\n.cm-bracket { color: #9D9B96; }\n.cm-error { color: #bc322f; }\n.cm-minus { color: #bc322f; }\n.cm-quote { color: #CA99C2; }\n\n/* Non-editor styling */\n\n#image-holder,\n#not-editor {\n    background-color: #2c2c2c;\n}\n\n#image-holder {\n    color: #E6E1DC;\n}\n\n\n.CodeMirror-composing { border-bottom: 2px solid; }\n\n/* Default styles for common addons */\n\ndiv.CodeMirror span.CodeMirror-matchingbracket {color: #0f0;}\ndiv.CodeMirror span.CodeMirror-nonmatchingbracket {color: #f22;}\n.CodeMirror-matchingtag { background: rgba(255, 150, 0, .3); }\n.CodeMirror-activeline-background {background: #e8f2ff;}\n\n/* STOP */\n\n/* The rest of this file contains styles related to the mechanics of\n   the editor. You probably shouldn't touch them. */\n\n.CodeMirror {\n  position: relative;\n  overflow: hidden;\n  background: white;\n}\n\n.CodeMirror-scroll {\n  overflow: scroll !important; /* Things will break if this is overridden */\n  /* 30px is the magic margin used to hide the element's real scrollbars */\n  /* See overflow: hidden in .CodeMirror */\n  margin-bottom: -30px; margin-right: -30px;\n  padding-bottom: 30px;\n  height: 100%;\n  outline: none; /* Prevent dragging from highlighting the element */\n  position: relative;\n}\n.CodeMirror-sizer {\n  position: relative;\n  border-right: 30px solid transparent;\n}\n\n/* The fake, visible scrollbars. Used to force redraw during scrolling\n   before actuall scrolling happens, thus preventing shaking and\n   flickering artifacts. */\n.CodeMirror-vscrollbar, .CodeMirror-hscrollbar, .CodeMirror-scrollbar-filler, .CodeMirror-gutter-filler {\n  position: absolute;\n  z-index: 6;\n  display: none;\n}\n.CodeMirror-vscrollbar {\n  right: 0; top: 0;\n  overflow-x: hidden;\n  overflow-y: scroll;\n}\n.CodeMirror-hscrollbar {\n  bottom: 0; left: 0;\n  overflow-y: hidden;\n  overflow-x: scroll;\n}\n.CodeMirror-scrollbar-filler {\n  right: 0; bottom: 0;\n}\n.CodeMirror-gutter-filler {\n  left: 0; bottom: 0;\n}\n\n.CodeMirror-gutters {\n  position: absolute; left: 0; top: 0;\n  z-index: 3;\n}\n.CodeMirror-gutter {\n  white-space: normal;\n  height: 100%;\n  display: inline-block;\n  margin-bottom: -30px;\n  /* Hack to make IE7 behave */\n  *zoom:1;\n  *display:inline;\n}\n.CodeMirror-gutter-wrapper {\n  position: absolute;\n  z-index: 4;\n  background: none !important;\n  border: none !important;\n}\n.CodeMirror-gutter-background {\n  position: absolute;\n  top: 0; bottom: 0;\n  z-index: 4;\n}\n.CodeMirror-gutter-elt {\n  position: absolute;\n  cursor: default;\n  z-index: 4;\n}\n.CodeMirror-gutter-wrapper {\n  -webkit-user-select: none;\n  -moz-user-select: none;\n  user-select: none;\n}\n\n.CodeMirror-lines {\n  cursor: text;\n  min-height: 1px; /* prevents collapsing before first draw */\n}\n.CodeMirror pre {\n  /* Reset some styles that the rest of the page might have set */\n  -moz-border-radius: 0; -webkit-border-radius: 0; border-radius: 0;\n  border-width: 0;\n  background: transparent;\n  font-family: inherit;\n  font-size: inherit;\n  margin: 0;\n  white-space: pre;\n  word-wrap: normal;\n  line-height: inherit;\n  color: inherit;\n  z-index: 2;\n  position: relative;\n  overflow: visible;\n  -webkit-tap-highlight-color: transparent;\n}\n.CodeMirror-wrap pre {\n  word-wrap: break-word;\n  white-space: pre-wrap;\n  word-break: normal;\n}\n\n.CodeMirror-linebackground {\n  position: absolute;\n  left: 0; right: 0; top: 0; bottom: 0;\n  z-index: 0;\n}\n\n.CodeMirror-linewidget {\n  position: relative;\n  z-index: 2;\n  overflow: auto;\n}\n\n.CodeMirror-widget {}\n\n.CodeMirror-code {\n  outline: none;\n}\n\n/* Force content-box sizing for the elements where we expect it */\n.CodeMirror-scroll,\n.CodeMirror-sizer,\n.CodeMirror-gutter,\n.CodeMirror-gutters,\n.CodeMirror-linenumber {\n  -moz-box-sizing: content-box;\n  box-sizing: content-box;\n}\n\n.CodeMirror-measure {\n  position: absolute;\n  width: 100%;\n  height: 0;\n  overflow: hidden;\n  visibility: hidden;\n}\n.CodeMirror-measure pre { position: static; }\n\n.CodeMirror div.CodeMirror-cursor {\n  position: absolute;\n  border-right: none;\n  width: 0;\n}\n\ndiv.CodeMirror-cursors {\n  visibility: hidden;\n  position: relative;\n  z-index: 3;\n}\n.CodeMirror-focused div.CodeMirror-cursors {\n  visibility: visible;\n}\n\n.CodeMirror-selected { background: #d9d9d9; }\n.CodeMirror-focused .CodeMirror-selected { background: #d7d4f0; }\n.CodeMirror-crosshair { cursor: crosshair; }\n.CodeMirror-line::selection, .CodeMirror-line > span::selection, .CodeMirror-line > span > span::selection { background: #d7d4f0; }\n.CodeMirror-line::-moz-selection, .CodeMirror-line > span::-moz-selection, .CodeMirror-line > span > span::-moz-selection { background: #d7d4f0; }\n\n.cm-searching {\n  background: #ffa;\n  background: rgba(255, 255, 0, .4);\n}\n\n/* IE7 hack to prevent it from returning funny offsetTops on the spans */\n.CodeMirror span { *vertical-align: text-bottom; }\n\n/* Used to force a border model for a node */\n.cm-force-border { padding-right: .1px; }\n\n@media print {\n  /* Hide the cursor when printing */\n  .CodeMirror div.CodeMirror-cursors {\n    visibility: hidden;\n  }\n}\n\n/* See issue #2901 */\n.cm-tab-wrap-hack:after { content: ''; }\n\n/* Help users use markselection to safely style text background */\nspan.CodeMirror-selectedtext { background: none; }\n"
  },
  {
    "path": "assets/css/doc.css",
    "content": "* { box-sizing: border-box; }\n\nhtml, body {\n    font-family: \"Roboto\", \"Helvetica Neue\", Helvetica, Arial, sans-serf;\n    background-color: #F7EBE1;\n    margin:0;\n    padding:0;\n}\n\nh1, h2, h3 {\n    color: #554037;\n    font-weight: 300;\n}\n\n.container {\n    width: 650px;\n    margin:25px auto 50px auto;\n    color: #87746C;\n    line-height: 1.5em;\n    text-rendering: optimizelegibility;\n    letter-spacing: 0.01rem;\n}\n\n.container a {\n    color: #804A3A;\n    text-decoration: none;\n}\n\n.container a:hover {\n    color: #B13254;\n}\n\ncode, .code-box {\n    font-family: Menlo,Monaco,Consolas,\"Courier New\",monospace;\n}\n\ncode {\n    padding: 2px 4px;\n    font-size: 90%;\n    color: #654D37;\n    background-color: #DBC8B8;\n    border-radius: 4px;\n}\n\n.code-box {\n    padding: 9px 14px;\n    margin-bottom: 14px;\n    color: #654D37;\n    background-color: #F2E5DA;\n    border: 1px solid #B39A8F;\n    border-radius: 4px;\n}\n\n.code-box .highlight {\n    color: #B13254;\n}\n\n.btn {\n    display: inline-block;\n    padding: 6px 12px;\n    margin-bottom: 0px;\n    font-size: 14px;\n    font-weight: 400;\n    line-height: 1.42857;\n    text-align: center;\n    white-space: nowrap;\n    vertical-align: middle;\n    cursor: pointer;\n    -moz-user-select: none;\n    background-image: none;\n    border: 1px solid #B39A8F;\n    border-radius: 4px;\n}\n\n.btn:hover {\n    border: 1px solid transparent;\n    background-color: #B13254;\n    color: #FFF !important;\n}\n\n.preset {\n    margin-bottom: 15px;\n}"
  },
  {
    "path": "assets/css/netscope.css",
    "content": "* { box-sizing: border-box; }\n\nhtml, body {\n    font-family: \"Roboto\", \"Helvetica Neue\", Helvetica, Arial, sans-serf;\n    background-color: #F7EBE1;\n    margin:0;\n    padding:0;\n    height: 100%;\n}\n\nh1, h2, h3 {\n    color: #554037;\n    font-weight: 300;\n}\n/* Layout */\n\n#master-container {\n    /*overflow: hidden;\n    height: 100%;\n    width: 100%;*/\n}\n\n#net-column {\n    width: 100%;\n}\n\n.column {\n    float: left;\n    width: 30%;\n    height: 100%;\n    overflow: scroll;\n}\n\n/* Editor */\n\n.CodeMirror {\n    height: 100% !important;\n    font-family: Menlo,Monaco,Consolas,\"Courier New\",monospace;\n    font-size: 14px;\n}\n\n/* NetScope Viewer */\n\n#net-spinner {\n    padding: 50px;\n    text-align: center;\n}\n\n#net-container {\n    display: none;\n    text-align: center;\n}\n\n#table-container {\n    display: none;\n    text-align: center;   \n    padding-top:20px; \n}\n\n#table-header {\n    padding-top: 20px;\n    border-top: 1px solid #554037;\n    min-width: 400px;\n    text-align: center;\n}\n\n#table-content {\n    text-align: center;\n}\n\n#table-content table {\n    display: inline-block;\n    text-align: left;\n    width:auto;\n    \n}\n\n#net-group {\n    display: inline-block;\n}\n\n#net-svg {\n}\n\n#net-title {\n    padding:20px;\n    border-bottom: 1px solid #554037;\n    min-width: 400px;\n    text-align: center;\n}\n\n#net-title .editlink {\n    font-size: 0.3em;\n    padding-left: 10px;\n    color: #554037;\n    cursor: pointer;\n}\n\n#net-error {\n    background-color: #C23739;\n    color: #FFF;\n    padding: 20px;\n    border: 1px solid transparent;\n    border-radius: 5px;\n    margin: 20px auto 20px auto;\n    width: 400px;\n    font-size: 12px;\n    font-family: Menlo,Monaco,Consolas,\"Courier New\",monospace;\n}\n\n#net-error .title {\n    border-bottom: 1px solid #FFABAC;\n    padding-bottom: 10px;\n    margin-bottom: 10px;\n}\n\n#net-error .msg {\n}\n\n.node-label {\n    font-size: 14px;\n    color: #563621;\n    padding: 1px;\n}\n\n.node-label:not(:first-child) {\n    padding-top:5px;\n    margin-top:5px;\n    border-top: 1px solid rgba(255,255,255,0.5);\n}\n\n.node {\n    fill: #FFB84D;\n}\n\n.node-type-convolution, .node-type-deconvolution {\n    fill: #CA5237;\n}\n\n.node-type-convolution .node-label, .node-type-deconvolution .node-label {\n    color: #FFF;\n}\n\n.node-type-inner-product, .node-type-innerproduct {\n    fill: #bd0026;\n}\n\n.node-type-inner-product .node-label, .node-type-innerproduct .node-label {\n    color: #FFF;\n}\n\n.node-type-batchnorm {\n    fill: #84AC7E;  /* dirty light green */\n}\n\n.node-type-lrn {\n    fill: #A265AC;  /* dirty pink */\n    fill: #bd0026;  /* deep red */\n}\n\n.node-type-lrn .node-label {\n    color: #fff;\n}\n\n.node-type-source {\n    fill: #37A058;\n}\n\n.node-type-source .node-label {\n    color: #FFF;\n}\n\n.node-type-sink {\n    fill: #7F6A9B;\n}\n\n.node-type-sink .node-label {\n    color: #FFF;\n}\n\n@-webkit-keyframes highlight {\n    from {color: #fff;}\n    to {color: #000;}\n}\n@keyframes highlight {\n    from {color: #fff;}\n    to {color: #000;}\n}\n.node-highlight {\n    animation: highlight 0.3s linear 0s 4 alternate\n}\n\n.edgePath path {\n    stroke: #554037;\n    fill: #554037;\n    stroke-width: 1.5px;\n}\n.node-info-header {\n}\n.node-param-row {\n}\n.node-param-section {\n    border-left: 1px solid #52637D;\n    padding-left: 10px;\n}\n.node-param-key {\n    color: #91A5BD;\n}\n.node-param-value {\n    color: #26BF8C;\n}\n.node-info-title {\n    color:#F7BF57;\n}\n.node-info-type {\n    color: #C499FF;\n}\n.node-info-annotation {\n    color: #69BFFF;\n}\n.node-info-group:not(:first-child) {\n    padding-top:5px;\n    margin-top:10px;\n    border-top: 1px dotted #52637D;\n}"
  },
  {
    "path": "assets/css/tablesorter.css",
    "content": ".tablesorter-default{width:100%;color:#333;border-spacing:0;margin:10px 0 15px;text-align:left}.tablesorter-default th,.tablesorter-default thead td{font-weight:700;color:#000;border-collapse:collapse;border-bottom:#ccc 2px solid;padding:0}.tablesorter-default tfoot td,.tablesorter-default tfoot th{border:0}.tablesorter-default .header,.tablesorter-default .tablesorter-header{background-image:url(data:image/gif;base64,R0lGODlhFQAJAIAAACMtMP///yH5BAEAAAEALAAAAAAVAAkAAAIXjI+AywnaYnhUMoqt3gZXPmVg94yJVQAAOw==);background-position:center right;background-repeat:no-repeat;cursor:pointer;white-space:normal;padding:4px 20px 4px 4px}.tablesorter-default thead .headerSortUp,.tablesorter-default thead .tablesorter-headerAsc,.tablesorter-default thead .tablesorter-headerSortUp{background-image:url(data:image/gif;base64,R0lGODlhFQAEAIAAACMtMP///yH5BAEAAAEALAAAAAAVAAQAAAINjI8Bya2wnINUMopZAQA7);border-bottom:#000 2px solid}.tablesorter-default thead .headerSortDown,.tablesorter-default thead .tablesorter-headerDesc,.tablesorter-default thead .tablesorter-headerSortDown{background-image:url(data:image/gif;base64,R0lGODlhFQAEAIAAACMtMP///yH5BAEAAAEALAAAAAAVAAQAAAINjB+gC+jP2ptn0WskLQA7);border-bottom:#000 2px solid}.tablesorter-default thead .sorter-false{background-image:none;cursor:default;padding:4px}.tablesorter-default tfoot .tablesorter-headerAsc,.tablesorter-default tfoot .tablesorter-headerDesc,.tablesorter-default tfoot .tablesorter-headerSortDown,.tablesorter-default tfoot .tablesorter-headerSortUp{border-top:#000 2px solid}.tablesorter-default td{background-color:#fff;border-bottom:#ccc 1px solid;padding:4px;vertical-align:top}.tablesorter-default tbody>tr.even:hover>td,.tablesorter-default tbody>tr.hover>td,.tablesorter-default tbody>tr.odd:hover>td,.tablesorter-default tbody>tr:hover>td{background-color:#fff;color:#000}.tablesorter-default .tablesorter-processing{background-position:center center!important;background-repeat:no-repeat!important;background-image:url(data:image/gif;base64,R0lGODlhFAAUAKEAAO7u7lpaWgAAAAAAACH/C05FVFNDQVBFMi4wAwEAAAAh+QQBCgACACwAAAAAFAAUAAACQZRvoIDtu1wLQUAlqKTVxqwhXIiBnDg6Y4eyx4lKW5XK7wrLeK3vbq8J2W4T4e1nMhpWrZCTt3xKZ8kgsggdJmUFACH5BAEKAAIALAcAAAALAAcAAAIUVB6ii7jajgCAuUmtovxtXnmdUAAAIfkEAQoAAgAsDQACAAcACwAAAhRUIpmHy/3gUVQAQO9NetuugCFWAAAh+QQBCgACACwNAAcABwALAAACE5QVcZjKbVo6ck2AF95m5/6BSwEAIfkEAQoAAgAsBwANAAsABwAAAhOUH3kr6QaAcSrGWe1VQl+mMUIBACH5BAEKAAIALAIADQALAAcAAAIUlICmh7ncTAgqijkruDiv7n2YUAAAIfkEAQoAAgAsAAAHAAcACwAAAhQUIGmHyedehIoqFXLKfPOAaZdWAAAh+QQFCgACACwAAAIABwALAAACFJQFcJiXb15zLYRl7cla8OtlGGgUADs=)!important}.tablesorter-default tr.odd>td{background-color:#dfdfdf}.tablesorter-default tr.even>td{background-color:#efefef}.tablesorter-default tr.odd td.primary{background-color:#bfbfbf}.tablesorter-default td.primary,.tablesorter-default tr.even td.primary,.tablesorter-default tr.odd td.secondary{background-color:#d9d9d9}.tablesorter-default td.secondary,.tablesorter-default tr.even td.secondary,.tablesorter-default tr.odd td.tertiary{background-color:#e6e6e6}.tablesorter-default td.tertiary,.tablesorter-default tr.even td.tertiary{background-color:#f2f2f2}caption{background-color:#fff}.tablesorter-default .tablesorter-filter-row{background-color:#eee}.tablesorter-default .tablesorter-filter-row td{background-color:#eee;border-bottom:#ccc 1px solid;line-height:normal;text-align:center;-webkit-transition:line-height .1s ease;-moz-transition:line-height .1s ease;-o-transition:line-height .1s ease;transition:line-height .1s ease}.tablesorter-default .tablesorter-filter-row .disabled{opacity:.5;filter:alpha(opacity=50);cursor:not-allowed}.tablesorter-default .tablesorter-filter-row.hideme td{padding:2px;margin:0;line-height:0;cursor:pointer}.tablesorter-default .tablesorter-filter-row.hideme *{height:1px;min-height:0;border:0;padding:0;margin:0;opacity:0;filter:alpha(opacity=0)}.tablesorter-default input.tablesorter-filter,.tablesorter-default select.tablesorter-filter{width:95%;height:auto;margin:4px auto;padding:4px;background-color:#fff;border:1px solid #bbb;color:#333;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;-webkit-transition:height .1s ease;-moz-transition:height .1s ease;-o-transition:height .1s ease;transition:height .1s ease}.tablesorter .filtered{display:none}.tablesorter .tablesorter-errorRow td{text-align:center;cursor:pointer;background-color:#e6bf99}"
  },
  {
    "path": "assets/css/tooltip.css",
    "content": "/*\n * qTip2 - Pretty powerful tooltips - v2.2.1\n * http://qtip2.com\n *\n * Copyright (c) 2014\n * Released under the MIT licenses\n * http://jquery.org/license\n *\n * Date: Sat Sep 6 2014 11:12 GMT+0100+0100\n * Plugins: tips modal viewport svg imagemap ie6\n * Styles: core basic css3\n */\n.qtip{\n\tposition: absolute;\n\tleft: -28000px;\n\ttop: -28000px;\n\tdisplay: none;\n\n\tmax-width: 280px;\n\tmin-width: 50px;\n\n\tfont-size: 10.5px;\n\tline-height: 12px;\n\n\tdirection: ltr;\n\n\tbox-shadow: none;\n\tpadding: 0;\n}\n\n\t.qtip-content{\n\t\tposition: relative;\n\t\tpadding: 5px 9px;\n\t\toverflow: hidden;\n\n\t\ttext-align: left;\n\t\tword-wrap: break-word;\n\t}\n\n\t.qtip-titlebar{\n\t\tposition: relative;\n\t\tpadding: 5px 35px 5px 10px;\n\t\toverflow: hidden;\n\n\t\tborder-width: 0 0 1px;\n\t\tfont-weight: bold;\n\t}\n\n\t.qtip-titlebar + .qtip-content{ border-top-width: 0 !important; }\n\n\t/* Default close button class */\n\t.qtip-close{\n\t\tposition: absolute;\n\t\tright: -9px; top: -9px;\n\t\tz-index: 11; /* Overlap .qtip-tip */\n\n\t\tcursor: pointer;\n\t\toutline: medium none;\n\n\t\tborder: 1px solid transparent;\n\t}\n\n\t\t.qtip-titlebar .qtip-close{\n\t\t\tright: 4px; top: 50%;\n\t\t\tmargin-top: -9px;\n\t\t}\n\n\t\t* html .qtip-titlebar .qtip-close{ top: 16px; } /* IE fix */\n\n\t\t.qtip-titlebar .ui-icon,\n\t\t.qtip-icon .ui-icon{\n\t\t\tdisplay: block;\n\t\t\ttext-indent: -1000em;\n\t\t\tdirection: ltr;\n\t\t}\n\n\t\t.qtip-icon, .qtip-icon .ui-icon{\n\t\t\t-moz-border-radius: 3px;\n\t\t\t-webkit-border-radius: 3px;\n\t\t\tborder-radius: 3px;\n\t\t\ttext-decoration: none;\n\t\t}\n\n\t\t\t.qtip-icon .ui-icon{\n\t\t\t\twidth: 18px;\n\t\t\t\theight: 14px;\n\n\t\t\t\tline-height: 14px;\n\t\t\t\ttext-align: center;\n\t\t\t\ttext-indent: 0;\n\t\t\t\tfont: normal bold 10px/13px Tahoma,sans-serif;\n\n\t\t\t\tcolor: inherit;\n\t\t\t\tbackground: transparent none no-repeat -100em -100em;\n\t\t\t}\n\n/* Applied to 'focused' tooltips e.g. most recently displayed/interacted with */\n.qtip-focus{}\n\n/* Applied on hover of tooltips i.e. added/removed on mouseenter/mouseleave respectively */\n.qtip-hover{}\n\n/* Default tooltip style */\n.qtip-default{\n\tborder: 1px solid #31343F;\n\tborder-radius: 5px;\n\tbackground-color: #31343F;\n\tcolor: #52637D;\n\n\tfont-family: 'Roboto';\n\tfont-size: 12px;\n\tline-height: 18px;\n}\n\n\t.qtip-default .qtip-icon{\n\t\tborder-color: #CCC;\n\t\tbackground: #F1F1F1;\n\t\tcolor: #777;\n\t}\n\n\t.qtip-default .qtip-titlebar .qtip-close{\n\t\tborder-color: #AAA;\n\t\tcolor: #111;\n\t}\n\n.qtip-shadow{\n\t-webkit-box-shadow: 1px 1px 3px 1px rgba(0, 0, 0, 0.15);\n\t-moz-box-shadow: 1px 1px 3px 1px rgba(0, 0, 0, 0.15);\n\tbox-shadow: 1px 1px 3px 1px rgba(0, 0, 0, 0.15);\n}\n\n.qtip-rounded .qtip-titlebar{\n\t-moz-border-radius: 4px 4px 0 0;\n\t-webkit-border-radius: 4px 4px 0 0;\n\tborder-radius: 4px 4px 0 0;\n}\n\n/* IE9 fix - removes all filters */\n.qtip:not(.ie9haxors) div.qtip-content,\n.qtip:not(.ie9haxors) div.qtip-titlebar{\n\tfilter: none;\n\t-ms-filter: none;\n}\n\n\n.qtip .qtip-tip{\n\tmargin: 0 auto;\n\toverflow: hidden;\n\tz-index: 10;\n\n}\n\n\t/* Opera bug #357 - Incorrect tip position\n\thttps://github.com/Craga89/qTip2/issues/367 */\n\tx:-o-prefocus, .qtip .qtip-tip{\n\t\tvisibility: hidden;\n\t}\n\n\t.qtip .qtip-tip,\n\t.qtip .qtip-tip .qtip-vml,\n\t.qtip .qtip-tip canvas{\n\t\tposition: absolute;\n\n\t\tcolor: #123456;\n\t\tbackground: transparent;\n\t\tborder: 0 dashed transparent;\n\t}\n\n\t.qtip .qtip-tip canvas{ top: 0; left: 0; }\n\n\t.qtip .qtip-tip .qtip-vml{\n\t\tbehavior: url(#default#VML);\n\t\tdisplay: inline-block;\n\t\tvisibility: visible;\n\t}\n\n\n#qtip-overlay{\n\tposition: fixed;\n\tleft: 0; top: 0;\n\twidth: 100%; height: 100%;\n}\n\n\t/* Applied to modals with show.modal.blur set to true */\n\t#qtip-overlay.blurs{ cursor: pointer; }\n\n\t/* Change opacity of overlay here */\n\t#qtip-overlay div{\n\t\tposition: absolute;\n\t\tleft: 0; top: 0;\n\t\twidth: 100%; height: 100%;\n\n\t\tbackground-color: black;\n\n\t\topacity: 0.7;\n\t\tfilter:alpha(opacity=70);\n\t\t-ms-filter:\"progid:DXImageTransform.Microsoft.Alpha(Opacity=70)\";\n\t}\n\n\n.qtipmodal-ie6fix{\n\tposition: absolute !important;\n}"
  },
  {
    "path": "assets/js/netscope.js",
    "content": "(function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require==\"function\"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);var f=new Error(\"Cannot find module '\"+o+\"'\");throw f.code=\"MODULE_NOT_FOUND\",f}var l=n[o]={exports:{}};t[o][0].call(l.exports,function(e){var n=t[o][1][e];return s(n?n:e)},l,l.exports,e,t,n,r)}return n[o].exports}var i=typeof require==\"function\"&&require;for(var o=0;o<r.length;o++)s(r[o]);return s})({1:[function(require,module,exports){\n/*!\n * jQuery JavaScript Library v3.2.1\n * https://jquery.com/\n *\n * Includes Sizzle.js\n * https://sizzlejs.com/\n *\n * Copyright JS Foundation and other contributors\n * Released under the MIT license\n * https://jquery.org/license\n *\n * Date: 2017-03-20T18:59Z\n */\n( function( global, factory ) {\n\n\t\"use strict\";\n\n\tif ( typeof module === \"object\" && typeof module.exports === \"object\" ) {\n\n\t\t// For CommonJS and CommonJS-like environments where a proper `window`\n\t\t// is present, execute the factory and get jQuery.\n\t\t// For environments that do not have a `window` with a `document`\n\t\t// (such as Node.js), expose a factory as module.exports.\n\t\t// This accentuates the need for the creation of a real `window`.\n\t\t// e.g. var jQuery = require(\"jquery\")(window);\n\t\t// See ticket #14549 for more info.\n\t\tmodule.exports = global.document ?\n\t\t\tfactory( global, true ) :\n\t\t\tfunction( w ) {\n\t\t\t\tif ( !w.document ) {\n\t\t\t\t\tthrow new Error( \"jQuery requires a window with a document\" );\n\t\t\t\t}\n\t\t\t\treturn factory( w );\n\t\t\t};\n\t} else {\n\t\tfactory( global );\n\t}\n\n// Pass this if window is not defined yet\n} )( typeof window !== \"undefined\" ? window : this, function( window, noGlobal ) {\n\n// Edge <= 12 - 13+, Firefox <=18 - 45+, IE 10 - 11, Safari 5.1 - 9+, iOS 6 - 9.1\n// throw exceptions when non-strict code (e.g., ASP.NET 4.5) accesses strict mode\n// arguments.callee.caller (trac-13335). But as of jQuery 3.0 (2016), strict mode should be common\n// enough that all such attempts are guarded in a try block.\n\"use strict\";\n\nvar arr = [];\n\nvar document = window.document;\n\nvar getProto = Object.getPrototypeOf;\n\nvar slice = arr.slice;\n\nvar concat = arr.concat;\n\nvar push = arr.push;\n\nvar indexOf = arr.indexOf;\n\nvar class2type = {};\n\nvar toString = class2type.toString;\n\nvar hasOwn = class2type.hasOwnProperty;\n\nvar fnToString = hasOwn.toString;\n\nvar ObjectFunctionString = fnToString.call( Object );\n\nvar support = {};\n\n\n\n\tfunction DOMEval( code, doc ) {\n\t\tdoc = doc || document;\n\n\t\tvar script = doc.createElement( \"script\" );\n\n\t\tscript.text = code;\n\t\tdoc.head.appendChild( script ).parentNode.removeChild( script );\n\t}\n/* global Symbol */\n// Defining this global in .eslintrc.json would create a danger of using the global\n// unguarded in another place, it seems safer to define global only for this module\n\n\n\nvar\n\tversion = \"3.2.1\",\n\n\t// Define a local copy of jQuery\n\tjQuery = function( selector, context ) {\n\n\t\t// The jQuery object is actually just the init constructor 'enhanced'\n\t\t// Need init if jQuery is called (just allow error to be thrown if not included)\n\t\treturn new jQuery.fn.init( selector, context );\n\t},\n\n\t// Support: Android <=4.0 only\n\t// Make sure we trim BOM and NBSP\n\trtrim = /^[\\s\\uFEFF\\xA0]+|[\\s\\uFEFF\\xA0]+$/g,\n\n\t// Matches dashed string for camelizing\n\trmsPrefix = /^-ms-/,\n\trdashAlpha = /-([a-z])/g,\n\n\t// Used by jQuery.camelCase as callback to replace()\n\tfcamelCase = function( all, letter ) {\n\t\treturn letter.toUpperCase();\n\t};\n\njQuery.fn = jQuery.prototype = {\n\n\t// The current version of jQuery being used\n\tjquery: version,\n\n\tconstructor: jQuery,\n\n\t// The default length of a jQuery object is 0\n\tlength: 0,\n\n\ttoArray: function() {\n\t\treturn slice.call( this );\n\t},\n\n\t// Get the Nth element in the matched element set OR\n\t// Get the whole matched element set as a clean array\n\tget: function( num ) {\n\n\t\t// Return all the elements in a clean array\n\t\tif ( num == null ) {\n\t\t\treturn slice.call( this );\n\t\t}\n\n\t\t// Return just the one element from the set\n\t\treturn num < 0 ? this[ num + this.length ] : this[ num ];\n\t},\n\n\t// Take an array of elements and push it onto the stack\n\t// (returning the new matched element set)\n\tpushStack: function( elems ) {\n\n\t\t// Build a new jQuery matched element set\n\t\tvar ret = jQuery.merge( this.constructor(), elems );\n\n\t\t// Add the old object onto the stack (as a reference)\n\t\tret.prevObject = this;\n\n\t\t// Return the newly-formed element set\n\t\treturn ret;\n\t},\n\n\t// Execute a callback for every element in the matched set.\n\teach: function( callback ) {\n\t\treturn jQuery.each( this, callback );\n\t},\n\n\tmap: function( callback ) {\n\t\treturn this.pushStack( jQuery.map( this, function( elem, i ) {\n\t\t\treturn callback.call( elem, i, elem );\n\t\t} ) );\n\t},\n\n\tslice: function() {\n\t\treturn this.pushStack( slice.apply( this, arguments ) );\n\t},\n\n\tfirst: function() {\n\t\treturn this.eq( 0 );\n\t},\n\n\tlast: function() {\n\t\treturn this.eq( -1 );\n\t},\n\n\teq: function( i ) {\n\t\tvar len = this.length,\n\t\t\tj = +i + ( i < 0 ? len : 0 );\n\t\treturn this.pushStack( j >= 0 && j < len ? [ this[ j ] ] : [] );\n\t},\n\n\tend: function() {\n\t\treturn this.prevObject || this.constructor();\n\t},\n\n\t// For internal use only.\n\t// Behaves like an Array's method, not like a jQuery method.\n\tpush: push,\n\tsort: arr.sort,\n\tsplice: arr.splice\n};\n\njQuery.extend = jQuery.fn.extend = function() {\n\tvar options, name, src, copy, copyIsArray, clone,\n\t\ttarget = arguments[ 0 ] || {},\n\t\ti = 1,\n\t\tlength = arguments.length,\n\t\tdeep = false;\n\n\t// Handle a deep copy situation\n\tif ( typeof target === \"boolean\" ) {\n\t\tdeep = target;\n\n\t\t// Skip the boolean and the target\n\t\ttarget = arguments[ i ] || {};\n\t\ti++;\n\t}\n\n\t// Handle case when target is a string or something (possible in deep copy)\n\tif ( typeof target !== \"object\" && !jQuery.isFunction( target ) ) {\n\t\ttarget = {};\n\t}\n\n\t// Extend jQuery itself if only one argument is passed\n\tif ( i === length ) {\n\t\ttarget = this;\n\t\ti--;\n\t}\n\n\tfor ( ; i < length; i++ ) {\n\n\t\t// Only deal with non-null/undefined values\n\t\tif ( ( options = arguments[ i ] ) != null ) {\n\n\t\t\t// Extend the base object\n\t\t\tfor ( name in options ) {\n\t\t\t\tsrc = target[ name ];\n\t\t\t\tcopy = options[ name ];\n\n\t\t\t\t// Prevent never-ending loop\n\t\t\t\tif ( target === copy ) {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\t// Recurse if we're merging plain objects or arrays\n\t\t\t\tif ( deep && copy && ( jQuery.isPlainObject( copy ) ||\n\t\t\t\t\t( copyIsArray = Array.isArray( copy ) ) ) ) {\n\n\t\t\t\t\tif ( copyIsArray ) {\n\t\t\t\t\t\tcopyIsArray = false;\n\t\t\t\t\t\tclone = src && Array.isArray( src ) ? src : [];\n\n\t\t\t\t\t} else {\n\t\t\t\t\t\tclone = src && jQuery.isPlainObject( src ) ? src : {};\n\t\t\t\t\t}\n\n\t\t\t\t\t// Never move original objects, clone them\n\t\t\t\t\ttarget[ name ] = jQuery.extend( deep, clone, copy );\n\n\t\t\t\t// Don't bring in undefined values\n\t\t\t\t} else if ( copy !== undefined ) {\n\t\t\t\t\ttarget[ name ] = copy;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\t// Return the modified object\n\treturn target;\n};\n\njQuery.extend( {\n\n\t// Unique for each copy of jQuery on the page\n\texpando: \"jQuery\" + ( version + Math.random() ).replace( /\\D/g, \"\" ),\n\n\t// Assume jQuery is ready without the ready module\n\tisReady: true,\n\n\terror: function( msg ) {\n\t\tthrow new Error( msg );\n\t},\n\n\tnoop: function() {},\n\n\tisFunction: function( obj ) {\n\t\treturn jQuery.type( obj ) === \"function\";\n\t},\n\n\tisWindow: function( obj ) {\n\t\treturn obj != null && obj === obj.window;\n\t},\n\n\tisNumeric: function( obj ) {\n\n\t\t// As of jQuery 3.0, isNumeric is limited to\n\t\t// strings and numbers (primitives or objects)\n\t\t// that can be coerced to finite numbers (gh-2662)\n\t\tvar type = jQuery.type( obj );\n\t\treturn ( type === \"number\" || type === \"string\" ) &&\n\n\t\t\t// parseFloat NaNs numeric-cast false positives (\"\")\n\t\t\t// ...but misinterprets leading-number strings, particularly hex literals (\"0x...\")\n\t\t\t// subtraction forces infinities to NaN\n\t\t\t!isNaN( obj - parseFloat( obj ) );\n\t},\n\n\tisPlainObject: function( obj ) {\n\t\tvar proto, Ctor;\n\n\t\t// Detect obvious negatives\n\t\t// Use toString instead of jQuery.type to catch host objects\n\t\tif ( !obj || toString.call( obj ) !== \"[object Object]\" ) {\n\t\t\treturn false;\n\t\t}\n\n\t\tproto = getProto( obj );\n\n\t\t// Objects with no prototype (e.g., `Object.create( null )`) are plain\n\t\tif ( !proto ) {\n\t\t\treturn true;\n\t\t}\n\n\t\t// Objects with prototype are plain iff they were constructed by a global Object function\n\t\tCtor = hasOwn.call( proto, \"constructor\" ) && proto.constructor;\n\t\treturn typeof Ctor === \"function\" && fnToString.call( Ctor ) === ObjectFunctionString;\n\t},\n\n\tisEmptyObject: function( obj ) {\n\n\t\t/* eslint-disable no-unused-vars */\n\t\t// See https://github.com/eslint/eslint/issues/6125\n\t\tvar name;\n\n\t\tfor ( name in obj ) {\n\t\t\treturn false;\n\t\t}\n\t\treturn true;\n\t},\n\n\ttype: function( obj ) {\n\t\tif ( obj == null ) {\n\t\t\treturn obj + \"\";\n\t\t}\n\n\t\t// Support: Android <=2.3 only (functionish RegExp)\n\t\treturn typeof obj === \"object\" || typeof obj === \"function\" ?\n\t\t\tclass2type[ toString.call( obj ) ] || \"object\" :\n\t\t\ttypeof obj;\n\t},\n\n\t// Evaluates a script in a global context\n\tglobalEval: function( code ) {\n\t\tDOMEval( code );\n\t},\n\n\t// Convert dashed to camelCase; used by the css and data modules\n\t// Support: IE <=9 - 11, Edge 12 - 13\n\t// Microsoft forgot to hump their vendor prefix (#9572)\n\tcamelCase: function( string ) {\n\t\treturn string.replace( rmsPrefix, \"ms-\" ).replace( rdashAlpha, fcamelCase );\n\t},\n\n\teach: function( obj, callback ) {\n\t\tvar length, i = 0;\n\n\t\tif ( isArrayLike( obj ) ) {\n\t\t\tlength = obj.length;\n\t\t\tfor ( ; i < length; i++ ) {\n\t\t\t\tif ( callback.call( obj[ i ], i, obj[ i ] ) === false ) {\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t} else {\n\t\t\tfor ( i in obj ) {\n\t\t\t\tif ( callback.call( obj[ i ], i, obj[ i ] ) === false ) {\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn obj;\n\t},\n\n\t// Support: Android <=4.0 only\n\ttrim: function( text ) {\n\t\treturn text == null ?\n\t\t\t\"\" :\n\t\t\t( text + \"\" ).replace( rtrim, \"\" );\n\t},\n\n\t// results is for internal usage only\n\tmakeArray: function( arr, results ) {\n\t\tvar ret = results || [];\n\n\t\tif ( arr != null ) {\n\t\t\tif ( isArrayLike( Object( arr ) ) ) {\n\t\t\t\tjQuery.merge( ret,\n\t\t\t\t\ttypeof arr === \"string\" ?\n\t\t\t\t\t[ arr ] : arr\n\t\t\t\t);\n\t\t\t} else {\n\t\t\t\tpush.call( ret, arr );\n\t\t\t}\n\t\t}\n\n\t\treturn ret;\n\t},\n\n\tinArray: function( elem, arr, i ) {\n\t\treturn arr == null ? -1 : indexOf.call( arr, elem, i );\n\t},\n\n\t// Support: Android <=4.0 only, PhantomJS 1 only\n\t// push.apply(_, arraylike) throws on ancient WebKit\n\tmerge: function( first, second ) {\n\t\tvar len = +second.length,\n\t\t\tj = 0,\n\t\t\ti = first.length;\n\n\t\tfor ( ; j < len; j++ ) {\n\t\t\tfirst[ i++ ] = second[ j ];\n\t\t}\n\n\t\tfirst.length = i;\n\n\t\treturn first;\n\t},\n\n\tgrep: function( elems, callback, invert ) {\n\t\tvar callbackInverse,\n\t\t\tmatches = [],\n\t\t\ti = 0,\n\t\t\tlength = elems.length,\n\t\t\tcallbackExpect = !invert;\n\n\t\t// Go through the array, only saving the items\n\t\t// that pass the validator function\n\t\tfor ( ; i < length; i++ ) {\n\t\t\tcallbackInverse = !callback( elems[ i ], i );\n\t\t\tif ( callbackInverse !== callbackExpect ) {\n\t\t\t\tmatches.push( elems[ i ] );\n\t\t\t}\n\t\t}\n\n\t\treturn matches;\n\t},\n\n\t// arg is for internal usage only\n\tmap: function( elems, callback, arg ) {\n\t\tvar length, value,\n\t\t\ti = 0,\n\t\t\tret = [];\n\n\t\t// Go through the array, translating each of the items to their new values\n\t\tif ( isArrayLike( elems ) ) {\n\t\t\tlength = elems.length;\n\t\t\tfor ( ; i < length; i++ ) {\n\t\t\t\tvalue = callback( elems[ i ], i, arg );\n\n\t\t\t\tif ( value != null ) {\n\t\t\t\t\tret.push( value );\n\t\t\t\t}\n\t\t\t}\n\n\t\t// Go through every key on the object,\n\t\t} else {\n\t\t\tfor ( i in elems ) {\n\t\t\t\tvalue = callback( elems[ i ], i, arg );\n\n\t\t\t\tif ( value != null ) {\n\t\t\t\t\tret.push( value );\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// Flatten any nested arrays\n\t\treturn concat.apply( [], ret );\n\t},\n\n\t// A global GUID counter for objects\n\tguid: 1,\n\n\t// Bind a function to a context, optionally partially applying any\n\t// arguments.\n\tproxy: function( fn, context ) {\n\t\tvar tmp, args, proxy;\n\n\t\tif ( typeof context === \"string\" ) {\n\t\t\ttmp = fn[ context ];\n\t\t\tcontext = fn;\n\t\t\tfn = tmp;\n\t\t}\n\n\t\t// Quick check to determine if target is callable, in the spec\n\t\t// this throws a TypeError, but we will just return undefined.\n\t\tif ( !jQuery.isFunction( fn ) ) {\n\t\t\treturn undefined;\n\t\t}\n\n\t\t// Simulated bind\n\t\targs = slice.call( arguments, 2 );\n\t\tproxy = function() {\n\t\t\treturn fn.apply( context || this, args.concat( slice.call( arguments ) ) );\n\t\t};\n\n\t\t// Set the guid of unique handler to the same of original handler, so it can be removed\n\t\tproxy.guid = fn.guid = fn.guid || jQuery.guid++;\n\n\t\treturn proxy;\n\t},\n\n\tnow: Date.now,\n\n\t// jQuery.support is not used in Core but other projects attach their\n\t// properties to it so it needs to exist.\n\tsupport: support\n} );\n\nif ( typeof Symbol === \"function\" ) {\n\tjQuery.fn[ Symbol.iterator ] = arr[ Symbol.iterator ];\n}\n\n// Populate the class2type map\njQuery.each( \"Boolean Number String Function Array Date RegExp Object Error Symbol\".split( \" \" ),\nfunction( i, name ) {\n\tclass2type[ \"[object \" + name + \"]\" ] = name.toLowerCase();\n} );\n\nfunction isArrayLike( obj ) {\n\n\t// Support: real iOS 8.2 only (not reproducible in simulator)\n\t// `in` check used to prevent JIT error (gh-2145)\n\t// hasOwn isn't used here due to false negatives\n\t// regarding Nodelist length in IE\n\tvar length = !!obj && \"length\" in obj && obj.length,\n\t\ttype = jQuery.type( obj );\n\n\tif ( type === \"function\" || jQuery.isWindow( obj ) ) {\n\t\treturn false;\n\t}\n\n\treturn type === \"array\" || length === 0 ||\n\t\ttypeof length === \"number\" && length > 0 && ( length - 1 ) in obj;\n}\nvar Sizzle =\n/*!\n * Sizzle CSS Selector Engine v2.3.3\n * https://sizzlejs.com/\n *\n * Copyright jQuery Foundation and other contributors\n * Released under the MIT license\n * http://jquery.org/license\n *\n * Date: 2016-08-08\n */\n(function( window ) {\n\nvar i,\n\tsupport,\n\tExpr,\n\tgetText,\n\tisXML,\n\ttokenize,\n\tcompile,\n\tselect,\n\toutermostContext,\n\tsortInput,\n\thasDuplicate,\n\n\t// Local document vars\n\tsetDocument,\n\tdocument,\n\tdocElem,\n\tdocumentIsHTML,\n\trbuggyQSA,\n\trbuggyMatches,\n\tmatches,\n\tcontains,\n\n\t// Instance-specific data\n\texpando = \"sizzle\" + 1 * new Date(),\n\tpreferredDoc = window.document,\n\tdirruns = 0,\n\tdone = 0,\n\tclassCache = createCache(),\n\ttokenCache = createCache(),\n\tcompilerCache = createCache(),\n\tsortOrder = function( a, b ) {\n\t\tif ( a === b ) {\n\t\t\thasDuplicate = true;\n\t\t}\n\t\treturn 0;\n\t},\n\n\t// Instance methods\n\thasOwn = ({}).hasOwnProperty,\n\tarr = [],\n\tpop = arr.pop,\n\tpush_native = arr.push,\n\tpush = arr.push,\n\tslice = arr.slice,\n\t// Use a stripped-down indexOf as it's faster than native\n\t// https://jsperf.com/thor-indexof-vs-for/5\n\tindexOf = function( list, elem ) {\n\t\tvar i = 0,\n\t\t\tlen = list.length;\n\t\tfor ( ; i < len; i++ ) {\n\t\t\tif ( list[i] === elem ) {\n\t\t\t\treturn i;\n\t\t\t}\n\t\t}\n\t\treturn -1;\n\t},\n\n\tbooleans = \"checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|loop|multiple|open|readonly|required|scoped\",\n\n\t// Regular expressions\n\n\t// http://www.w3.org/TR/css3-selectors/#whitespace\n\twhitespace = \"[\\\\x20\\\\t\\\\r\\\\n\\\\f]\",\n\n\t// http://www.w3.org/TR/CSS21/syndata.html#value-def-identifier\n\tidentifier = \"(?:\\\\\\\\.|[\\\\w-]|[^\\0-\\\\xa0])+\",\n\n\t// Attribute selectors: http://www.w3.org/TR/selectors/#attribute-selectors\n\tattributes = \"\\\\[\" + whitespace + \"*(\" + identifier + \")(?:\" + whitespace +\n\t\t// Operator (capture 2)\n\t\t\"*([*^$|!~]?=)\" + whitespace +\n\t\t// \"Attribute values must be CSS identifiers [capture 5] or strings [capture 3 or capture 4]\"\n\t\t\"*(?:'((?:\\\\\\\\.|[^\\\\\\\\'])*)'|\\\"((?:\\\\\\\\.|[^\\\\\\\\\\\"])*)\\\"|(\" + identifier + \"))|)\" + whitespace +\n\t\t\"*\\\\]\",\n\n\tpseudos = \":(\" + identifier + \")(?:\\\\((\" +\n\t\t// To reduce the number of selectors needing tokenize in the preFilter, prefer arguments:\n\t\t// 1. quoted (capture 3; capture 4 or capture 5)\n\t\t\"('((?:\\\\\\\\.|[^\\\\\\\\'])*)'|\\\"((?:\\\\\\\\.|[^\\\\\\\\\\\"])*)\\\")|\" +\n\t\t// 2. simple (capture 6)\n\t\t\"((?:\\\\\\\\.|[^\\\\\\\\()[\\\\]]|\" + attributes + \")*)|\" +\n\t\t// 3. anything else (capture 2)\n\t\t\".*\" +\n\t\t\")\\\\)|)\",\n\n\t// Leading and non-escaped trailing whitespace, capturing some non-whitespace characters preceding the latter\n\trwhitespace = new RegExp( whitespace + \"+\", \"g\" ),\n\trtrim = new RegExp( \"^\" + whitespace + \"+|((?:^|[^\\\\\\\\])(?:\\\\\\\\.)*)\" + whitespace + \"+$\", \"g\" ),\n\n\trcomma = new RegExp( \"^\" + whitespace + \"*,\" + whitespace + \"*\" ),\n\trcombinators = new RegExp( \"^\" + whitespace + \"*([>+~]|\" + whitespace + \")\" + whitespace + \"*\" ),\n\n\trattributeQuotes = new RegExp( \"=\" + whitespace + \"*([^\\\\]'\\\"]*?)\" + whitespace + \"*\\\\]\", \"g\" ),\n\n\trpseudo = new RegExp( pseudos ),\n\tridentifier = new RegExp( \"^\" + identifier + \"$\" ),\n\n\tmatchExpr = {\n\t\t\"ID\": new RegExp( \"^#(\" + identifier + \")\" ),\n\t\t\"CLASS\": new RegExp( \"^\\\\.(\" + identifier + \")\" ),\n\t\t\"TAG\": new RegExp( \"^(\" + identifier + \"|[*])\" ),\n\t\t\"ATTR\": new RegExp( \"^\" + attributes ),\n\t\t\"PSEUDO\": new RegExp( \"^\" + pseudos ),\n\t\t\"CHILD\": new RegExp( \"^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\\\(\" + whitespace +\n\t\t\t\"*(even|odd|(([+-]|)(\\\\d*)n|)\" + whitespace + \"*(?:([+-]|)\" + whitespace +\n\t\t\t\"*(\\\\d+)|))\" + whitespace + \"*\\\\)|)\", \"i\" ),\n\t\t\"bool\": new RegExp( \"^(?:\" + booleans + \")$\", \"i\" ),\n\t\t// For use in libraries implementing .is()\n\t\t// We use this for POS matching in `select`\n\t\t\"needsContext\": new RegExp( \"^\" + whitespace + \"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\\\(\" +\n\t\t\twhitespace + \"*((?:-\\\\d)?\\\\d*)\" + whitespace + \"*\\\\)|)(?=[^-]|$)\", \"i\" )\n\t},\n\n\trinputs = /^(?:input|select|textarea|button)$/i,\n\trheader = /^h\\d$/i,\n\n\trnative = /^[^{]+\\{\\s*\\[native \\w/,\n\n\t// Easily-parseable/retrievable ID or TAG or CLASS selectors\n\trquickExpr = /^(?:#([\\w-]+)|(\\w+)|\\.([\\w-]+))$/,\n\n\trsibling = /[+~]/,\n\n\t// CSS escapes\n\t// http://www.w3.org/TR/CSS21/syndata.html#escaped-characters\n\trunescape = new RegExp( \"\\\\\\\\([\\\\da-f]{1,6}\" + whitespace + \"?|(\" + whitespace + \")|.)\", \"ig\" ),\n\tfunescape = function( _, escaped, escapedWhitespace ) {\n\t\tvar high = \"0x\" + escaped - 0x10000;\n\t\t// NaN means non-codepoint\n\t\t// Support: Firefox<24\n\t\t// Workaround erroneous numeric interpretation of +\"0x\"\n\t\treturn high !== high || escapedWhitespace ?\n\t\t\tescaped :\n\t\t\thigh < 0 ?\n\t\t\t\t// BMP codepoint\n\t\t\t\tString.fromCharCode( high + 0x10000 ) :\n\t\t\t\t// Supplemental Plane codepoint (surrogate pair)\n\t\t\t\tString.fromCharCode( high >> 10 | 0xD800, high & 0x3FF | 0xDC00 );\n\t},\n\n\t// CSS string/identifier serialization\n\t// https://drafts.csswg.org/cssom/#common-serializing-idioms\n\trcssescape = /([\\0-\\x1f\\x7f]|^-?\\d)|^-$|[^\\0-\\x1f\\x7f-\\uFFFF\\w-]/g,\n\tfcssescape = function( ch, asCodePoint ) {\n\t\tif ( asCodePoint ) {\n\n\t\t\t// U+0000 NULL becomes U+FFFD REPLACEMENT CHARACTER\n\t\t\tif ( ch === \"\\0\" ) {\n\t\t\t\treturn \"\\uFFFD\";\n\t\t\t}\n\n\t\t\t// Control characters and (dependent upon position) numbers get escaped as code points\n\t\t\treturn ch.slice( 0, -1 ) + \"\\\\\" + ch.charCodeAt( ch.length - 1 ).toString( 16 ) + \" \";\n\t\t}\n\n\t\t// Other potentially-special ASCII characters get backslash-escaped\n\t\treturn \"\\\\\" + ch;\n\t},\n\n\t// Used for iframes\n\t// See setDocument()\n\t// Removing the function wrapper causes a \"Permission Denied\"\n\t// error in IE\n\tunloadHandler = function() {\n\t\tsetDocument();\n\t},\n\n\tdisabledAncestor = addCombinator(\n\t\tfunction( elem ) {\n\t\t\treturn elem.disabled === true && (\"form\" in elem || \"label\" in elem);\n\t\t},\n\t\t{ dir: \"parentNode\", next: \"legend\" }\n\t);\n\n// Optimize for push.apply( _, NodeList )\ntry {\n\tpush.apply(\n\t\t(arr = slice.call( preferredDoc.childNodes )),\n\t\tpreferredDoc.childNodes\n\t);\n\t// Support: Android<4.0\n\t// Detect silently failing push.apply\n\tarr[ preferredDoc.childNodes.length ].nodeType;\n} catch ( e ) {\n\tpush = { apply: arr.length ?\n\n\t\t// Leverage slice if possible\n\t\tfunction( target, els ) {\n\t\t\tpush_native.apply( target, slice.call(els) );\n\t\t} :\n\n\t\t// Support: IE<9\n\t\t// Otherwise append directly\n\t\tfunction( target, els ) {\n\t\t\tvar j = target.length,\n\t\t\t\ti = 0;\n\t\t\t// Can't trust NodeList.length\n\t\t\twhile ( (target[j++] = els[i++]) ) {}\n\t\t\ttarget.length = j - 1;\n\t\t}\n\t};\n}\n\nfunction Sizzle( selector, context, results, seed ) {\n\tvar m, i, elem, nid, match, groups, newSelector,\n\t\tnewContext = context && context.ownerDocument,\n\n\t\t// nodeType defaults to 9, since context defaults to document\n\t\tnodeType = context ? context.nodeType : 9;\n\n\tresults = results || [];\n\n\t// Return early from calls with invalid selector or context\n\tif ( typeof selector !== \"string\" || !selector ||\n\t\tnodeType !== 1 && nodeType !== 9 && nodeType !== 11 ) {\n\n\t\treturn results;\n\t}\n\n\t// Try to shortcut find operations (as opposed to filters) in HTML documents\n\tif ( !seed ) {\n\n\t\tif ( ( context ? context.ownerDocument || context : preferredDoc ) !== document ) {\n\t\t\tsetDocument( context );\n\t\t}\n\t\tcontext = context || document;\n\n\t\tif ( documentIsHTML ) {\n\n\t\t\t// If the selector is sufficiently simple, try using a \"get*By*\" DOM method\n\t\t\t// (excepting DocumentFragment context, where the methods don't exist)\n\t\t\tif ( nodeType !== 11 && (match = rquickExpr.exec( selector )) ) {\n\n\t\t\t\t// ID selector\n\t\t\t\tif ( (m = match[1]) ) {\n\n\t\t\t\t\t// Document context\n\t\t\t\t\tif ( nodeType === 9 ) {\n\t\t\t\t\t\tif ( (elem = context.getElementById( m )) ) {\n\n\t\t\t\t\t\t\t// Support: IE, Opera, Webkit\n\t\t\t\t\t\t\t// TODO: identify versions\n\t\t\t\t\t\t\t// getElementById can match elements by name instead of ID\n\t\t\t\t\t\t\tif ( elem.id === m ) {\n\t\t\t\t\t\t\t\tresults.push( elem );\n\t\t\t\t\t\t\t\treturn results;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\treturn results;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t// Element context\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\t// Support: IE, Opera, Webkit\n\t\t\t\t\t\t// TODO: identify versions\n\t\t\t\t\t\t// getElementById can match elements by name instead of ID\n\t\t\t\t\t\tif ( newContext && (elem = newContext.getElementById( m )) &&\n\t\t\t\t\t\t\tcontains( context, elem ) &&\n\t\t\t\t\t\t\telem.id === m ) {\n\n\t\t\t\t\t\t\tresults.push( elem );\n\t\t\t\t\t\t\treturn results;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t// Type selector\n\t\t\t\t} else if ( match[2] ) {\n\t\t\t\t\tpush.apply( results, context.getElementsByTagName( selector ) );\n\t\t\t\t\treturn results;\n\n\t\t\t\t// Class selector\n\t\t\t\t} else if ( (m = match[3]) && support.getElementsByClassName &&\n\t\t\t\t\tcontext.getElementsByClassName ) {\n\n\t\t\t\t\tpush.apply( results, context.getElementsByClassName( m ) );\n\t\t\t\t\treturn results;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Take advantage of querySelectorAll\n\t\t\tif ( support.qsa &&\n\t\t\t\t!compilerCache[ selector + \" \" ] &&\n\t\t\t\t(!rbuggyQSA || !rbuggyQSA.test( selector )) ) {\n\n\t\t\t\tif ( nodeType !== 1 ) {\n\t\t\t\t\tnewContext = context;\n\t\t\t\t\tnewSelector = selector;\n\n\t\t\t\t// qSA looks outside Element context, which is not what we want\n\t\t\t\t// Thanks to Andrew Dupont for this workaround technique\n\t\t\t\t// Support: IE <=8\n\t\t\t\t// Exclude object elements\n\t\t\t\t} else if ( context.nodeName.toLowerCase() !== \"object\" ) {\n\n\t\t\t\t\t// Capture the context ID, setting it first if necessary\n\t\t\t\t\tif ( (nid = context.getAttribute( \"id\" )) ) {\n\t\t\t\t\t\tnid = nid.replace( rcssescape, fcssescape );\n\t\t\t\t\t} else {\n\t\t\t\t\t\tcontext.setAttribute( \"id\", (nid = expando) );\n\t\t\t\t\t}\n\n\t\t\t\t\t// Prefix every selector in the list\n\t\t\t\t\tgroups = tokenize( selector );\n\t\t\t\t\ti = groups.length;\n\t\t\t\t\twhile ( i-- ) {\n\t\t\t\t\t\tgroups[i] = \"#\" + nid + \" \" + toSelector( groups[i] );\n\t\t\t\t\t}\n\t\t\t\t\tnewSelector = groups.join( \",\" );\n\n\t\t\t\t\t// Expand context for sibling selectors\n\t\t\t\t\tnewContext = rsibling.test( selector ) && testContext( context.parentNode ) ||\n\t\t\t\t\t\tcontext;\n\t\t\t\t}\n\n\t\t\t\tif ( newSelector ) {\n\t\t\t\t\ttry {\n\t\t\t\t\t\tpush.apply( results,\n\t\t\t\t\t\t\tnewContext.querySelectorAll( newSelector )\n\t\t\t\t\t\t);\n\t\t\t\t\t\treturn results;\n\t\t\t\t\t} catch ( qsaError ) {\n\t\t\t\t\t} finally {\n\t\t\t\t\t\tif ( nid === expando ) {\n\t\t\t\t\t\t\tcontext.removeAttribute( \"id\" );\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\t// All others\n\treturn select( selector.replace( rtrim, \"$1\" ), context, results, seed );\n}\n\n/**\n * Create key-value caches of limited size\n * @returns {function(string, object)} Returns the Object data after storing it on itself with\n *\tproperty name the (space-suffixed) string and (if the cache is larger than Expr.cacheLength)\n *\tdeleting the oldest entry\n */\nfunction createCache() {\n\tvar keys = [];\n\n\tfunction cache( key, value ) {\n\t\t// Use (key + \" \") to avoid collision with native prototype properties (see Issue #157)\n\t\tif ( keys.push( key + \" \" ) > Expr.cacheLength ) {\n\t\t\t// Only keep the most recent entries\n\t\t\tdelete cache[ keys.shift() ];\n\t\t}\n\t\treturn (cache[ key + \" \" ] = value);\n\t}\n\treturn cache;\n}\n\n/**\n * Mark a function for special use by Sizzle\n * @param {Function} fn The function to mark\n */\nfunction markFunction( fn ) {\n\tfn[ expando ] = true;\n\treturn fn;\n}\n\n/**\n * Support testing using an element\n * @param {Function} fn Passed the created element and returns a boolean result\n */\nfunction assert( fn ) {\n\tvar el = document.createElement(\"fieldset\");\n\n\ttry {\n\t\treturn !!fn( el );\n\t} catch (e) {\n\t\treturn false;\n\t} finally {\n\t\t// Remove from its parent by default\n\t\tif ( el.parentNode ) {\n\t\t\tel.parentNode.removeChild( el );\n\t\t}\n\t\t// release memory in IE\n\t\tel = null;\n\t}\n}\n\n/**\n * Adds the same handler for all of the specified attrs\n * @param {String} attrs Pipe-separated list of attributes\n * @param {Function} handler The method that will be applied\n */\nfunction addHandle( attrs, handler ) {\n\tvar arr = attrs.split(\"|\"),\n\t\ti = arr.length;\n\n\twhile ( i-- ) {\n\t\tExpr.attrHandle[ arr[i] ] = handler;\n\t}\n}\n\n/**\n * Checks document order of two siblings\n * @param {Element} a\n * @param {Element} b\n * @returns {Number} Returns less than 0 if a precedes b, greater than 0 if a follows b\n */\nfunction siblingCheck( a, b ) {\n\tvar cur = b && a,\n\t\tdiff = cur && a.nodeType === 1 && b.nodeType === 1 &&\n\t\t\ta.sourceIndex - b.sourceIndex;\n\n\t// Use IE sourceIndex if available on both nodes\n\tif ( diff ) {\n\t\treturn diff;\n\t}\n\n\t// Check if b follows a\n\tif ( cur ) {\n\t\twhile ( (cur = cur.nextSibling) ) {\n\t\t\tif ( cur === b ) {\n\t\t\t\treturn -1;\n\t\t\t}\n\t\t}\n\t}\n\n\treturn a ? 1 : -1;\n}\n\n/**\n * Returns a function to use in pseudos for input types\n * @param {String} type\n */\nfunction createInputPseudo( type ) {\n\treturn function( elem ) {\n\t\tvar name = elem.nodeName.toLowerCase();\n\t\treturn name === \"input\" && elem.type === type;\n\t};\n}\n\n/**\n * Returns a function to use in pseudos for buttons\n * @param {String} type\n */\nfunction createButtonPseudo( type ) {\n\treturn function( elem ) {\n\t\tvar name = elem.nodeName.toLowerCase();\n\t\treturn (name === \"input\" || name === \"button\") && elem.type === type;\n\t};\n}\n\n/**\n * Returns a function to use in pseudos for :enabled/:disabled\n * @param {Boolean} disabled true for :disabled; false for :enabled\n */\nfunction createDisabledPseudo( disabled ) {\n\n\t// Known :disabled false positives: fieldset[disabled] > legend:nth-of-type(n+2) :can-disable\n\treturn function( elem ) {\n\n\t\t// Only certain elements can match :enabled or :disabled\n\t\t// https://html.spec.whatwg.org/multipage/scripting.html#selector-enabled\n\t\t// https://html.spec.whatwg.org/multipage/scripting.html#selector-disabled\n\t\tif ( \"form\" in elem ) {\n\n\t\t\t// Check for inherited disabledness on relevant non-disabled elements:\n\t\t\t// * listed form-associated elements in a disabled fieldset\n\t\t\t//   https://html.spec.whatwg.org/multipage/forms.html#category-listed\n\t\t\t//   https://html.spec.whatwg.org/multipage/forms.html#concept-fe-disabled\n\t\t\t// * option elements in a disabled optgroup\n\t\t\t//   https://html.spec.whatwg.org/multipage/forms.html#concept-option-disabled\n\t\t\t// All such elements have a \"form\" property.\n\t\t\tif ( elem.parentNode && elem.disabled === false ) {\n\n\t\t\t\t// Option elements defer to a parent optgroup if present\n\t\t\t\tif ( \"label\" in elem ) {\n\t\t\t\t\tif ( \"label\" in elem.parentNode ) {\n\t\t\t\t\t\treturn elem.parentNode.disabled === disabled;\n\t\t\t\t\t} else {\n\t\t\t\t\t\treturn elem.disabled === disabled;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t// Support: IE 6 - 11\n\t\t\t\t// Use the isDisabled shortcut property to check for disabled fieldset ancestors\n\t\t\t\treturn elem.isDisabled === disabled ||\n\n\t\t\t\t\t// Where there is no isDisabled, check manually\n\t\t\t\t\t/* jshint -W018 */\n\t\t\t\t\telem.isDisabled !== !disabled &&\n\t\t\t\t\t\tdisabledAncestor( elem ) === disabled;\n\t\t\t}\n\n\t\t\treturn elem.disabled === disabled;\n\n\t\t// Try to winnow out elements that can't be disabled before trusting the disabled property.\n\t\t// Some victims get caught in our net (label, legend, menu, track), but it shouldn't\n\t\t// even exist on them, let alone have a boolean value.\n\t\t} else if ( \"label\" in elem ) {\n\t\t\treturn elem.disabled === disabled;\n\t\t}\n\n\t\t// Remaining elements are neither :enabled nor :disabled\n\t\treturn false;\n\t};\n}\n\n/**\n * Returns a function to use in pseudos for positionals\n * @param {Function} fn\n */\nfunction createPositionalPseudo( fn ) {\n\treturn markFunction(function( argument ) {\n\t\targument = +argument;\n\t\treturn markFunction(function( seed, matches ) {\n\t\t\tvar j,\n\t\t\t\tmatchIndexes = fn( [], seed.length, argument ),\n\t\t\t\ti = matchIndexes.length;\n\n\t\t\t// Match elements found at the specified indexes\n\t\t\twhile ( i-- ) {\n\t\t\t\tif ( seed[ (j = matchIndexes[i]) ] ) {\n\t\t\t\t\tseed[j] = !(matches[j] = seed[j]);\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t});\n}\n\n/**\n * Checks a node for validity as a Sizzle context\n * @param {Element|Object=} context\n * @returns {Element|Object|Boolean} The input node if acceptable, otherwise a falsy value\n */\nfunction testContext( context ) {\n\treturn context && typeof context.getElementsByTagName !== \"undefined\" && context;\n}\n\n// Expose support vars for convenience\nsupport = Sizzle.support = {};\n\n/**\n * Detects XML nodes\n * @param {Element|Object} elem An element or a document\n * @returns {Boolean} True iff elem is a non-HTML XML node\n */\nisXML = Sizzle.isXML = function( elem ) {\n\t// documentElement is verified for cases where it doesn't yet exist\n\t// (such as loading iframes in IE - #4833)\n\tvar documentElement = elem && (elem.ownerDocument || elem).documentElement;\n\treturn documentElement ? documentElement.nodeName !== \"HTML\" : false;\n};\n\n/**\n * Sets document-related variables once based on the current document\n * @param {Element|Object} [doc] An element or document object to use to set the document\n * @returns {Object} Returns the current document\n */\nsetDocument = Sizzle.setDocument = function( node ) {\n\tvar hasCompare, subWindow,\n\t\tdoc = node ? node.ownerDocument || node : preferredDoc;\n\n\t// Return early if doc is invalid or already selected\n\tif ( doc === document || doc.nodeType !== 9 || !doc.documentElement ) {\n\t\treturn document;\n\t}\n\n\t// Update global variables\n\tdocument = doc;\n\tdocElem = document.documentElement;\n\tdocumentIsHTML = !isXML( document );\n\n\t// Support: IE 9-11, Edge\n\t// Accessing iframe documents after unload throws \"permission denied\" errors (jQuery #13936)\n\tif ( preferredDoc !== document &&\n\t\t(subWindow = document.defaultView) && subWindow.top !== subWindow ) {\n\n\t\t// Support: IE 11, Edge\n\t\tif ( subWindow.addEventListener ) {\n\t\t\tsubWindow.addEventListener( \"unload\", unloadHandler, false );\n\n\t\t// Support: IE 9 - 10 only\n\t\t} else if ( subWindow.attachEvent ) {\n\t\t\tsubWindow.attachEvent( \"onunload\", unloadHandler );\n\t\t}\n\t}\n\n\t/* Attributes\n\t---------------------------------------------------------------------- */\n\n\t// Support: IE<8\n\t// Verify that getAttribute really returns attributes and not properties\n\t// (excepting IE8 booleans)\n\tsupport.attributes = assert(function( el ) {\n\t\tel.className = \"i\";\n\t\treturn !el.getAttribute(\"className\");\n\t});\n\n\t/* getElement(s)By*\n\t---------------------------------------------------------------------- */\n\n\t// Check if getElementsByTagName(\"*\") returns only elements\n\tsupport.getElementsByTagName = assert(function( el ) {\n\t\tel.appendChild( document.createComment(\"\") );\n\t\treturn !el.getElementsByTagName(\"*\").length;\n\t});\n\n\t// Support: IE<9\n\tsupport.getElementsByClassName = rnative.test( document.getElementsByClassName );\n\n\t// Support: IE<10\n\t// Check if getElementById returns elements by name\n\t// The broken getElementById methods don't pick up programmatically-set names,\n\t// so use a roundabout getElementsByName test\n\tsupport.getById = assert(function( el ) {\n\t\tdocElem.appendChild( el ).id = expando;\n\t\treturn !document.getElementsByName || !document.getElementsByName( expando ).length;\n\t});\n\n\t// ID filter and find\n\tif ( support.getById ) {\n\t\tExpr.filter[\"ID\"] = function( id ) {\n\t\t\tvar attrId = id.replace( runescape, funescape );\n\t\t\treturn function( elem ) {\n\t\t\t\treturn elem.getAttribute(\"id\") === attrId;\n\t\t\t};\n\t\t};\n\t\tExpr.find[\"ID\"] = function( id, context ) {\n\t\t\tif ( typeof context.getElementById !== \"undefined\" && documentIsHTML ) {\n\t\t\t\tvar elem = context.getElementById( id );\n\t\t\t\treturn elem ? [ elem ] : [];\n\t\t\t}\n\t\t};\n\t} else {\n\t\tExpr.filter[\"ID\"] =  function( id ) {\n\t\t\tvar attrId = id.replace( runescape, funescape );\n\t\t\treturn function( elem ) {\n\t\t\t\tvar node = typeof elem.getAttributeNode !== \"undefined\" &&\n\t\t\t\t\telem.getAttributeNode(\"id\");\n\t\t\t\treturn node && node.value === attrId;\n\t\t\t};\n\t\t};\n\n\t\t// Support: IE 6 - 7 only\n\t\t// getElementById is not reliable as a find shortcut\n\t\tExpr.find[\"ID\"] = function( id, context ) {\n\t\t\tif ( typeof context.getElementById !== \"undefined\" && documentIsHTML ) {\n\t\t\t\tvar node, i, elems,\n\t\t\t\t\telem = context.getElementById( id );\n\n\t\t\t\tif ( elem ) {\n\n\t\t\t\t\t// Verify the id attribute\n\t\t\t\t\tnode = elem.getAttributeNode(\"id\");\n\t\t\t\t\tif ( node && node.value === id ) {\n\t\t\t\t\t\treturn [ elem ];\n\t\t\t\t\t}\n\n\t\t\t\t\t// Fall back on getElementsByName\n\t\t\t\t\telems = context.getElementsByName( id );\n\t\t\t\t\ti = 0;\n\t\t\t\t\twhile ( (elem = elems[i++]) ) {\n\t\t\t\t\t\tnode = elem.getAttributeNode(\"id\");\n\t\t\t\t\t\tif ( node && node.value === id ) {\n\t\t\t\t\t\t\treturn [ elem ];\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\treturn [];\n\t\t\t}\n\t\t};\n\t}\n\n\t// Tag\n\tExpr.find[\"TAG\"] = support.getElementsByTagName ?\n\t\tfunction( tag, context ) {\n\t\t\tif ( typeof context.getElementsByTagName !== \"undefined\" ) {\n\t\t\t\treturn context.getElementsByTagName( tag );\n\n\t\t\t// DocumentFragment nodes don't have gEBTN\n\t\t\t} else if ( support.qsa ) {\n\t\t\t\treturn context.querySelectorAll( tag );\n\t\t\t}\n\t\t} :\n\n\t\tfunction( tag, context ) {\n\t\t\tvar elem,\n\t\t\t\ttmp = [],\n\t\t\t\ti = 0,\n\t\t\t\t// By happy coincidence, a (broken) gEBTN appears on DocumentFragment nodes too\n\t\t\t\tresults = context.getElementsByTagName( tag );\n\n\t\t\t// Filter out possible comments\n\t\t\tif ( tag === \"*\" ) {\n\t\t\t\twhile ( (elem = results[i++]) ) {\n\t\t\t\t\tif ( elem.nodeType === 1 ) {\n\t\t\t\t\t\ttmp.push( elem );\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\treturn tmp;\n\t\t\t}\n\t\t\treturn results;\n\t\t};\n\n\t// Class\n\tExpr.find[\"CLASS\"] = support.getElementsByClassName && function( className, context ) {\n\t\tif ( typeof context.getElementsByClassName !== \"undefined\" && documentIsHTML ) {\n\t\t\treturn context.getElementsByClassName( className );\n\t\t}\n\t};\n\n\t/* QSA/matchesSelector\n\t---------------------------------------------------------------------- */\n\n\t// QSA and matchesSelector support\n\n\t// matchesSelector(:active) reports false when true (IE9/Opera 11.5)\n\trbuggyMatches = [];\n\n\t// qSa(:focus) reports false when true (Chrome 21)\n\t// We allow this because of a bug in IE8/9 that throws an error\n\t// whenever `document.activeElement` is accessed on an iframe\n\t// So, we allow :focus to pass through QSA all the time to avoid the IE error\n\t// See https://bugs.jquery.com/ticket/13378\n\trbuggyQSA = [];\n\n\tif ( (support.qsa = rnative.test( document.querySelectorAll )) ) {\n\t\t// Build QSA regex\n\t\t// Regex strategy adopted from Diego Perini\n\t\tassert(function( el ) {\n\t\t\t// Select is set to empty string on purpose\n\t\t\t// This is to test IE's treatment of not explicitly\n\t\t\t// setting a boolean content attribute,\n\t\t\t// since its presence should be enough\n\t\t\t// https://bugs.jquery.com/ticket/12359\n\t\t\tdocElem.appendChild( el ).innerHTML = \"<a id='\" + expando + \"'></a>\" +\n\t\t\t\t\"<select id='\" + expando + \"-\\r\\\\' msallowcapture=''>\" +\n\t\t\t\t\"<option selected=''></option></select>\";\n\n\t\t\t// Support: IE8, Opera 11-12.16\n\t\t\t// Nothing should be selected when empty strings follow ^= or $= or *=\n\t\t\t// The test attribute must be unknown in Opera but \"safe\" for WinRT\n\t\t\t// https://msdn.microsoft.com/en-us/library/ie/hh465388.aspx#attribute_section\n\t\t\tif ( el.querySelectorAll(\"[msallowcapture^='']\").length ) {\n\t\t\t\trbuggyQSA.push( \"[*^$]=\" + whitespace + \"*(?:''|\\\"\\\")\" );\n\t\t\t}\n\n\t\t\t// Support: IE8\n\t\t\t// Boolean attributes and \"value\" are not treated correctly\n\t\t\tif ( !el.querySelectorAll(\"[selected]\").length ) {\n\t\t\t\trbuggyQSA.push( \"\\\\[\" + whitespace + \"*(?:value|\" + booleans + \")\" );\n\t\t\t}\n\n\t\t\t// Support: Chrome<29, Android<4.4, Safari<7.0+, iOS<7.0+, PhantomJS<1.9.8+\n\t\t\tif ( !el.querySelectorAll( \"[id~=\" + expando + \"-]\" ).length ) {\n\t\t\t\trbuggyQSA.push(\"~=\");\n\t\t\t}\n\n\t\t\t// Webkit/Opera - :checked should return selected option elements\n\t\t\t// http://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked\n\t\t\t// IE8 throws error here and will not see later tests\n\t\t\tif ( !el.querySelectorAll(\":checked\").length ) {\n\t\t\t\trbuggyQSA.push(\":checked\");\n\t\t\t}\n\n\t\t\t// Support: Safari 8+, iOS 8+\n\t\t\t// https://bugs.webkit.org/show_bug.cgi?id=136851\n\t\t\t// In-page `selector#id sibling-combinator selector` fails\n\t\t\tif ( !el.querySelectorAll( \"a#\" + expando + \"+*\" ).length ) {\n\t\t\t\trbuggyQSA.push(\".#.+[+~]\");\n\t\t\t}\n\t\t});\n\n\t\tassert(function( el ) {\n\t\t\tel.innerHTML = \"<a href='' disabled='disabled'></a>\" +\n\t\t\t\t\"<select disabled='disabled'><option/></select>\";\n\n\t\t\t// Support: Windows 8 Native Apps\n\t\t\t// The type and name attributes are restricted during .innerHTML assignment\n\t\t\tvar input = document.createElement(\"input\");\n\t\t\tinput.setAttribute( \"type\", \"hidden\" );\n\t\t\tel.appendChild( input ).setAttribute( \"name\", \"D\" );\n\n\t\t\t// Support: IE8\n\t\t\t// Enforce case-sensitivity of name attribute\n\t\t\tif ( el.querySelectorAll(\"[name=d]\").length ) {\n\t\t\t\trbuggyQSA.push( \"name\" + whitespace + \"*[*^$|!~]?=\" );\n\t\t\t}\n\n\t\t\t// FF 3.5 - :enabled/:disabled and hidden elements (hidden elements are still enabled)\n\t\t\t// IE8 throws error here and will not see later tests\n\t\t\tif ( el.querySelectorAll(\":enabled\").length !== 2 ) {\n\t\t\t\trbuggyQSA.push( \":enabled\", \":disabled\" );\n\t\t\t}\n\n\t\t\t// Support: IE9-11+\n\t\t\t// IE's :disabled selector does not pick up the children of disabled fieldsets\n\t\t\tdocElem.appendChild( el ).disabled = true;\n\t\t\tif ( el.querySelectorAll(\":disabled\").length !== 2 ) {\n\t\t\t\trbuggyQSA.push( \":enabled\", \":disabled\" );\n\t\t\t}\n\n\t\t\t// Opera 10-11 does not throw on post-comma invalid pseudos\n\t\t\tel.querySelectorAll(\"*,:x\");\n\t\t\trbuggyQSA.push(\",.*:\");\n\t\t});\n\t}\n\n\tif ( (support.matchesSelector = rnative.test( (matches = docElem.matches ||\n\t\tdocElem.webkitMatchesSelector ||\n\t\tdocElem.mozMatchesSelector ||\n\t\tdocElem.oMatchesSelector ||\n\t\tdocElem.msMatchesSelector) )) ) {\n\n\t\tassert(function( el ) {\n\t\t\t// Check to see if it's possible to do matchesSelector\n\t\t\t// on a disconnected node (IE 9)\n\t\t\tsupport.disconnectedMatch = matches.call( el, \"*\" );\n\n\t\t\t// This should fail with an exception\n\t\t\t// Gecko does not error, returns false instead\n\t\t\tmatches.call( el, \"[s!='']:x\" );\n\t\t\trbuggyMatches.push( \"!=\", pseudos );\n\t\t});\n\t}\n\n\trbuggyQSA = rbuggyQSA.length && new RegExp( rbuggyQSA.join(\"|\") );\n\trbuggyMatches = rbuggyMatches.length && new RegExp( rbuggyMatches.join(\"|\") );\n\n\t/* Contains\n\t---------------------------------------------------------------------- */\n\thasCompare = rnative.test( docElem.compareDocumentPosition );\n\n\t// Element contains another\n\t// Purposefully self-exclusive\n\t// As in, an element does not contain itself\n\tcontains = hasCompare || rnative.test( docElem.contains ) ?\n\t\tfunction( a, b ) {\n\t\t\tvar adown = a.nodeType === 9 ? a.documentElement : a,\n\t\t\t\tbup = b && b.parentNode;\n\t\t\treturn a === bup || !!( bup && bup.nodeType === 1 && (\n\t\t\t\tadown.contains ?\n\t\t\t\t\tadown.contains( bup ) :\n\t\t\t\t\ta.compareDocumentPosition && a.compareDocumentPosition( bup ) & 16\n\t\t\t));\n\t\t} :\n\t\tfunction( a, b ) {\n\t\t\tif ( b ) {\n\t\t\t\twhile ( (b = b.parentNode) ) {\n\t\t\t\t\tif ( b === a ) {\n\t\t\t\t\t\treturn true;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn false;\n\t\t};\n\n\t/* Sorting\n\t---------------------------------------------------------------------- */\n\n\t// Document order sorting\n\tsortOrder = hasCompare ?\n\tfunction( a, b ) {\n\n\t\t// Flag for duplicate removal\n\t\tif ( a === b ) {\n\t\t\thasDuplicate = true;\n\t\t\treturn 0;\n\t\t}\n\n\t\t// Sort on method existence if only one input has compareDocumentPosition\n\t\tvar compare = !a.compareDocumentPosition - !b.compareDocumentPosition;\n\t\tif ( compare ) {\n\t\t\treturn compare;\n\t\t}\n\n\t\t// Calculate position if both inputs belong to the same document\n\t\tcompare = ( a.ownerDocument || a ) === ( b.ownerDocument || b ) ?\n\t\t\ta.compareDocumentPosition( b ) :\n\n\t\t\t// Otherwise we know they are disconnected\n\t\t\t1;\n\n\t\t// Disconnected nodes\n\t\tif ( compare & 1 ||\n\t\t\t(!support.sortDetached && b.compareDocumentPosition( a ) === compare) ) {\n\n\t\t\t// Choose the first element that is related to our preferred document\n\t\t\tif ( a === document || a.ownerDocument === preferredDoc && contains(preferredDoc, a) ) {\n\t\t\t\treturn -1;\n\t\t\t}\n\t\t\tif ( b === document || b.ownerDocument === preferredDoc && contains(preferredDoc, b) ) {\n\t\t\t\treturn 1;\n\t\t\t}\n\n\t\t\t// Maintain original order\n\t\t\treturn sortInput ?\n\t\t\t\t( indexOf( sortInput, a ) - indexOf( sortInput, b ) ) :\n\t\t\t\t0;\n\t\t}\n\n\t\treturn compare & 4 ? -1 : 1;\n\t} :\n\tfunction( a, b ) {\n\t\t// Exit early if the nodes are identical\n\t\tif ( a === b ) {\n\t\t\thasDuplicate = true;\n\t\t\treturn 0;\n\t\t}\n\n\t\tvar cur,\n\t\t\ti = 0,\n\t\t\taup = a.parentNode,\n\t\t\tbup = b.parentNode,\n\t\t\tap = [ a ],\n\t\t\tbp = [ b ];\n\n\t\t// Parentless nodes are either documents or disconnected\n\t\tif ( !aup || !bup ) {\n\t\t\treturn a === document ? -1 :\n\t\t\t\tb === document ? 1 :\n\t\t\t\taup ? -1 :\n\t\t\t\tbup ? 1 :\n\t\t\t\tsortInput ?\n\t\t\t\t( indexOf( sortInput, a ) - indexOf( sortInput, b ) ) :\n\t\t\t\t0;\n\n\t\t// If the nodes are siblings, we can do a quick check\n\t\t} else if ( aup === bup ) {\n\t\t\treturn siblingCheck( a, b );\n\t\t}\n\n\t\t// Otherwise we need full lists of their ancestors for comparison\n\t\tcur = a;\n\t\twhile ( (cur = cur.parentNode) ) {\n\t\t\tap.unshift( cur );\n\t\t}\n\t\tcur = b;\n\t\twhile ( (cur = cur.parentNode) ) {\n\t\t\tbp.unshift( cur );\n\t\t}\n\n\t\t// Walk down the tree looking for a discrepancy\n\t\twhile ( ap[i] === bp[i] ) {\n\t\t\ti++;\n\t\t}\n\n\t\treturn i ?\n\t\t\t// Do a sibling check if the nodes have a common ancestor\n\t\t\tsiblingCheck( ap[i], bp[i] ) :\n\n\t\t\t// Otherwise nodes in our document sort first\n\t\t\tap[i] === preferredDoc ? -1 :\n\t\t\tbp[i] === preferredDoc ? 1 :\n\t\t\t0;\n\t};\n\n\treturn document;\n};\n\nSizzle.matches = function( expr, elements ) {\n\treturn Sizzle( expr, null, null, elements );\n};\n\nSizzle.matchesSelector = function( elem, expr ) {\n\t// Set document vars if needed\n\tif ( ( elem.ownerDocument || elem ) !== document ) {\n\t\tsetDocument( elem );\n\t}\n\n\t// Make sure that attribute selectors are quoted\n\texpr = expr.replace( rattributeQuotes, \"='$1']\" );\n\n\tif ( support.matchesSelector && documentIsHTML &&\n\t\t!compilerCache[ expr + \" \" ] &&\n\t\t( !rbuggyMatches || !rbuggyMatches.test( expr ) ) &&\n\t\t( !rbuggyQSA     || !rbuggyQSA.test( expr ) ) ) {\n\n\t\ttry {\n\t\t\tvar ret = matches.call( elem, expr );\n\n\t\t\t// IE 9's matchesSelector returns false on disconnected nodes\n\t\t\tif ( ret || support.disconnectedMatch ||\n\t\t\t\t\t// As well, disconnected nodes are said to be in a document\n\t\t\t\t\t// fragment in IE 9\n\t\t\t\t\telem.document && elem.document.nodeType !== 11 ) {\n\t\t\t\treturn ret;\n\t\t\t}\n\t\t} catch (e) {}\n\t}\n\n\treturn Sizzle( expr, document, null, [ elem ] ).length > 0;\n};\n\nSizzle.contains = function( context, elem ) {\n\t// Set document vars if needed\n\tif ( ( context.ownerDocument || context ) !== document ) {\n\t\tsetDocument( context );\n\t}\n\treturn contains( context, elem );\n};\n\nSizzle.attr = function( elem, name ) {\n\t// Set document vars if needed\n\tif ( ( elem.ownerDocument || elem ) !== document ) {\n\t\tsetDocument( elem );\n\t}\n\n\tvar fn = Expr.attrHandle[ name.toLowerCase() ],\n\t\t// Don't get fooled by Object.prototype properties (jQuery #13807)\n\t\tval = fn && hasOwn.call( Expr.attrHandle, name.toLowerCase() ) ?\n\t\t\tfn( elem, name, !documentIsHTML ) :\n\t\t\tundefined;\n\n\treturn val !== undefined ?\n\t\tval :\n\t\tsupport.attributes || !documentIsHTML ?\n\t\t\telem.getAttribute( name ) :\n\t\t\t(val = elem.getAttributeNode(name)) && val.specified ?\n\t\t\t\tval.value :\n\t\t\t\tnull;\n};\n\nSizzle.escape = function( sel ) {\n\treturn (sel + \"\").replace( rcssescape, fcssescape );\n};\n\nSizzle.error = function( msg ) {\n\tthrow new Error( \"Syntax error, unrecognized expression: \" + msg );\n};\n\n/**\n * Document sorting and removing duplicates\n * @param {ArrayLike} results\n */\nSizzle.uniqueSort = function( results ) {\n\tvar elem,\n\t\tduplicates = [],\n\t\tj = 0,\n\t\ti = 0;\n\n\t// Unless we *know* we can detect duplicates, assume their presence\n\thasDuplicate = !support.detectDuplicates;\n\tsortInput = !support.sortStable && results.slice( 0 );\n\tresults.sort( sortOrder );\n\n\tif ( hasDuplicate ) {\n\t\twhile ( (elem = results[i++]) ) {\n\t\t\tif ( elem === results[ i ] ) {\n\t\t\t\tj = duplicates.push( i );\n\t\t\t}\n\t\t}\n\t\twhile ( j-- ) {\n\t\t\tresults.splice( duplicates[ j ], 1 );\n\t\t}\n\t}\n\n\t// Clear input after sorting to release objects\n\t// See https://github.com/jquery/sizzle/pull/225\n\tsortInput = null;\n\n\treturn results;\n};\n\n/**\n * Utility function for retrieving the text value of an array of DOM nodes\n * @param {Array|Element} elem\n */\ngetText = Sizzle.getText = function( elem ) {\n\tvar node,\n\t\tret = \"\",\n\t\ti = 0,\n\t\tnodeType = elem.nodeType;\n\n\tif ( !nodeType ) {\n\t\t// If no nodeType, this is expected to be an array\n\t\twhile ( (node = elem[i++]) ) {\n\t\t\t// Do not traverse comment nodes\n\t\t\tret += getText( node );\n\t\t}\n\t} else if ( nodeType === 1 || nodeType === 9 || nodeType === 11 ) {\n\t\t// Use textContent for elements\n\t\t// innerText usage removed for consistency of new lines (jQuery #11153)\n\t\tif ( typeof elem.textContent === \"string\" ) {\n\t\t\treturn elem.textContent;\n\t\t} else {\n\t\t\t// Traverse its children\n\t\t\tfor ( elem = elem.firstChild; elem; elem = elem.nextSibling ) {\n\t\t\t\tret += getText( elem );\n\t\t\t}\n\t\t}\n\t} else if ( nodeType === 3 || nodeType === 4 ) {\n\t\treturn elem.nodeValue;\n\t}\n\t// Do not include comment or processing instruction nodes\n\n\treturn ret;\n};\n\nExpr = Sizzle.selectors = {\n\n\t// Can be adjusted by the user\n\tcacheLength: 50,\n\n\tcreatePseudo: markFunction,\n\n\tmatch: matchExpr,\n\n\tattrHandle: {},\n\n\tfind: {},\n\n\trelative: {\n\t\t\">\": { dir: \"parentNode\", first: true },\n\t\t\" \": { dir: \"parentNode\" },\n\t\t\"+\": { dir: \"previousSibling\", first: true },\n\t\t\"~\": { dir: \"previousSibling\" }\n\t},\n\n\tpreFilter: {\n\t\t\"ATTR\": function( match ) {\n\t\t\tmatch[1] = match[1].replace( runescape, funescape );\n\n\t\t\t// Move the given value to match[3] whether quoted or unquoted\n\t\t\tmatch[3] = ( match[3] || match[4] || match[5] || \"\" ).replace( runescape, funescape );\n\n\t\t\tif ( match[2] === \"~=\" ) {\n\t\t\t\tmatch[3] = \" \" + match[3] + \" \";\n\t\t\t}\n\n\t\t\treturn match.slice( 0, 4 );\n\t\t},\n\n\t\t\"CHILD\": function( match ) {\n\t\t\t/* matches from matchExpr[\"CHILD\"]\n\t\t\t\t1 type (only|nth|...)\n\t\t\t\t2 what (child|of-type)\n\t\t\t\t3 argument (even|odd|\\d*|\\d*n([+-]\\d+)?|...)\n\t\t\t\t4 xn-component of xn+y argument ([+-]?\\d*n|)\n\t\t\t\t5 sign of xn-component\n\t\t\t\t6 x of xn-component\n\t\t\t\t7 sign of y-component\n\t\t\t\t8 y of y-component\n\t\t\t*/\n\t\t\tmatch[1] = match[1].toLowerCase();\n\n\t\t\tif ( match[1].slice( 0, 3 ) === \"nth\" ) {\n\t\t\t\t// nth-* requires argument\n\t\t\t\tif ( !match[3] ) {\n\t\t\t\t\tSizzle.error( match[0] );\n\t\t\t\t}\n\n\t\t\t\t// numeric x and y parameters for Expr.filter.CHILD\n\t\t\t\t// remember that false/true cast respectively to 0/1\n\t\t\t\tmatch[4] = +( match[4] ? match[5] + (match[6] || 1) : 2 * ( match[3] === \"even\" || match[3] === \"odd\" ) );\n\t\t\t\tmatch[5] = +( ( match[7] + match[8] ) || match[3] === \"odd\" );\n\n\t\t\t// other types prohibit arguments\n\t\t\t} else if ( match[3] ) {\n\t\t\t\tSizzle.error( match[0] );\n\t\t\t}\n\n\t\t\treturn match;\n\t\t},\n\n\t\t\"PSEUDO\": function( match ) {\n\t\t\tvar excess,\n\t\t\t\tunquoted = !match[6] && match[2];\n\n\t\t\tif ( matchExpr[\"CHILD\"].test( match[0] ) ) {\n\t\t\t\treturn null;\n\t\t\t}\n\n\t\t\t// Accept quoted arguments as-is\n\t\t\tif ( match[3] ) {\n\t\t\t\tmatch[2] = match[4] || match[5] || \"\";\n\n\t\t\t// Strip excess characters from unquoted arguments\n\t\t\t} else if ( unquoted && rpseudo.test( unquoted ) &&\n\t\t\t\t// Get excess from tokenize (recursively)\n\t\t\t\t(excess = tokenize( unquoted, true )) &&\n\t\t\t\t// advance to the next closing parenthesis\n\t\t\t\t(excess = unquoted.indexOf( \")\", unquoted.length - excess ) - unquoted.length) ) {\n\n\t\t\t\t// excess is a negative index\n\t\t\t\tmatch[0] = match[0].slice( 0, excess );\n\t\t\t\tmatch[2] = unquoted.slice( 0, excess );\n\t\t\t}\n\n\t\t\t// Return only captures needed by the pseudo filter method (type and argument)\n\t\t\treturn match.slice( 0, 3 );\n\t\t}\n\t},\n\n\tfilter: {\n\n\t\t\"TAG\": function( nodeNameSelector ) {\n\t\t\tvar nodeName = nodeNameSelector.replace( runescape, funescape ).toLowerCase();\n\t\t\treturn nodeNameSelector === \"*\" ?\n\t\t\t\tfunction() { return true; } :\n\t\t\t\tfunction( elem ) {\n\t\t\t\t\treturn elem.nodeName && elem.nodeName.toLowerCase() === nodeName;\n\t\t\t\t};\n\t\t},\n\n\t\t\"CLASS\": function( className ) {\n\t\t\tvar pattern = classCache[ className + \" \" ];\n\n\t\t\treturn pattern ||\n\t\t\t\t(pattern = new RegExp( \"(^|\" + whitespace + \")\" + className + \"(\" + whitespace + \"|$)\" )) &&\n\t\t\t\tclassCache( className, function( elem ) {\n\t\t\t\t\treturn pattern.test( typeof elem.className === \"string\" && elem.className || typeof elem.getAttribute !== \"undefined\" && elem.getAttribute(\"class\") || \"\" );\n\t\t\t\t});\n\t\t},\n\n\t\t\"ATTR\": function( name, operator, check ) {\n\t\t\treturn function( elem ) {\n\t\t\t\tvar result = Sizzle.attr( elem, name );\n\n\t\t\t\tif ( result == null ) {\n\t\t\t\t\treturn operator === \"!=\";\n\t\t\t\t}\n\t\t\t\tif ( !operator ) {\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\n\t\t\t\tresult += \"\";\n\n\t\t\t\treturn operator === \"=\" ? result === check :\n\t\t\t\t\toperator === \"!=\" ? result !== check :\n\t\t\t\t\toperator === \"^=\" ? check && result.indexOf( check ) === 0 :\n\t\t\t\t\toperator === \"*=\" ? check && result.indexOf( check ) > -1 :\n\t\t\t\t\toperator === \"$=\" ? check && result.slice( -check.length ) === check :\n\t\t\t\t\toperator === \"~=\" ? ( \" \" + result.replace( rwhitespace, \" \" ) + \" \" ).indexOf( check ) > -1 :\n\t\t\t\t\toperator === \"|=\" ? result === check || result.slice( 0, check.length + 1 ) === check + \"-\" :\n\t\t\t\t\tfalse;\n\t\t\t};\n\t\t},\n\n\t\t\"CHILD\": function( type, what, argument, first, last ) {\n\t\t\tvar simple = type.slice( 0, 3 ) !== \"nth\",\n\t\t\t\tforward = type.slice( -4 ) !== \"last\",\n\t\t\t\tofType = what === \"of-type\";\n\n\t\t\treturn first === 1 && last === 0 ?\n\n\t\t\t\t// Shortcut for :nth-*(n)\n\t\t\t\tfunction( elem ) {\n\t\t\t\t\treturn !!elem.parentNode;\n\t\t\t\t} :\n\n\t\t\t\tfunction( elem, context, xml ) {\n\t\t\t\t\tvar cache, uniqueCache, outerCache, node, nodeIndex, start,\n\t\t\t\t\t\tdir = simple !== forward ? \"nextSibling\" : \"previousSibling\",\n\t\t\t\t\t\tparent = elem.parentNode,\n\t\t\t\t\t\tname = ofType && elem.nodeName.toLowerCase(),\n\t\t\t\t\t\tuseCache = !xml && !ofType,\n\t\t\t\t\t\tdiff = false;\n\n\t\t\t\t\tif ( parent ) {\n\n\t\t\t\t\t\t// :(first|last|only)-(child|of-type)\n\t\t\t\t\t\tif ( simple ) {\n\t\t\t\t\t\t\twhile ( dir ) {\n\t\t\t\t\t\t\t\tnode = elem;\n\t\t\t\t\t\t\t\twhile ( (node = node[ dir ]) ) {\n\t\t\t\t\t\t\t\t\tif ( ofType ?\n\t\t\t\t\t\t\t\t\t\tnode.nodeName.toLowerCase() === name :\n\t\t\t\t\t\t\t\t\t\tnode.nodeType === 1 ) {\n\n\t\t\t\t\t\t\t\t\t\treturn false;\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t// Reverse direction for :only-* (if we haven't yet done so)\n\t\t\t\t\t\t\t\tstart = dir = type === \"only\" && !start && \"nextSibling\";\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\treturn true;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tstart = [ forward ? parent.firstChild : parent.lastChild ];\n\n\t\t\t\t\t\t// non-xml :nth-child(...) stores cache data on `parent`\n\t\t\t\t\t\tif ( forward && useCache ) {\n\n\t\t\t\t\t\t\t// Seek `elem` from a previously-cached index\n\n\t\t\t\t\t\t\t// ...in a gzip-friendly way\n\t\t\t\t\t\t\tnode = parent;\n\t\t\t\t\t\t\touterCache = node[ expando ] || (node[ expando ] = {});\n\n\t\t\t\t\t\t\t// Support: IE <9 only\n\t\t\t\t\t\t\t// Defend against cloned attroperties (jQuery gh-1709)\n\t\t\t\t\t\t\tuniqueCache = outerCache[ node.uniqueID ] ||\n\t\t\t\t\t\t\t\t(outerCache[ node.uniqueID ] = {});\n\n\t\t\t\t\t\t\tcache = uniqueCache[ type ] || [];\n\t\t\t\t\t\t\tnodeIndex = cache[ 0 ] === dirruns && cache[ 1 ];\n\t\t\t\t\t\t\tdiff = nodeIndex && cache[ 2 ];\n\t\t\t\t\t\t\tnode = nodeIndex && parent.childNodes[ nodeIndex ];\n\n\t\t\t\t\t\t\twhile ( (node = ++nodeIndex && node && node[ dir ] ||\n\n\t\t\t\t\t\t\t\t// Fallback to seeking `elem` from the start\n\t\t\t\t\t\t\t\t(diff = nodeIndex = 0) || start.pop()) ) {\n\n\t\t\t\t\t\t\t\t// When found, cache indexes on `parent` and break\n\t\t\t\t\t\t\t\tif ( node.nodeType === 1 && ++diff && node === elem ) {\n\t\t\t\t\t\t\t\t\tuniqueCache[ type ] = [ dirruns, nodeIndex, diff ];\n\t\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t// Use previously-cached element index if available\n\t\t\t\t\t\t\tif ( useCache ) {\n\t\t\t\t\t\t\t\t// ...in a gzip-friendly way\n\t\t\t\t\t\t\t\tnode = elem;\n\t\t\t\t\t\t\t\touterCache = node[ expando ] || (node[ expando ] = {});\n\n\t\t\t\t\t\t\t\t// Support: IE <9 only\n\t\t\t\t\t\t\t\t// Defend against cloned attroperties (jQuery gh-1709)\n\t\t\t\t\t\t\t\tuniqueCache = outerCache[ node.uniqueID ] ||\n\t\t\t\t\t\t\t\t\t(outerCache[ node.uniqueID ] = {});\n\n\t\t\t\t\t\t\t\tcache = uniqueCache[ type ] || [];\n\t\t\t\t\t\t\t\tnodeIndex = cache[ 0 ] === dirruns && cache[ 1 ];\n\t\t\t\t\t\t\t\tdiff = nodeIndex;\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t// xml :nth-child(...)\n\t\t\t\t\t\t\t// or :nth-last-child(...) or :nth(-last)?-of-type(...)\n\t\t\t\t\t\t\tif ( diff === false ) {\n\t\t\t\t\t\t\t\t// Use the same loop as above to seek `elem` from the start\n\t\t\t\t\t\t\t\twhile ( (node = ++nodeIndex && node && node[ dir ] ||\n\t\t\t\t\t\t\t\t\t(diff = nodeIndex = 0) || start.pop()) ) {\n\n\t\t\t\t\t\t\t\t\tif ( ( ofType ?\n\t\t\t\t\t\t\t\t\t\tnode.nodeName.toLowerCase() === name :\n\t\t\t\t\t\t\t\t\t\tnode.nodeType === 1 ) &&\n\t\t\t\t\t\t\t\t\t\t++diff ) {\n\n\t\t\t\t\t\t\t\t\t\t// Cache the index of each encountered element\n\t\t\t\t\t\t\t\t\t\tif ( useCache ) {\n\t\t\t\t\t\t\t\t\t\t\touterCache = node[ expando ] || (node[ expando ] = {});\n\n\t\t\t\t\t\t\t\t\t\t\t// Support: IE <9 only\n\t\t\t\t\t\t\t\t\t\t\t// Defend against cloned attroperties (jQuery gh-1709)\n\t\t\t\t\t\t\t\t\t\t\tuniqueCache = outerCache[ node.uniqueID ] ||\n\t\t\t\t\t\t\t\t\t\t\t\t(outerCache[ node.uniqueID ] = {});\n\n\t\t\t\t\t\t\t\t\t\t\tuniqueCache[ type ] = [ dirruns, diff ];\n\t\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\t\tif ( node === elem ) {\n\t\t\t\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// Incorporate the offset, then check against cycle size\n\t\t\t\t\t\tdiff -= last;\n\t\t\t\t\t\treturn diff === first || ( diff % first === 0 && diff / first >= 0 );\n\t\t\t\t\t}\n\t\t\t\t};\n\t\t},\n\n\t\t\"PSEUDO\": function( pseudo, argument ) {\n\t\t\t// pseudo-class names are case-insensitive\n\t\t\t// http://www.w3.org/TR/selectors/#pseudo-classes\n\t\t\t// Prioritize by case sensitivity in case custom pseudos are added with uppercase letters\n\t\t\t// Remember that setFilters inherits from pseudos\n\t\t\tvar args,\n\t\t\t\tfn = Expr.pseudos[ pseudo ] || Expr.setFilters[ pseudo.toLowerCase() ] ||\n\t\t\t\t\tSizzle.error( \"unsupported pseudo: \" + pseudo );\n\n\t\t\t// The user may use createPseudo to indicate that\n\t\t\t// arguments are needed to create the filter function\n\t\t\t// just as Sizzle does\n\t\t\tif ( fn[ expando ] ) {\n\t\t\t\treturn fn( argument );\n\t\t\t}\n\n\t\t\t// But maintain support for old signatures\n\t\t\tif ( fn.length > 1 ) {\n\t\t\t\targs = [ pseudo, pseudo, \"\", argument ];\n\t\t\t\treturn Expr.setFilters.hasOwnProperty( pseudo.toLowerCase() ) ?\n\t\t\t\t\tmarkFunction(function( seed, matches ) {\n\t\t\t\t\t\tvar idx,\n\t\t\t\t\t\t\tmatched = fn( seed, argument ),\n\t\t\t\t\t\t\ti = matched.length;\n\t\t\t\t\t\twhile ( i-- ) {\n\t\t\t\t\t\t\tidx = indexOf( seed, matched[i] );\n\t\t\t\t\t\t\tseed[ idx ] = !( matches[ idx ] = matched[i] );\n\t\t\t\t\t\t}\n\t\t\t\t\t}) :\n\t\t\t\t\tfunction( elem ) {\n\t\t\t\t\t\treturn fn( elem, 0, args );\n\t\t\t\t\t};\n\t\t\t}\n\n\t\t\treturn fn;\n\t\t}\n\t},\n\n\tpseudos: {\n\t\t// Potentially complex pseudos\n\t\t\"not\": markFunction(function( selector ) {\n\t\t\t// Trim the selector passed to compile\n\t\t\t// to avoid treating leading and trailing\n\t\t\t// spaces as combinators\n\t\t\tvar input = [],\n\t\t\t\tresults = [],\n\t\t\t\tmatcher = compile( selector.replace( rtrim, \"$1\" ) );\n\n\t\t\treturn matcher[ expando ] ?\n\t\t\t\tmarkFunction(function( seed, matches, context, xml ) {\n\t\t\t\t\tvar elem,\n\t\t\t\t\t\tunmatched = matcher( seed, null, xml, [] ),\n\t\t\t\t\t\ti = seed.length;\n\n\t\t\t\t\t// Match elements unmatched by `matcher`\n\t\t\t\t\twhile ( i-- ) {\n\t\t\t\t\t\tif ( (elem = unmatched[i]) ) {\n\t\t\t\t\t\t\tseed[i] = !(matches[i] = elem);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}) :\n\t\t\t\tfunction( elem, context, xml ) {\n\t\t\t\t\tinput[0] = elem;\n\t\t\t\t\tmatcher( input, null, xml, results );\n\t\t\t\t\t// Don't keep the element (issue #299)\n\t\t\t\t\tinput[0] = null;\n\t\t\t\t\treturn !results.pop();\n\t\t\t\t};\n\t\t}),\n\n\t\t\"has\": markFunction(function( selector ) {\n\t\t\treturn function( elem ) {\n\t\t\t\treturn Sizzle( selector, elem ).length > 0;\n\t\t\t};\n\t\t}),\n\n\t\t\"contains\": markFunction(function( text ) {\n\t\t\ttext = text.replace( runescape, funescape );\n\t\t\treturn function( elem ) {\n\t\t\t\treturn ( elem.textContent || elem.innerText || getText( elem ) ).indexOf( text ) > -1;\n\t\t\t};\n\t\t}),\n\n\t\t// \"Whether an element is represented by a :lang() selector\n\t\t// is based solely on the element's language value\n\t\t// being equal to the identifier C,\n\t\t// or beginning with the identifier C immediately followed by \"-\".\n\t\t// The matching of C against the element's language value is performed case-insensitively.\n\t\t// The identifier C does not have to be a valid language name.\"\n\t\t// http://www.w3.org/TR/selectors/#lang-pseudo\n\t\t\"lang\": markFunction( function( lang ) {\n\t\t\t// lang value must be a valid identifier\n\t\t\tif ( !ridentifier.test(lang || \"\") ) {\n\t\t\t\tSizzle.error( \"unsupported lang: \" + lang );\n\t\t\t}\n\t\t\tlang = lang.replace( runescape, funescape ).toLowerCase();\n\t\t\treturn function( elem ) {\n\t\t\t\tvar elemLang;\n\t\t\t\tdo {\n\t\t\t\t\tif ( (elemLang = documentIsHTML ?\n\t\t\t\t\t\telem.lang :\n\t\t\t\t\t\telem.getAttribute(\"xml:lang\") || elem.getAttribute(\"lang\")) ) {\n\n\t\t\t\t\t\telemLang = elemLang.toLowerCase();\n\t\t\t\t\t\treturn elemLang === lang || elemLang.indexOf( lang + \"-\" ) === 0;\n\t\t\t\t\t}\n\t\t\t\t} while ( (elem = elem.parentNode) && elem.nodeType === 1 );\n\t\t\t\treturn false;\n\t\t\t};\n\t\t}),\n\n\t\t// Miscellaneous\n\t\t\"target\": function( elem ) {\n\t\t\tvar hash = window.location && window.location.hash;\n\t\t\treturn hash && hash.slice( 1 ) === elem.id;\n\t\t},\n\n\t\t\"root\": function( elem ) {\n\t\t\treturn elem === docElem;\n\t\t},\n\n\t\t\"focus\": function( elem ) {\n\t\t\treturn elem === document.activeElement && (!document.hasFocus || document.hasFocus()) && !!(elem.type || elem.href || ~elem.tabIndex);\n\t\t},\n\n\t\t// Boolean properties\n\t\t\"enabled\": createDisabledPseudo( false ),\n\t\t\"disabled\": createDisabledPseudo( true ),\n\n\t\t\"checked\": function( elem ) {\n\t\t\t// In CSS3, :checked should return both checked and selected elements\n\t\t\t// http://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked\n\t\t\tvar nodeName = elem.nodeName.toLowerCase();\n\t\t\treturn (nodeName === \"input\" && !!elem.checked) || (nodeName === \"option\" && !!elem.selected);\n\t\t},\n\n\t\t\"selected\": function( elem ) {\n\t\t\t// Accessing this property makes selected-by-default\n\t\t\t// options in Safari work properly\n\t\t\tif ( elem.parentNode ) {\n\t\t\t\telem.parentNode.selectedIndex;\n\t\t\t}\n\n\t\t\treturn elem.selected === true;\n\t\t},\n\n\t\t// Contents\n\t\t\"empty\": function( elem ) {\n\t\t\t// http://www.w3.org/TR/selectors/#empty-pseudo\n\t\t\t// :empty is negated by element (1) or content nodes (text: 3; cdata: 4; entity ref: 5),\n\t\t\t//   but not by others (comment: 8; processing instruction: 7; etc.)\n\t\t\t// nodeType < 6 works because attributes (2) do not appear as children\n\t\t\tfor ( elem = elem.firstChild; elem; elem = elem.nextSibling ) {\n\t\t\t\tif ( elem.nodeType < 6 ) {\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn true;\n\t\t},\n\n\t\t\"parent\": function( elem ) {\n\t\t\treturn !Expr.pseudos[\"empty\"]( elem );\n\t\t},\n\n\t\t// Element/input types\n\t\t\"header\": function( elem ) {\n\t\t\treturn rheader.test( elem.nodeName );\n\t\t},\n\n\t\t\"input\": function( elem ) {\n\t\t\treturn rinputs.test( elem.nodeName );\n\t\t},\n\n\t\t\"button\": function( elem ) {\n\t\t\tvar name = elem.nodeName.toLowerCase();\n\t\t\treturn name === \"input\" && elem.type === \"button\" || name === \"button\";\n\t\t},\n\n\t\t\"text\": function( elem ) {\n\t\t\tvar attr;\n\t\t\treturn elem.nodeName.toLowerCase() === \"input\" &&\n\t\t\t\telem.type === \"text\" &&\n\n\t\t\t\t// Support: IE<8\n\t\t\t\t// New HTML5 attribute values (e.g., \"search\") appear with elem.type === \"text\"\n\t\t\t\t( (attr = elem.getAttribute(\"type\")) == null || attr.toLowerCase() === \"text\" );\n\t\t},\n\n\t\t// Position-in-collection\n\t\t\"first\": createPositionalPseudo(function() {\n\t\t\treturn [ 0 ];\n\t\t}),\n\n\t\t\"last\": createPositionalPseudo(function( matchIndexes, length ) {\n\t\t\treturn [ length - 1 ];\n\t\t}),\n\n\t\t\"eq\": createPositionalPseudo(function( matchIndexes, length, argument ) {\n\t\t\treturn [ argument < 0 ? argument + length : argument ];\n\t\t}),\n\n\t\t\"even\": createPositionalPseudo(function( matchIndexes, length ) {\n\t\t\tvar i = 0;\n\t\t\tfor ( ; i < length; i += 2 ) {\n\t\t\t\tmatchIndexes.push( i );\n\t\t\t}\n\t\t\treturn matchIndexes;\n\t\t}),\n\n\t\t\"odd\": createPositionalPseudo(function( matchIndexes, length ) {\n\t\t\tvar i = 1;\n\t\t\tfor ( ; i < length; i += 2 ) {\n\t\t\t\tmatchIndexes.push( i );\n\t\t\t}\n\t\t\treturn matchIndexes;\n\t\t}),\n\n\t\t\"lt\": createPositionalPseudo(function( matchIndexes, length, argument ) {\n\t\t\tvar i = argument < 0 ? argument + length : argument;\n\t\t\tfor ( ; --i >= 0; ) {\n\t\t\t\tmatchIndexes.push( i );\n\t\t\t}\n\t\t\treturn matchIndexes;\n\t\t}),\n\n\t\t\"gt\": createPositionalPseudo(function( matchIndexes, length, argument ) {\n\t\t\tvar i = argument < 0 ? argument + length : argument;\n\t\t\tfor ( ; ++i < length; ) {\n\t\t\t\tmatchIndexes.push( i );\n\t\t\t}\n\t\t\treturn matchIndexes;\n\t\t})\n\t}\n};\n\nExpr.pseudos[\"nth\"] = Expr.pseudos[\"eq\"];\n\n// Add button/input type pseudos\nfor ( i in { radio: true, checkbox: true, file: true, password: true, image: true } ) {\n\tExpr.pseudos[ i ] = createInputPseudo( i );\n}\nfor ( i in { submit: true, reset: true } ) {\n\tExpr.pseudos[ i ] = createButtonPseudo( i );\n}\n\n// Easy API for creating new setFilters\nfunction setFilters() {}\nsetFilters.prototype = Expr.filters = Expr.pseudos;\nExpr.setFilters = new setFilters();\n\ntokenize = Sizzle.tokenize = function( selector, parseOnly ) {\n\tvar matched, match, tokens, type,\n\t\tsoFar, groups, preFilters,\n\t\tcached = tokenCache[ selector + \" \" ];\n\n\tif ( cached ) {\n\t\treturn parseOnly ? 0 : cached.slice( 0 );\n\t}\n\n\tsoFar = selector;\n\tgroups = [];\n\tpreFilters = Expr.preFilter;\n\n\twhile ( soFar ) {\n\n\t\t// Comma and first run\n\t\tif ( !matched || (match = rcomma.exec( soFar )) ) {\n\t\t\tif ( match ) {\n\t\t\t\t// Don't consume trailing commas as valid\n\t\t\t\tsoFar = soFar.slice( match[0].length ) || soFar;\n\t\t\t}\n\t\t\tgroups.push( (tokens = []) );\n\t\t}\n\n\t\tmatched = false;\n\n\t\t// Combinators\n\t\tif ( (match = rcombinators.exec( soFar )) ) {\n\t\t\tmatched = match.shift();\n\t\t\ttokens.push({\n\t\t\t\tvalue: matched,\n\t\t\t\t// Cast descendant combinators to space\n\t\t\t\ttype: match[0].replace( rtrim, \" \" )\n\t\t\t});\n\t\t\tsoFar = soFar.slice( matched.length );\n\t\t}\n\n\t\t// Filters\n\t\tfor ( type in Expr.filter ) {\n\t\t\tif ( (match = matchExpr[ type ].exec( soFar )) && (!preFilters[ type ] ||\n\t\t\t\t(match = preFilters[ type ]( match ))) ) {\n\t\t\t\tmatched = match.shift();\n\t\t\t\ttokens.push({\n\t\t\t\t\tvalue: matched,\n\t\t\t\t\ttype: type,\n\t\t\t\t\tmatches: match\n\t\t\t\t});\n\t\t\t\tsoFar = soFar.slice( matched.length );\n\t\t\t}\n\t\t}\n\n\t\tif ( !matched ) {\n\t\t\tbreak;\n\t\t}\n\t}\n\n\t// Return the length of the invalid excess\n\t// if we're just parsing\n\t// Otherwise, throw an error or return tokens\n\treturn parseOnly ?\n\t\tsoFar.length :\n\t\tsoFar ?\n\t\t\tSizzle.error( selector ) :\n\t\t\t// Cache the tokens\n\t\t\ttokenCache( selector, groups ).slice( 0 );\n};\n\nfunction toSelector( tokens ) {\n\tvar i = 0,\n\t\tlen = tokens.length,\n\t\tselector = \"\";\n\tfor ( ; i < len; i++ ) {\n\t\tselector += tokens[i].value;\n\t}\n\treturn selector;\n}\n\nfunction addCombinator( matcher, combinator, base ) {\n\tvar dir = combinator.dir,\n\t\tskip = combinator.next,\n\t\tkey = skip || dir,\n\t\tcheckNonElements = base && key === \"parentNode\",\n\t\tdoneName = done++;\n\n\treturn combinator.first ?\n\t\t// Check against closest ancestor/preceding element\n\t\tfunction( elem, context, xml ) {\n\t\t\twhile ( (elem = elem[ dir ]) ) {\n\t\t\t\tif ( elem.nodeType === 1 || checkNonElements ) {\n\t\t\t\t\treturn matcher( elem, context, xml );\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn false;\n\t\t} :\n\n\t\t// Check against all ancestor/preceding elements\n\t\tfunction( elem, context, xml ) {\n\t\t\tvar oldCache, uniqueCache, outerCache,\n\t\t\t\tnewCache = [ dirruns, doneName ];\n\n\t\t\t// We can't set arbitrary data on XML nodes, so they don't benefit from combinator caching\n\t\t\tif ( xml ) {\n\t\t\t\twhile ( (elem = elem[ dir ]) ) {\n\t\t\t\t\tif ( elem.nodeType === 1 || checkNonElements ) {\n\t\t\t\t\t\tif ( matcher( elem, context, xml ) ) {\n\t\t\t\t\t\t\treturn true;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\twhile ( (elem = elem[ dir ]) ) {\n\t\t\t\t\tif ( elem.nodeType === 1 || checkNonElements ) {\n\t\t\t\t\t\touterCache = elem[ expando ] || (elem[ expando ] = {});\n\n\t\t\t\t\t\t// Support: IE <9 only\n\t\t\t\t\t\t// Defend against cloned attroperties (jQuery gh-1709)\n\t\t\t\t\t\tuniqueCache = outerCache[ elem.uniqueID ] || (outerCache[ elem.uniqueID ] = {});\n\n\t\t\t\t\t\tif ( skip && skip === elem.nodeName.toLowerCase() ) {\n\t\t\t\t\t\t\telem = elem[ dir ] || elem;\n\t\t\t\t\t\t} else if ( (oldCache = uniqueCache[ key ]) &&\n\t\t\t\t\t\t\toldCache[ 0 ] === dirruns && oldCache[ 1 ] === doneName ) {\n\n\t\t\t\t\t\t\t// Assign to newCache so results back-propagate to previous elements\n\t\t\t\t\t\t\treturn (newCache[ 2 ] = oldCache[ 2 ]);\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t// Reuse newcache so results back-propagate to previous elements\n\t\t\t\t\t\t\tuniqueCache[ key ] = newCache;\n\n\t\t\t\t\t\t\t// A match means we're done; a fail means we have to keep checking\n\t\t\t\t\t\t\tif ( (newCache[ 2 ] = matcher( elem, context, xml )) ) {\n\t\t\t\t\t\t\t\treturn true;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn false;\n\t\t};\n}\n\nfunction elementMatcher( matchers ) {\n\treturn matchers.length > 1 ?\n\t\tfunction( elem, context, xml ) {\n\t\t\tvar i = matchers.length;\n\t\t\twhile ( i-- ) {\n\t\t\t\tif ( !matchers[i]( elem, context, xml ) ) {\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn true;\n\t\t} :\n\t\tmatchers[0];\n}\n\nfunction multipleContexts( selector, contexts, results ) {\n\tvar i = 0,\n\t\tlen = contexts.length;\n\tfor ( ; i < len; i++ ) {\n\t\tSizzle( selector, contexts[i], results );\n\t}\n\treturn results;\n}\n\nfunction condense( unmatched, map, filter, context, xml ) {\n\tvar elem,\n\t\tnewUnmatched = [],\n\t\ti = 0,\n\t\tlen = unmatched.length,\n\t\tmapped = map != null;\n\n\tfor ( ; i < len; i++ ) {\n\t\tif ( (elem = unmatched[i]) ) {\n\t\t\tif ( !filter || filter( elem, context, xml ) ) {\n\t\t\t\tnewUnmatched.push( elem );\n\t\t\t\tif ( mapped ) {\n\t\t\t\t\tmap.push( i );\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\treturn newUnmatched;\n}\n\nfunction setMatcher( preFilter, selector, matcher, postFilter, postFinder, postSelector ) {\n\tif ( postFilter && !postFilter[ expando ] ) {\n\t\tpostFilter = setMatcher( postFilter );\n\t}\n\tif ( postFinder && !postFinder[ expando ] ) {\n\t\tpostFinder = setMatcher( postFinder, postSelector );\n\t}\n\treturn markFunction(function( seed, results, context, xml ) {\n\t\tvar temp, i, elem,\n\t\t\tpreMap = [],\n\t\t\tpostMap = [],\n\t\t\tpreexisting = results.length,\n\n\t\t\t// Get initial elements from seed or context\n\t\t\telems = seed || multipleContexts( selector || \"*\", context.nodeType ? [ context ] : context, [] ),\n\n\t\t\t// Prefilter to get matcher input, preserving a map for seed-results synchronization\n\t\t\tmatcherIn = preFilter && ( seed || !selector ) ?\n\t\t\t\tcondense( elems, preMap, preFilter, context, xml ) :\n\t\t\t\telems,\n\n\t\t\tmatcherOut = matcher ?\n\t\t\t\t// If we have a postFinder, or filtered seed, or non-seed postFilter or preexisting results,\n\t\t\t\tpostFinder || ( seed ? preFilter : preexisting || postFilter ) ?\n\n\t\t\t\t\t// ...intermediate processing is necessary\n\t\t\t\t\t[] :\n\n\t\t\t\t\t// ...otherwise use results directly\n\t\t\t\t\tresults :\n\t\t\t\tmatcherIn;\n\n\t\t// Find primary matches\n\t\tif ( matcher ) {\n\t\t\tmatcher( matcherIn, matcherOut, context, xml );\n\t\t}\n\n\t\t// Apply postFilter\n\t\tif ( postFilter ) {\n\t\t\ttemp = condense( matcherOut, postMap );\n\t\t\tpostFilter( temp, [], context, xml );\n\n\t\t\t// Un-match failing elements by moving them back to matcherIn\n\t\t\ti = temp.length;\n\t\t\twhile ( i-- ) {\n\t\t\t\tif ( (elem = temp[i]) ) {\n\t\t\t\t\tmatcherOut[ postMap[i] ] = !(matcherIn[ postMap[i] ] = elem);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tif ( seed ) {\n\t\t\tif ( postFinder || preFilter ) {\n\t\t\t\tif ( postFinder ) {\n\t\t\t\t\t// Get the final matcherOut by condensing this intermediate into postFinder contexts\n\t\t\t\t\ttemp = [];\n\t\t\t\t\ti = matcherOut.length;\n\t\t\t\t\twhile ( i-- ) {\n\t\t\t\t\t\tif ( (elem = matcherOut[i]) ) {\n\t\t\t\t\t\t\t// Restore matcherIn since elem is not yet a final match\n\t\t\t\t\t\t\ttemp.push( (matcherIn[i] = elem) );\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tpostFinder( null, (matcherOut = []), temp, xml );\n\t\t\t\t}\n\n\t\t\t\t// Move matched elements from seed to results to keep them synchronized\n\t\t\t\ti = matcherOut.length;\n\t\t\t\twhile ( i-- ) {\n\t\t\t\t\tif ( (elem = matcherOut[i]) &&\n\t\t\t\t\t\t(temp = postFinder ? indexOf( seed, elem ) : preMap[i]) > -1 ) {\n\n\t\t\t\t\t\tseed[temp] = !(results[temp] = elem);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t// Add elements to results, through postFinder if defined\n\t\t} else {\n\t\t\tmatcherOut = condense(\n\t\t\t\tmatcherOut === results ?\n\t\t\t\t\tmatcherOut.splice( preexisting, matcherOut.length ) :\n\t\t\t\t\tmatcherOut\n\t\t\t);\n\t\t\tif ( postFinder ) {\n\t\t\t\tpostFinder( null, results, matcherOut, xml );\n\t\t\t} else {\n\t\t\t\tpush.apply( results, matcherOut );\n\t\t\t}\n\t\t}\n\t});\n}\n\nfunction matcherFromTokens( tokens ) {\n\tvar checkContext, matcher, j,\n\t\tlen = tokens.length,\n\t\tleadingRelative = Expr.relative[ tokens[0].type ],\n\t\timplicitRelative = leadingRelative || Expr.relative[\" \"],\n\t\ti = leadingRelative ? 1 : 0,\n\n\t\t// The foundational matcher ensures that elements are reachable from top-level context(s)\n\t\tmatchContext = addCombinator( function( elem ) {\n\t\t\treturn elem === checkContext;\n\t\t}, implicitRelative, true ),\n\t\tmatchAnyContext = addCombinator( function( elem ) {\n\t\t\treturn indexOf( checkContext, elem ) > -1;\n\t\t}, implicitRelative, true ),\n\t\tmatchers = [ function( elem, context, xml ) {\n\t\t\tvar ret = ( !leadingRelative && ( xml || context !== outermostContext ) ) || (\n\t\t\t\t(checkContext = context).nodeType ?\n\t\t\t\t\tmatchContext( elem, context, xml ) :\n\t\t\t\t\tmatchAnyContext( elem, context, xml ) );\n\t\t\t// Avoid hanging onto element (issue #299)\n\t\t\tcheckContext = null;\n\t\t\treturn ret;\n\t\t} ];\n\n\tfor ( ; i < len; i++ ) {\n\t\tif ( (matcher = Expr.relative[ tokens[i].type ]) ) {\n\t\t\tmatchers = [ addCombinator(elementMatcher( matchers ), matcher) ];\n\t\t} else {\n\t\t\tmatcher = Expr.filter[ tokens[i].type ].apply( null, tokens[i].matches );\n\n\t\t\t// Return special upon seeing a positional matcher\n\t\t\tif ( matcher[ expando ] ) {\n\t\t\t\t// Find the next relative operator (if any) for proper handling\n\t\t\t\tj = ++i;\n\t\t\t\tfor ( ; j < len; j++ ) {\n\t\t\t\t\tif ( Expr.relative[ tokens[j].type ] ) {\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\treturn setMatcher(\n\t\t\t\t\ti > 1 && elementMatcher( matchers ),\n\t\t\t\t\ti > 1 && toSelector(\n\t\t\t\t\t\t// If the preceding token was a descendant combinator, insert an implicit any-element `*`\n\t\t\t\t\t\ttokens.slice( 0, i - 1 ).concat({ value: tokens[ i - 2 ].type === \" \" ? \"*\" : \"\" })\n\t\t\t\t\t).replace( rtrim, \"$1\" ),\n\t\t\t\t\tmatcher,\n\t\t\t\t\ti < j && matcherFromTokens( tokens.slice( i, j ) ),\n\t\t\t\t\tj < len && matcherFromTokens( (tokens = tokens.slice( j )) ),\n\t\t\t\t\tj < len && toSelector( tokens )\n\t\t\t\t);\n\t\t\t}\n\t\t\tmatchers.push( matcher );\n\t\t}\n\t}\n\n\treturn elementMatcher( matchers );\n}\n\nfunction matcherFromGroupMatchers( elementMatchers, setMatchers ) {\n\tvar bySet = setMatchers.length > 0,\n\t\tbyElement = elementMatchers.length > 0,\n\t\tsuperMatcher = function( seed, context, xml, results, outermost ) {\n\t\t\tvar elem, j, matcher,\n\t\t\t\tmatchedCount = 0,\n\t\t\t\ti = \"0\",\n\t\t\t\tunmatched = seed && [],\n\t\t\t\tsetMatched = [],\n\t\t\t\tcontextBackup = outermostContext,\n\t\t\t\t// We must always have either seed elements or outermost context\n\t\t\t\telems = seed || byElement && Expr.find[\"TAG\"]( \"*\", outermost ),\n\t\t\t\t// Use integer dirruns iff this is the outermost matcher\n\t\t\t\tdirrunsUnique = (dirruns += contextBackup == null ? 1 : Math.random() || 0.1),\n\t\t\t\tlen = elems.length;\n\n\t\t\tif ( outermost ) {\n\t\t\t\toutermostContext = context === document || context || outermost;\n\t\t\t}\n\n\t\t\t// Add elements passing elementMatchers directly to results\n\t\t\t// Support: IE<9, Safari\n\t\t\t// Tolerate NodeList properties (IE: \"length\"; Safari: <number>) matching elements by id\n\t\t\tfor ( ; i !== len && (elem = elems[i]) != null; i++ ) {\n\t\t\t\tif ( byElement && elem ) {\n\t\t\t\t\tj = 0;\n\t\t\t\t\tif ( !context && elem.ownerDocument !== document ) {\n\t\t\t\t\t\tsetDocument( elem );\n\t\t\t\t\t\txml = !documentIsHTML;\n\t\t\t\t\t}\n\t\t\t\t\twhile ( (matcher = elementMatchers[j++]) ) {\n\t\t\t\t\t\tif ( matcher( elem, context || document, xml) ) {\n\t\t\t\t\t\t\tresults.push( elem );\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tif ( outermost ) {\n\t\t\t\t\t\tdirruns = dirrunsUnique;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t// Track unmatched elements for set filters\n\t\t\t\tif ( bySet ) {\n\t\t\t\t\t// They will have gone through all possible matchers\n\t\t\t\t\tif ( (elem = !matcher && elem) ) {\n\t\t\t\t\t\tmatchedCount--;\n\t\t\t\t\t}\n\n\t\t\t\t\t// Lengthen the array for every element, matched or not\n\t\t\t\t\tif ( seed ) {\n\t\t\t\t\t\tunmatched.push( elem );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// `i` is now the count of elements visited above, and adding it to `matchedCount`\n\t\t\t// makes the latter nonnegative.\n\t\t\tmatchedCount += i;\n\n\t\t\t// Apply set filters to unmatched elements\n\t\t\t// NOTE: This can be skipped if there are no unmatched elements (i.e., `matchedCount`\n\t\t\t// equals `i`), unless we didn't visit _any_ elements in the above loop because we have\n\t\t\t// no element matchers and no seed.\n\t\t\t// Incrementing an initially-string \"0\" `i` allows `i` to remain a string only in that\n\t\t\t// case, which will result in a \"00\" `matchedCount` that differs from `i` but is also\n\t\t\t// numerically zero.\n\t\t\tif ( bySet && i !== matchedCount ) {\n\t\t\t\tj = 0;\n\t\t\t\twhile ( (matcher = setMatchers[j++]) ) {\n\t\t\t\t\tmatcher( unmatched, setMatched, context, xml );\n\t\t\t\t}\n\n\t\t\t\tif ( seed ) {\n\t\t\t\t\t// Reintegrate element matches to eliminate the need for sorting\n\t\t\t\t\tif ( matchedCount > 0 ) {\n\t\t\t\t\t\twhile ( i-- ) {\n\t\t\t\t\t\t\tif ( !(unmatched[i] || setMatched[i]) ) {\n\t\t\t\t\t\t\t\tsetMatched[i] = pop.call( results );\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\t// Discard index placeholder values to get only actual matches\n\t\t\t\t\tsetMatched = condense( setMatched );\n\t\t\t\t}\n\n\t\t\t\t// Add matches to results\n\t\t\t\tpush.apply( results, setMatched );\n\n\t\t\t\t// Seedless set matches succeeding multiple successful matchers stipulate sorting\n\t\t\t\tif ( outermost && !seed && setMatched.length > 0 &&\n\t\t\t\t\t( matchedCount + setMatchers.length ) > 1 ) {\n\n\t\t\t\t\tSizzle.uniqueSort( results );\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Override manipulation of globals by nested matchers\n\t\t\tif ( outermost ) {\n\t\t\t\tdirruns = dirrunsUnique;\n\t\t\t\toutermostContext = contextBackup;\n\t\t\t}\n\n\t\t\treturn unmatched;\n\t\t};\n\n\treturn bySet ?\n\t\tmarkFunction( superMatcher ) :\n\t\tsuperMatcher;\n}\n\ncompile = Sizzle.compile = function( selector, match /* Internal Use Only */ ) {\n\tvar i,\n\t\tsetMatchers = [],\n\t\telementMatchers = [],\n\t\tcached = compilerCache[ selector + \" \" ];\n\n\tif ( !cached ) {\n\t\t// Generate a function of recursive functions that can be used to check each element\n\t\tif ( !match ) {\n\t\t\tmatch = tokenize( selector );\n\t\t}\n\t\ti = match.length;\n\t\twhile ( i-- ) {\n\t\t\tcached = matcherFromTokens( match[i] );\n\t\t\tif ( cached[ expando ] ) {\n\t\t\t\tsetMatchers.push( cached );\n\t\t\t} else {\n\t\t\t\telementMatchers.push( cached );\n\t\t\t}\n\t\t}\n\n\t\t// Cache the compiled function\n\t\tcached = compilerCache( selector, matcherFromGroupMatchers( elementMatchers, setMatchers ) );\n\n\t\t// Save selector and tokenization\n\t\tcached.selector = selector;\n\t}\n\treturn cached;\n};\n\n/**\n * A low-level selection function that works with Sizzle's compiled\n *  selector functions\n * @param {String|Function} selector A selector or a pre-compiled\n *  selector function built with Sizzle.compile\n * @param {Element} context\n * @param {Array} [results]\n * @param {Array} [seed] A set of elements to match against\n */\nselect = Sizzle.select = function( selector, context, results, seed ) {\n\tvar i, tokens, token, type, find,\n\t\tcompiled = typeof selector === \"function\" && selector,\n\t\tmatch = !seed && tokenize( (selector = compiled.selector || selector) );\n\n\tresults = results || [];\n\n\t// Try to minimize operations if there is only one selector in the list and no seed\n\t// (the latter of which guarantees us context)\n\tif ( match.length === 1 ) {\n\n\t\t// Reduce context if the leading compound selector is an ID\n\t\ttokens = match[0] = match[0].slice( 0 );\n\t\tif ( tokens.length > 2 && (token = tokens[0]).type === \"ID\" &&\n\t\t\t\tcontext.nodeType === 9 && documentIsHTML && Expr.relative[ tokens[1].type ] ) {\n\n\t\t\tcontext = ( Expr.find[\"ID\"]( token.matches[0].replace(runescape, funescape), context ) || [] )[0];\n\t\t\tif ( !context ) {\n\t\t\t\treturn results;\n\n\t\t\t// Precompiled matchers will still verify ancestry, so step up a level\n\t\t\t} else if ( compiled ) {\n\t\t\t\tcontext = context.parentNode;\n\t\t\t}\n\n\t\t\tselector = selector.slice( tokens.shift().value.length );\n\t\t}\n\n\t\t// Fetch a seed set for right-to-left matching\n\t\ti = matchExpr[\"needsContext\"].test( selector ) ? 0 : tokens.length;\n\t\twhile ( i-- ) {\n\t\t\ttoken = tokens[i];\n\n\t\t\t// Abort if we hit a combinator\n\t\t\tif ( Expr.relative[ (type = token.type) ] ) {\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tif ( (find = Expr.find[ type ]) ) {\n\t\t\t\t// Search, expanding context for leading sibling combinators\n\t\t\t\tif ( (seed = find(\n\t\t\t\t\ttoken.matches[0].replace( runescape, funescape ),\n\t\t\t\t\trsibling.test( tokens[0].type ) && testContext( context.parentNode ) || context\n\t\t\t\t)) ) {\n\n\t\t\t\t\t// If seed is empty or no tokens remain, we can return early\n\t\t\t\t\ttokens.splice( i, 1 );\n\t\t\t\t\tselector = seed.length && toSelector( tokens );\n\t\t\t\t\tif ( !selector ) {\n\t\t\t\t\t\tpush.apply( results, seed );\n\t\t\t\t\t\treturn results;\n\t\t\t\t\t}\n\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\t// Compile and execute a filtering function if one is not provided\n\t// Provide `match` to avoid retokenization if we modified the selector above\n\t( compiled || compile( selector, match ) )(\n\t\tseed,\n\t\tcontext,\n\t\t!documentIsHTML,\n\t\tresults,\n\t\t!context || rsibling.test( selector ) && testContext( context.parentNode ) || context\n\t);\n\treturn results;\n};\n\n// One-time assignments\n\n// Sort stability\nsupport.sortStable = expando.split(\"\").sort( sortOrder ).join(\"\") === expando;\n\n// Support: Chrome 14-35+\n// Always assume duplicates if they aren't passed to the comparison function\nsupport.detectDuplicates = !!hasDuplicate;\n\n// Initialize against the default document\nsetDocument();\n\n// Support: Webkit<537.32 - Safari 6.0.3/Chrome 25 (fixed in Chrome 27)\n// Detached nodes confoundingly follow *each other*\nsupport.sortDetached = assert(function( el ) {\n\t// Should return 1, but returns 4 (following)\n\treturn el.compareDocumentPosition( document.createElement(\"fieldset\") ) & 1;\n});\n\n// Support: IE<8\n// Prevent attribute/property \"interpolation\"\n// https://msdn.microsoft.com/en-us/library/ms536429%28VS.85%29.aspx\nif ( !assert(function( el ) {\n\tel.innerHTML = \"<a href='#'></a>\";\n\treturn el.firstChild.getAttribute(\"href\") === \"#\" ;\n}) ) {\n\taddHandle( \"type|href|height|width\", function( elem, name, isXML ) {\n\t\tif ( !isXML ) {\n\t\t\treturn elem.getAttribute( name, name.toLowerCase() === \"type\" ? 1 : 2 );\n\t\t}\n\t});\n}\n\n// Support: IE<9\n// Use defaultValue in place of getAttribute(\"value\")\nif ( !support.attributes || !assert(function( el ) {\n\tel.innerHTML = \"<input/>\";\n\tel.firstChild.setAttribute( \"value\", \"\" );\n\treturn el.firstChild.getAttribute( \"value\" ) === \"\";\n}) ) {\n\taddHandle( \"value\", function( elem, name, isXML ) {\n\t\tif ( !isXML && elem.nodeName.toLowerCase() === \"input\" ) {\n\t\t\treturn elem.defaultValue;\n\t\t}\n\t});\n}\n\n// Support: IE<9\n// Use getAttributeNode to fetch booleans when getAttribute lies\nif ( !assert(function( el ) {\n\treturn el.getAttribute(\"disabled\") == null;\n}) ) {\n\taddHandle( booleans, function( elem, name, isXML ) {\n\t\tvar val;\n\t\tif ( !isXML ) {\n\t\t\treturn elem[ name ] === true ? name.toLowerCase() :\n\t\t\t\t\t(val = elem.getAttributeNode( name )) && val.specified ?\n\t\t\t\t\tval.value :\n\t\t\t\tnull;\n\t\t}\n\t});\n}\n\nreturn Sizzle;\n\n})( window );\n\n\n\njQuery.find = Sizzle;\njQuery.expr = Sizzle.selectors;\n\n// Deprecated\njQuery.expr[ \":\" ] = jQuery.expr.pseudos;\njQuery.uniqueSort = jQuery.unique = Sizzle.uniqueSort;\njQuery.text = Sizzle.getText;\njQuery.isXMLDoc = Sizzle.isXML;\njQuery.contains = Sizzle.contains;\njQuery.escapeSelector = Sizzle.escape;\n\n\n\n\nvar dir = function( elem, dir, until ) {\n\tvar matched = [],\n\t\ttruncate = until !== undefined;\n\n\twhile ( ( elem = elem[ dir ] ) && elem.nodeType !== 9 ) {\n\t\tif ( elem.nodeType === 1 ) {\n\t\t\tif ( truncate && jQuery( elem ).is( until ) ) {\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tmatched.push( elem );\n\t\t}\n\t}\n\treturn matched;\n};\n\n\nvar siblings = function( n, elem ) {\n\tvar matched = [];\n\n\tfor ( ; n; n = n.nextSibling ) {\n\t\tif ( n.nodeType === 1 && n !== elem ) {\n\t\t\tmatched.push( n );\n\t\t}\n\t}\n\n\treturn matched;\n};\n\n\nvar rneedsContext = jQuery.expr.match.needsContext;\n\n\n\nfunction nodeName( elem, name ) {\n\n  return elem.nodeName && elem.nodeName.toLowerCase() === name.toLowerCase();\n\n};\nvar rsingleTag = ( /^<([a-z][^\\/\\0>:\\x20\\t\\r\\n\\f]*)[\\x20\\t\\r\\n\\f]*\\/?>(?:<\\/\\1>|)$/i );\n\n\n\nvar risSimple = /^.[^:#\\[\\.,]*$/;\n\n// Implement the identical functionality for filter and not\nfunction winnow( elements, qualifier, not ) {\n\tif ( jQuery.isFunction( qualifier ) ) {\n\t\treturn jQuery.grep( elements, function( elem, i ) {\n\t\t\treturn !!qualifier.call( elem, i, elem ) !== not;\n\t\t} );\n\t}\n\n\t// Single element\n\tif ( qualifier.nodeType ) {\n\t\treturn jQuery.grep( elements, function( elem ) {\n\t\t\treturn ( elem === qualifier ) !== not;\n\t\t} );\n\t}\n\n\t// Arraylike of elements (jQuery, arguments, Array)\n\tif ( typeof qualifier !== \"string\" ) {\n\t\treturn jQuery.grep( elements, function( elem ) {\n\t\t\treturn ( indexOf.call( qualifier, elem ) > -1 ) !== not;\n\t\t} );\n\t}\n\n\t// Simple selector that can be filtered directly, removing non-Elements\n\tif ( risSimple.test( qualifier ) ) {\n\t\treturn jQuery.filter( qualifier, elements, not );\n\t}\n\n\t// Complex selector, compare the two sets, removing non-Elements\n\tqualifier = jQuery.filter( qualifier, elements );\n\treturn jQuery.grep( elements, function( elem ) {\n\t\treturn ( indexOf.call( qualifier, elem ) > -1 ) !== not && elem.nodeType === 1;\n\t} );\n}\n\njQuery.filter = function( expr, elems, not ) {\n\tvar elem = elems[ 0 ];\n\n\tif ( not ) {\n\t\texpr = \":not(\" + expr + \")\";\n\t}\n\n\tif ( elems.length === 1 && elem.nodeType === 1 ) {\n\t\treturn jQuery.find.matchesSelector( elem, expr ) ? [ elem ] : [];\n\t}\n\n\treturn jQuery.find.matches( expr, jQuery.grep( elems, function( elem ) {\n\t\treturn elem.nodeType === 1;\n\t} ) );\n};\n\njQuery.fn.extend( {\n\tfind: function( selector ) {\n\t\tvar i, ret,\n\t\t\tlen = this.length,\n\t\t\tself = this;\n\n\t\tif ( typeof selector !== \"string\" ) {\n\t\t\treturn this.pushStack( jQuery( selector ).filter( function() {\n\t\t\t\tfor ( i = 0; i < len; i++ ) {\n\t\t\t\t\tif ( jQuery.contains( self[ i ], this ) ) {\n\t\t\t\t\t\treturn true;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} ) );\n\t\t}\n\n\t\tret = this.pushStack( [] );\n\n\t\tfor ( i = 0; i < len; i++ ) {\n\t\t\tjQuery.find( selector, self[ i ], ret );\n\t\t}\n\n\t\treturn len > 1 ? jQuery.uniqueSort( ret ) : ret;\n\t},\n\tfilter: function( selector ) {\n\t\treturn this.pushStack( winnow( this, selector || [], false ) );\n\t},\n\tnot: function( selector ) {\n\t\treturn this.pushStack( winnow( this, selector || [], true ) );\n\t},\n\tis: function( selector ) {\n\t\treturn !!winnow(\n\t\t\tthis,\n\n\t\t\t// If this is a positional/relative selector, check membership in the returned set\n\t\t\t// so $(\"p:first\").is(\"p:last\") won't return true for a doc with two \"p\".\n\t\t\ttypeof selector === \"string\" && rneedsContext.test( selector ) ?\n\t\t\t\tjQuery( selector ) :\n\t\t\t\tselector || [],\n\t\t\tfalse\n\t\t).length;\n\t}\n} );\n\n\n// Initialize a jQuery object\n\n\n// A central reference to the root jQuery(document)\nvar rootjQuery,\n\n\t// A simple way to check for HTML strings\n\t// Prioritize #id over <tag> to avoid XSS via location.hash (#9521)\n\t// Strict HTML recognition (#11290: must start with <)\n\t// Shortcut simple #id case for speed\n\trquickExpr = /^(?:\\s*(<[\\w\\W]+>)[^>]*|#([\\w-]+))$/,\n\n\tinit = jQuery.fn.init = function( selector, context, root ) {\n\t\tvar match, elem;\n\n\t\t// HANDLE: $(\"\"), $(null), $(undefined), $(false)\n\t\tif ( !selector ) {\n\t\t\treturn this;\n\t\t}\n\n\t\t// Method init() accepts an alternate rootjQuery\n\t\t// so migrate can support jQuery.sub (gh-2101)\n\t\troot = root || rootjQuery;\n\n\t\t// Handle HTML strings\n\t\tif ( typeof selector === \"string\" ) {\n\t\t\tif ( selector[ 0 ] === \"<\" &&\n\t\t\t\tselector[ selector.length - 1 ] === \">\" &&\n\t\t\t\tselector.length >= 3 ) {\n\n\t\t\t\t// Assume that strings that start and end with <> are HTML and skip the regex check\n\t\t\t\tmatch = [ null, selector, null ];\n\n\t\t\t} else {\n\t\t\t\tmatch = rquickExpr.exec( selector );\n\t\t\t}\n\n\t\t\t// Match html or make sure no context is specified for #id\n\t\t\tif ( match && ( match[ 1 ] || !context ) ) {\n\n\t\t\t\t// HANDLE: $(html) -> $(array)\n\t\t\t\tif ( match[ 1 ] ) {\n\t\t\t\t\tcontext = context instanceof jQuery ? context[ 0 ] : context;\n\n\t\t\t\t\t// Option to run scripts is true for back-compat\n\t\t\t\t\t// Intentionally let the error be thrown if parseHTML is not present\n\t\t\t\t\tjQuery.merge( this, jQuery.parseHTML(\n\t\t\t\t\t\tmatch[ 1 ],\n\t\t\t\t\t\tcontext && context.nodeType ? context.ownerDocument || context : document,\n\t\t\t\t\t\ttrue\n\t\t\t\t\t) );\n\n\t\t\t\t\t// HANDLE: $(html, props)\n\t\t\t\t\tif ( rsingleTag.test( match[ 1 ] ) && jQuery.isPlainObject( context ) ) {\n\t\t\t\t\t\tfor ( match in context ) {\n\n\t\t\t\t\t\t\t// Properties of context are called as methods if possible\n\t\t\t\t\t\t\tif ( jQuery.isFunction( this[ match ] ) ) {\n\t\t\t\t\t\t\t\tthis[ match ]( context[ match ] );\n\n\t\t\t\t\t\t\t// ...and otherwise set as attributes\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\tthis.attr( match, context[ match ] );\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\treturn this;\n\n\t\t\t\t// HANDLE: $(#id)\n\t\t\t\t} else {\n\t\t\t\t\telem = document.getElementById( match[ 2 ] );\n\n\t\t\t\t\tif ( elem ) {\n\n\t\t\t\t\t\t// Inject the element directly into the jQuery object\n\t\t\t\t\t\tthis[ 0 ] = elem;\n\t\t\t\t\t\tthis.length = 1;\n\t\t\t\t\t}\n\t\t\t\t\treturn this;\n\t\t\t\t}\n\n\t\t\t// HANDLE: $(expr, $(...))\n\t\t\t} else if ( !context || context.jquery ) {\n\t\t\t\treturn ( context || root ).find( selector );\n\n\t\t\t// HANDLE: $(expr, context)\n\t\t\t// (which is just equivalent to: $(context).find(expr)\n\t\t\t} else {\n\t\t\t\treturn this.constructor( context ).find( selector );\n\t\t\t}\n\n\t\t// HANDLE: $(DOMElement)\n\t\t} else if ( selector.nodeType ) {\n\t\t\tthis[ 0 ] = selector;\n\t\t\tthis.length = 1;\n\t\t\treturn this;\n\n\t\t// HANDLE: $(function)\n\t\t// Shortcut for document ready\n\t\t} else if ( jQuery.isFunction( selector ) ) {\n\t\t\treturn root.ready !== undefined ?\n\t\t\t\troot.ready( selector ) :\n\n\t\t\t\t// Execute immediately if ready is not present\n\t\t\t\tselector( jQuery );\n\t\t}\n\n\t\treturn jQuery.makeArray( selector, this );\n\t};\n\n// Give the init function the jQuery prototype for later instantiation\ninit.prototype = jQuery.fn;\n\n// Initialize central reference\nrootjQuery = jQuery( document );\n\n\nvar rparentsprev = /^(?:parents|prev(?:Until|All))/,\n\n\t// Methods guaranteed to produce a unique set when starting from a unique set\n\tguaranteedUnique = {\n\t\tchildren: true,\n\t\tcontents: true,\n\t\tnext: true,\n\t\tprev: true\n\t};\n\njQuery.fn.extend( {\n\thas: function( target ) {\n\t\tvar targets = jQuery( target, this ),\n\t\t\tl = targets.length;\n\n\t\treturn this.filter( function() {\n\t\t\tvar i = 0;\n\t\t\tfor ( ; i < l; i++ ) {\n\t\t\t\tif ( jQuery.contains( this, targets[ i ] ) ) {\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\t\t\t}\n\t\t} );\n\t},\n\n\tclosest: function( selectors, context ) {\n\t\tvar cur,\n\t\t\ti = 0,\n\t\t\tl = this.length,\n\t\t\tmatched = [],\n\t\t\ttargets = typeof selectors !== \"string\" && jQuery( selectors );\n\n\t\t// Positional selectors never match, since there's no _selection_ context\n\t\tif ( !rneedsContext.test( selectors ) ) {\n\t\t\tfor ( ; i < l; i++ ) {\n\t\t\t\tfor ( cur = this[ i ]; cur && cur !== context; cur = cur.parentNode ) {\n\n\t\t\t\t\t// Always skip document fragments\n\t\t\t\t\tif ( cur.nodeType < 11 && ( targets ?\n\t\t\t\t\t\ttargets.index( cur ) > -1 :\n\n\t\t\t\t\t\t// Don't pass non-elements to Sizzle\n\t\t\t\t\t\tcur.nodeType === 1 &&\n\t\t\t\t\t\t\tjQuery.find.matchesSelector( cur, selectors ) ) ) {\n\n\t\t\t\t\t\tmatched.push( cur );\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn this.pushStack( matched.length > 1 ? jQuery.uniqueSort( matched ) : matched );\n\t},\n\n\t// Determine the position of an element within the set\n\tindex: function( elem ) {\n\n\t\t// No argument, return index in parent\n\t\tif ( !elem ) {\n\t\t\treturn ( this[ 0 ] && this[ 0 ].parentNode ) ? this.first().prevAll().length : -1;\n\t\t}\n\n\t\t// Index in selector\n\t\tif ( typeof elem === \"string\" ) {\n\t\t\treturn indexOf.call( jQuery( elem ), this[ 0 ] );\n\t\t}\n\n\t\t// Locate the position of the desired element\n\t\treturn indexOf.call( this,\n\n\t\t\t// If it receives a jQuery object, the first element is used\n\t\t\telem.jquery ? elem[ 0 ] : elem\n\t\t);\n\t},\n\n\tadd: function( selector, context ) {\n\t\treturn this.pushStack(\n\t\t\tjQuery.uniqueSort(\n\t\t\t\tjQuery.merge( this.get(), jQuery( selector, context ) )\n\t\t\t)\n\t\t);\n\t},\n\n\taddBack: function( selector ) {\n\t\treturn this.add( selector == null ?\n\t\t\tthis.prevObject : this.prevObject.filter( selector )\n\t\t);\n\t}\n} );\n\nfunction sibling( cur, dir ) {\n\twhile ( ( cur = cur[ dir ] ) && cur.nodeType !== 1 ) {}\n\treturn cur;\n}\n\njQuery.each( {\n\tparent: function( elem ) {\n\t\tvar parent = elem.parentNode;\n\t\treturn parent && parent.nodeType !== 11 ? parent : null;\n\t},\n\tparents: function( elem ) {\n\t\treturn dir( elem, \"parentNode\" );\n\t},\n\tparentsUntil: function( elem, i, until ) {\n\t\treturn dir( elem, \"parentNode\", until );\n\t},\n\tnext: function( elem ) {\n\t\treturn sibling( elem, \"nextSibling\" );\n\t},\n\tprev: function( elem ) {\n\t\treturn sibling( elem, \"previousSibling\" );\n\t},\n\tnextAll: function( elem ) {\n\t\treturn dir( elem, \"nextSibling\" );\n\t},\n\tprevAll: function( elem ) {\n\t\treturn dir( elem, \"previousSibling\" );\n\t},\n\tnextUntil: function( elem, i, until ) {\n\t\treturn dir( elem, \"nextSibling\", until );\n\t},\n\tprevUntil: function( elem, i, until ) {\n\t\treturn dir( elem, \"previousSibling\", until );\n\t},\n\tsiblings: function( elem ) {\n\t\treturn siblings( ( elem.parentNode || {} ).firstChild, elem );\n\t},\n\tchildren: function( elem ) {\n\t\treturn siblings( elem.firstChild );\n\t},\n\tcontents: function( elem ) {\n        if ( nodeName( elem, \"iframe\" ) ) {\n            return elem.contentDocument;\n        }\n\n        // Support: IE 9 - 11 only, iOS 7 only, Android Browser <=4.3 only\n        // Treat the template element as a regular one in browsers that\n        // don't support it.\n        if ( nodeName( elem, \"template\" ) ) {\n            elem = elem.content || elem;\n        }\n\n        return jQuery.merge( [], elem.childNodes );\n\t}\n}, function( name, fn ) {\n\tjQuery.fn[ name ] = function( until, selector ) {\n\t\tvar matched = jQuery.map( this, fn, until );\n\n\t\tif ( name.slice( -5 ) !== \"Until\" ) {\n\t\t\tselector = until;\n\t\t}\n\n\t\tif ( selector && typeof selector === \"string\" ) {\n\t\t\tmatched = jQuery.filter( selector, matched );\n\t\t}\n\n\t\tif ( this.length > 1 ) {\n\n\t\t\t// Remove duplicates\n\t\t\tif ( !guaranteedUnique[ name ] ) {\n\t\t\t\tjQuery.uniqueSort( matched );\n\t\t\t}\n\n\t\t\t// Reverse order for parents* and prev-derivatives\n\t\t\tif ( rparentsprev.test( name ) ) {\n\t\t\t\tmatched.reverse();\n\t\t\t}\n\t\t}\n\n\t\treturn this.pushStack( matched );\n\t};\n} );\nvar rnothtmlwhite = ( /[^\\x20\\t\\r\\n\\f]+/g );\n\n\n\n// Convert String-formatted options into Object-formatted ones\nfunction createOptions( options ) {\n\tvar object = {};\n\tjQuery.each( options.match( rnothtmlwhite ) || [], function( _, flag ) {\n\t\tobject[ flag ] = true;\n\t} );\n\treturn object;\n}\n\n/*\n * Create a callback list using the following parameters:\n *\n *\toptions: an optional list of space-separated options that will change how\n *\t\t\tthe callback list behaves or a more traditional option object\n *\n * By default a callback list will act like an event callback list and can be\n * \"fired\" multiple times.\n *\n * Possible options:\n *\n *\tonce:\t\t\twill ensure the callback list can only be fired once (like a Deferred)\n *\n *\tmemory:\t\t\twill keep track of previous values and will call any callback added\n *\t\t\t\t\tafter the list has been fired right away with the latest \"memorized\"\n *\t\t\t\t\tvalues (like a Deferred)\n *\n *\tunique:\t\t\twill ensure a callback can only be added once (no duplicate in the list)\n *\n *\tstopOnFalse:\tinterrupt callings when a callback returns false\n *\n */\njQuery.Callbacks = function( options ) {\n\n\t// Convert options from String-formatted to Object-formatted if needed\n\t// (we check in cache first)\n\toptions = typeof options === \"string\" ?\n\t\tcreateOptions( options ) :\n\t\tjQuery.extend( {}, options );\n\n\tvar // Flag to know if list is currently firing\n\t\tfiring,\n\n\t\t// Last fire value for non-forgettable lists\n\t\tmemory,\n\n\t\t// Flag to know if list was already fired\n\t\tfired,\n\n\t\t// Flag to prevent firing\n\t\tlocked,\n\n\t\t// Actual callback list\n\t\tlist = [],\n\n\t\t// Queue of execution data for repeatable lists\n\t\tqueue = [],\n\n\t\t// Index of currently firing callback (modified by add/remove as needed)\n\t\tfiringIndex = -1,\n\n\t\t// Fire callbacks\n\t\tfire = function() {\n\n\t\t\t// Enforce single-firing\n\t\t\tlocked = locked || options.once;\n\n\t\t\t// Execute callbacks for all pending executions,\n\t\t\t// respecting firingIndex overrides and runtime changes\n\t\t\tfired = firing = true;\n\t\t\tfor ( ; queue.length; firingIndex = -1 ) {\n\t\t\t\tmemory = queue.shift();\n\t\t\t\twhile ( ++firingIndex < list.length ) {\n\n\t\t\t\t\t// Run callback and check for early termination\n\t\t\t\t\tif ( list[ firingIndex ].apply( memory[ 0 ], memory[ 1 ] ) === false &&\n\t\t\t\t\t\toptions.stopOnFalse ) {\n\n\t\t\t\t\t\t// Jump to end and forget the data so .add doesn't re-fire\n\t\t\t\t\t\tfiringIndex = list.length;\n\t\t\t\t\t\tmemory = false;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Forget the data if we're done with it\n\t\t\tif ( !options.memory ) {\n\t\t\t\tmemory = false;\n\t\t\t}\n\n\t\t\tfiring = false;\n\n\t\t\t// Clean up if we're done firing for good\n\t\t\tif ( locked ) {\n\n\t\t\t\t// Keep an empty list if we have data for future add calls\n\t\t\t\tif ( memory ) {\n\t\t\t\t\tlist = [];\n\n\t\t\t\t// Otherwise, this object is spent\n\t\t\t\t} else {\n\t\t\t\t\tlist = \"\";\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\n\t\t// Actual Callbacks object\n\t\tself = {\n\n\t\t\t// Add a callback or a collection of callbacks to the list\n\t\t\tadd: function() {\n\t\t\t\tif ( list ) {\n\n\t\t\t\t\t// If we have memory from a past run, we should fire after adding\n\t\t\t\t\tif ( memory && !firing ) {\n\t\t\t\t\t\tfiringIndex = list.length - 1;\n\t\t\t\t\t\tqueue.push( memory );\n\t\t\t\t\t}\n\n\t\t\t\t\t( function add( args ) {\n\t\t\t\t\t\tjQuery.each( args, function( _, arg ) {\n\t\t\t\t\t\t\tif ( jQuery.isFunction( arg ) ) {\n\t\t\t\t\t\t\t\tif ( !options.unique || !self.has( arg ) ) {\n\t\t\t\t\t\t\t\t\tlist.push( arg );\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t} else if ( arg && arg.length && jQuery.type( arg ) !== \"string\" ) {\n\n\t\t\t\t\t\t\t\t// Inspect recursively\n\t\t\t\t\t\t\t\tadd( arg );\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t} );\n\t\t\t\t\t} )( arguments );\n\n\t\t\t\t\tif ( memory && !firing ) {\n\t\t\t\t\t\tfire();\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\treturn this;\n\t\t\t},\n\n\t\t\t// Remove a callback from the list\n\t\t\tremove: function() {\n\t\t\t\tjQuery.each( arguments, function( _, arg ) {\n\t\t\t\t\tvar index;\n\t\t\t\t\twhile ( ( index = jQuery.inArray( arg, list, index ) ) > -1 ) {\n\t\t\t\t\t\tlist.splice( index, 1 );\n\n\t\t\t\t\t\t// Handle firing indexes\n\t\t\t\t\t\tif ( index <= firingIndex ) {\n\t\t\t\t\t\t\tfiringIndex--;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t} );\n\t\t\t\treturn this;\n\t\t\t},\n\n\t\t\t// Check if a given callback is in the list.\n\t\t\t// If no argument is given, return whether or not list has callbacks attached.\n\t\t\thas: function( fn ) {\n\t\t\t\treturn fn ?\n\t\t\t\t\tjQuery.inArray( fn, list ) > -1 :\n\t\t\t\t\tlist.length > 0;\n\t\t\t},\n\n\t\t\t// Remove all callbacks from the list\n\t\t\tempty: function() {\n\t\t\t\tif ( list ) {\n\t\t\t\t\tlist = [];\n\t\t\t\t}\n\t\t\t\treturn this;\n\t\t\t},\n\n\t\t\t// Disable .fire and .add\n\t\t\t// Abort any current/pending executions\n\t\t\t// Clear all callbacks and values\n\t\t\tdisable: function() {\n\t\t\t\tlocked = queue = [];\n\t\t\t\tlist = memory = \"\";\n\t\t\t\treturn this;\n\t\t\t},\n\t\t\tdisabled: function() {\n\t\t\t\treturn !list;\n\t\t\t},\n\n\t\t\t// Disable .fire\n\t\t\t// Also disable .add unless we have memory (since it would have no effect)\n\t\t\t// Abort any pending executions\n\t\t\tlock: function() {\n\t\t\t\tlocked = queue = [];\n\t\t\t\tif ( !memory && !firing ) {\n\t\t\t\t\tlist = memory = \"\";\n\t\t\t\t}\n\t\t\t\treturn this;\n\t\t\t},\n\t\t\tlocked: function() {\n\t\t\t\treturn !!locked;\n\t\t\t},\n\n\t\t\t// Call all callbacks with the given context and arguments\n\t\t\tfireWith: function( context, args ) {\n\t\t\t\tif ( !locked ) {\n\t\t\t\t\targs = args || [];\n\t\t\t\t\targs = [ context, args.slice ? args.slice() : args ];\n\t\t\t\t\tqueue.push( args );\n\t\t\t\t\tif ( !firing ) {\n\t\t\t\t\t\tfire();\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\treturn this;\n\t\t\t},\n\n\t\t\t// Call all the callbacks with the given arguments\n\t\t\tfire: function() {\n\t\t\t\tself.fireWith( this, arguments );\n\t\t\t\treturn this;\n\t\t\t},\n\n\t\t\t// To know if the callbacks have already been called at least once\n\t\t\tfired: function() {\n\t\t\t\treturn !!fired;\n\t\t\t}\n\t\t};\n\n\treturn self;\n};\n\n\nfunction Identity( v ) {\n\treturn v;\n}\nfunction Thrower( ex ) {\n\tthrow ex;\n}\n\nfunction adoptValue( value, resolve, reject, noValue ) {\n\tvar method;\n\n\ttry {\n\n\t\t// Check for promise aspect first to privilege synchronous behavior\n\t\tif ( value && jQuery.isFunction( ( method = value.promise ) ) ) {\n\t\t\tmethod.call( value ).done( resolve ).fail( reject );\n\n\t\t// Other thenables\n\t\t} else if ( value && jQuery.isFunction( ( method = value.then ) ) ) {\n\t\t\tmethod.call( value, resolve, reject );\n\n\t\t// Other non-thenables\n\t\t} else {\n\n\t\t\t// Control `resolve` arguments by letting Array#slice cast boolean `noValue` to integer:\n\t\t\t// * false: [ value ].slice( 0 ) => resolve( value )\n\t\t\t// * true: [ value ].slice( 1 ) => resolve()\n\t\t\tresolve.apply( undefined, [ value ].slice( noValue ) );\n\t\t}\n\n\t// For Promises/A+, convert exceptions into rejections\n\t// Since jQuery.when doesn't unwrap thenables, we can skip the extra checks appearing in\n\t// Deferred#then to conditionally suppress rejection.\n\t} catch ( value ) {\n\n\t\t// Support: Android 4.0 only\n\t\t// Strict mode functions invoked without .call/.apply get global-object context\n\t\treject.apply( undefined, [ value ] );\n\t}\n}\n\njQuery.extend( {\n\n\tDeferred: function( func ) {\n\t\tvar tuples = [\n\n\t\t\t\t// action, add listener, callbacks,\n\t\t\t\t// ... .then handlers, argument index, [final state]\n\t\t\t\t[ \"notify\", \"progress\", jQuery.Callbacks( \"memory\" ),\n\t\t\t\t\tjQuery.Callbacks( \"memory\" ), 2 ],\n\t\t\t\t[ \"resolve\", \"done\", jQuery.Callbacks( \"once memory\" ),\n\t\t\t\t\tjQuery.Callbacks( \"once memory\" ), 0, \"resolved\" ],\n\t\t\t\t[ \"reject\", \"fail\", jQuery.Callbacks( \"once memory\" ),\n\t\t\t\t\tjQuery.Callbacks( \"once memory\" ), 1, \"rejected\" ]\n\t\t\t],\n\t\t\tstate = \"pending\",\n\t\t\tpromise = {\n\t\t\t\tstate: function() {\n\t\t\t\t\treturn state;\n\t\t\t\t},\n\t\t\t\talways: function() {\n\t\t\t\t\tdeferred.done( arguments ).fail( arguments );\n\t\t\t\t\treturn this;\n\t\t\t\t},\n\t\t\t\t\"catch\": function( fn ) {\n\t\t\t\t\treturn promise.then( null, fn );\n\t\t\t\t},\n\n\t\t\t\t// Keep pipe for back-compat\n\t\t\t\tpipe: function( /* fnDone, fnFail, fnProgress */ ) {\n\t\t\t\t\tvar fns = arguments;\n\n\t\t\t\t\treturn jQuery.Deferred( function( newDefer ) {\n\t\t\t\t\t\tjQuery.each( tuples, function( i, tuple ) {\n\n\t\t\t\t\t\t\t// Map tuples (progress, done, fail) to arguments (done, fail, progress)\n\t\t\t\t\t\t\tvar fn = jQuery.isFunction( fns[ tuple[ 4 ] ] ) && fns[ tuple[ 4 ] ];\n\n\t\t\t\t\t\t\t// deferred.progress(function() { bind to newDefer or newDefer.notify })\n\t\t\t\t\t\t\t// deferred.done(function() { bind to newDefer or newDefer.resolve })\n\t\t\t\t\t\t\t// deferred.fail(function() { bind to newDefer or newDefer.reject })\n\t\t\t\t\t\t\tdeferred[ tuple[ 1 ] ]( function() {\n\t\t\t\t\t\t\t\tvar returned = fn && fn.apply( this, arguments );\n\t\t\t\t\t\t\t\tif ( returned && jQuery.isFunction( returned.promise ) ) {\n\t\t\t\t\t\t\t\t\treturned.promise()\n\t\t\t\t\t\t\t\t\t\t.progress( newDefer.notify )\n\t\t\t\t\t\t\t\t\t\t.done( newDefer.resolve )\n\t\t\t\t\t\t\t\t\t\t.fail( newDefer.reject );\n\t\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t\tnewDefer[ tuple[ 0 ] + \"With\" ](\n\t\t\t\t\t\t\t\t\t\tthis,\n\t\t\t\t\t\t\t\t\t\tfn ? [ returned ] : arguments\n\t\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t} );\n\t\t\t\t\t\t} );\n\t\t\t\t\t\tfns = null;\n\t\t\t\t\t} ).promise();\n\t\t\t\t},\n\t\t\t\tthen: function( onFulfilled, onRejected, onProgress ) {\n\t\t\t\t\tvar maxDepth = 0;\n\t\t\t\t\tfunction resolve( depth, deferred, handler, special ) {\n\t\t\t\t\t\treturn function() {\n\t\t\t\t\t\t\tvar that = this,\n\t\t\t\t\t\t\t\targs = arguments,\n\t\t\t\t\t\t\t\tmightThrow = function() {\n\t\t\t\t\t\t\t\t\tvar returned, then;\n\n\t\t\t\t\t\t\t\t\t// Support: Promises/A+ section 2.3.3.3.3\n\t\t\t\t\t\t\t\t\t// https://promisesaplus.com/#point-59\n\t\t\t\t\t\t\t\t\t// Ignore double-resolution attempts\n\t\t\t\t\t\t\t\t\tif ( depth < maxDepth ) {\n\t\t\t\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\treturned = handler.apply( that, args );\n\n\t\t\t\t\t\t\t\t\t// Support: Promises/A+ section 2.3.1\n\t\t\t\t\t\t\t\t\t// https://promisesaplus.com/#point-48\n\t\t\t\t\t\t\t\t\tif ( returned === deferred.promise() ) {\n\t\t\t\t\t\t\t\t\t\tthrow new TypeError( \"Thenable self-resolution\" );\n\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\t// Support: Promises/A+ sections 2.3.3.1, 3.5\n\t\t\t\t\t\t\t\t\t// https://promisesaplus.com/#point-54\n\t\t\t\t\t\t\t\t\t// https://promisesaplus.com/#point-75\n\t\t\t\t\t\t\t\t\t// Retrieve `then` only once\n\t\t\t\t\t\t\t\t\tthen = returned &&\n\n\t\t\t\t\t\t\t\t\t\t// Support: Promises/A+ section 2.3.4\n\t\t\t\t\t\t\t\t\t\t// https://promisesaplus.com/#point-64\n\t\t\t\t\t\t\t\t\t\t// Only check objects and functions for thenability\n\t\t\t\t\t\t\t\t\t\t( typeof returned === \"object\" ||\n\t\t\t\t\t\t\t\t\t\t\ttypeof returned === \"function\" ) &&\n\t\t\t\t\t\t\t\t\t\treturned.then;\n\n\t\t\t\t\t\t\t\t\t// Handle a returned thenable\n\t\t\t\t\t\t\t\t\tif ( jQuery.isFunction( then ) ) {\n\n\t\t\t\t\t\t\t\t\t\t// Special processors (notify) just wait for resolution\n\t\t\t\t\t\t\t\t\t\tif ( special ) {\n\t\t\t\t\t\t\t\t\t\t\tthen.call(\n\t\t\t\t\t\t\t\t\t\t\t\treturned,\n\t\t\t\t\t\t\t\t\t\t\t\tresolve( maxDepth, deferred, Identity, special ),\n\t\t\t\t\t\t\t\t\t\t\t\tresolve( maxDepth, deferred, Thrower, special )\n\t\t\t\t\t\t\t\t\t\t\t);\n\n\t\t\t\t\t\t\t\t\t\t// Normal processors (resolve) also hook into progress\n\t\t\t\t\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t\t\t\t\t// ...and disregard older resolution values\n\t\t\t\t\t\t\t\t\t\t\tmaxDepth++;\n\n\t\t\t\t\t\t\t\t\t\t\tthen.call(\n\t\t\t\t\t\t\t\t\t\t\t\treturned,\n\t\t\t\t\t\t\t\t\t\t\t\tresolve( maxDepth, deferred, Identity, special ),\n\t\t\t\t\t\t\t\t\t\t\t\tresolve( maxDepth, deferred, Thrower, special ),\n\t\t\t\t\t\t\t\t\t\t\t\tresolve( maxDepth, deferred, Identity,\n\t\t\t\t\t\t\t\t\t\t\t\t\tdeferred.notifyWith )\n\t\t\t\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\t// Handle all other returned values\n\t\t\t\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t\t\t\t// Only substitute handlers pass on context\n\t\t\t\t\t\t\t\t\t\t// and multiple values (non-spec behavior)\n\t\t\t\t\t\t\t\t\t\tif ( handler !== Identity ) {\n\t\t\t\t\t\t\t\t\t\t\tthat = undefined;\n\t\t\t\t\t\t\t\t\t\t\targs = [ returned ];\n\t\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\t\t// Process the value(s)\n\t\t\t\t\t\t\t\t\t\t// Default process is resolve\n\t\t\t\t\t\t\t\t\t\t( special || deferred.resolveWith )( that, args );\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t},\n\n\t\t\t\t\t\t\t\t// Only normal processors (resolve) catch and reject exceptions\n\t\t\t\t\t\t\t\tprocess = special ?\n\t\t\t\t\t\t\t\t\tmightThrow :\n\t\t\t\t\t\t\t\t\tfunction() {\n\t\t\t\t\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\t\t\t\t\tmightThrow();\n\t\t\t\t\t\t\t\t\t\t} catch ( e ) {\n\n\t\t\t\t\t\t\t\t\t\t\tif ( jQuery.Deferred.exceptionHook ) {\n\t\t\t\t\t\t\t\t\t\t\t\tjQuery.Deferred.exceptionHook( e,\n\t\t\t\t\t\t\t\t\t\t\t\t\tprocess.stackTrace );\n\t\t\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\t\t\t// Support: Promises/A+ section 2.3.3.3.4.1\n\t\t\t\t\t\t\t\t\t\t\t// https://promisesaplus.com/#point-61\n\t\t\t\t\t\t\t\t\t\t\t// Ignore post-resolution exceptions\n\t\t\t\t\t\t\t\t\t\t\tif ( depth + 1 >= maxDepth ) {\n\n\t\t\t\t\t\t\t\t\t\t\t\t// Only substitute handlers pass on context\n\t\t\t\t\t\t\t\t\t\t\t\t// and multiple values (non-spec behavior)\n\t\t\t\t\t\t\t\t\t\t\t\tif ( handler !== Thrower ) {\n\t\t\t\t\t\t\t\t\t\t\t\t\tthat = undefined;\n\t\t\t\t\t\t\t\t\t\t\t\t\targs = [ e ];\n\t\t\t\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\t\t\t\tdeferred.rejectWith( that, args );\n\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t};\n\n\t\t\t\t\t\t\t// Support: Promises/A+ section 2.3.3.3.1\n\t\t\t\t\t\t\t// https://promisesaplus.com/#point-57\n\t\t\t\t\t\t\t// Re-resolve promises immediately to dodge false rejection from\n\t\t\t\t\t\t\t// subsequent errors\n\t\t\t\t\t\t\tif ( depth ) {\n\t\t\t\t\t\t\t\tprocess();\n\t\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t\t// Call an optional hook to record the stack, in case of exception\n\t\t\t\t\t\t\t\t// since it's otherwise lost when execution goes async\n\t\t\t\t\t\t\t\tif ( jQuery.Deferred.getStackHook ) {\n\t\t\t\t\t\t\t\t\tprocess.stackTrace = jQuery.Deferred.getStackHook();\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\twindow.setTimeout( process );\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t};\n\t\t\t\t\t}\n\n\t\t\t\t\treturn jQuery.Deferred( function( newDefer ) {\n\n\t\t\t\t\t\t// progress_handlers.add( ... )\n\t\t\t\t\t\ttuples[ 0 ][ 3 ].add(\n\t\t\t\t\t\t\tresolve(\n\t\t\t\t\t\t\t\t0,\n\t\t\t\t\t\t\t\tnewDefer,\n\t\t\t\t\t\t\t\tjQuery.isFunction( onProgress ) ?\n\t\t\t\t\t\t\t\t\tonProgress :\n\t\t\t\t\t\t\t\t\tIdentity,\n\t\t\t\t\t\t\t\tnewDefer.notifyWith\n\t\t\t\t\t\t\t)\n\t\t\t\t\t\t);\n\n\t\t\t\t\t\t// fulfilled_handlers.add( ... )\n\t\t\t\t\t\ttuples[ 1 ][ 3 ].add(\n\t\t\t\t\t\t\tresolve(\n\t\t\t\t\t\t\t\t0,\n\t\t\t\t\t\t\t\tnewDefer,\n\t\t\t\t\t\t\t\tjQuery.isFunction( onFulfilled ) ?\n\t\t\t\t\t\t\t\t\tonFulfilled :\n\t\t\t\t\t\t\t\t\tIdentity\n\t\t\t\t\t\t\t)\n\t\t\t\t\t\t);\n\n\t\t\t\t\t\t// rejected_handlers.add( ... )\n\t\t\t\t\t\ttuples[ 2 ][ 3 ].add(\n\t\t\t\t\t\t\tresolve(\n\t\t\t\t\t\t\t\t0,\n\t\t\t\t\t\t\t\tnewDefer,\n\t\t\t\t\t\t\t\tjQuery.isFunction( onRejected ) ?\n\t\t\t\t\t\t\t\t\tonRejected :\n\t\t\t\t\t\t\t\t\tThrower\n\t\t\t\t\t\t\t)\n\t\t\t\t\t\t);\n\t\t\t\t\t} ).promise();\n\t\t\t\t},\n\n\t\t\t\t// Get a promise for this deferred\n\t\t\t\t// If obj is provided, the promise aspect is added to the object\n\t\t\t\tpromise: function( obj ) {\n\t\t\t\t\treturn obj != null ? jQuery.extend( obj, promise ) : promise;\n\t\t\t\t}\n\t\t\t},\n\t\t\tdeferred = {};\n\n\t\t// Add list-specific methods\n\t\tjQuery.each( tuples, function( i, tuple ) {\n\t\t\tvar list = tuple[ 2 ],\n\t\t\t\tstateString = tuple[ 5 ];\n\n\t\t\t// promise.progress = list.add\n\t\t\t// promise.done = list.add\n\t\t\t// promise.fail = list.add\n\t\t\tpromise[ tuple[ 1 ] ] = list.add;\n\n\t\t\t// Handle state\n\t\t\tif ( stateString ) {\n\t\t\t\tlist.add(\n\t\t\t\t\tfunction() {\n\n\t\t\t\t\t\t// state = \"resolved\" (i.e., fulfilled)\n\t\t\t\t\t\t// state = \"rejected\"\n\t\t\t\t\t\tstate = stateString;\n\t\t\t\t\t},\n\n\t\t\t\t\t// rejected_callbacks.disable\n\t\t\t\t\t// fulfilled_callbacks.disable\n\t\t\t\t\ttuples[ 3 - i ][ 2 ].disable,\n\n\t\t\t\t\t// progress_callbacks.lock\n\t\t\t\t\ttuples[ 0 ][ 2 ].lock\n\t\t\t\t);\n\t\t\t}\n\n\t\t\t// progress_handlers.fire\n\t\t\t// fulfilled_handlers.fire\n\t\t\t// rejected_handlers.fire\n\t\t\tlist.add( tuple[ 3 ].fire );\n\n\t\t\t// deferred.notify = function() { deferred.notifyWith(...) }\n\t\t\t// deferred.resolve = function() { deferred.resolveWith(...) }\n\t\t\t// deferred.reject = function() { deferred.rejectWith(...) }\n\t\t\tdeferred[ tuple[ 0 ] ] = function() {\n\t\t\t\tdeferred[ tuple[ 0 ] + \"With\" ]( this === deferred ? undefined : this, arguments );\n\t\t\t\treturn this;\n\t\t\t};\n\n\t\t\t// deferred.notifyWith = list.fireWith\n\t\t\t// deferred.resolveWith = list.fireWith\n\t\t\t// deferred.rejectWith = list.fireWith\n\t\t\tdeferred[ tuple[ 0 ] + \"With\" ] = list.fireWith;\n\t\t} );\n\n\t\t// Make the deferred a promise\n\t\tpromise.promise( deferred );\n\n\t\t// Call given func if any\n\t\tif ( func ) {\n\t\t\tfunc.call( deferred, deferred );\n\t\t}\n\n\t\t// All done!\n\t\treturn deferred;\n\t},\n\n\t// Deferred helper\n\twhen: function( singleValue ) {\n\t\tvar\n\n\t\t\t// count of uncompleted subordinates\n\t\t\tremaining = arguments.length,\n\n\t\t\t// count of unprocessed arguments\n\t\t\ti = remaining,\n\n\t\t\t// subordinate fulfillment data\n\t\t\tresolveContexts = Array( i ),\n\t\t\tresolveValues = slice.call( arguments ),\n\n\t\t\t// the master Deferred\n\t\t\tmaster = jQuery.Deferred(),\n\n\t\t\t// subordinate callback factory\n\t\t\tupdateFunc = function( i ) {\n\t\t\t\treturn function( value ) {\n\t\t\t\t\tresolveContexts[ i ] = this;\n\t\t\t\t\tresolveValues[ i ] = arguments.length > 1 ? slice.call( arguments ) : value;\n\t\t\t\t\tif ( !( --remaining ) ) {\n\t\t\t\t\t\tmaster.resolveWith( resolveContexts, resolveValues );\n\t\t\t\t\t}\n\t\t\t\t};\n\t\t\t};\n\n\t\t// Single- and empty arguments are adopted like Promise.resolve\n\t\tif ( remaining <= 1 ) {\n\t\t\tadoptValue( singleValue, master.done( updateFunc( i ) ).resolve, master.reject,\n\t\t\t\t!remaining );\n\n\t\t\t// Use .then() to unwrap secondary thenables (cf. gh-3000)\n\t\t\tif ( master.state() === \"pending\" ||\n\t\t\t\tjQuery.isFunction( resolveValues[ i ] && resolveValues[ i ].then ) ) {\n\n\t\t\t\treturn master.then();\n\t\t\t}\n\t\t}\n\n\t\t// Multiple arguments are aggregated like Promise.all array elements\n\t\twhile ( i-- ) {\n\t\t\tadoptValue( resolveValues[ i ], updateFunc( i ), master.reject );\n\t\t}\n\n\t\treturn master.promise();\n\t}\n} );\n\n\n// These usually indicate a programmer mistake during development,\n// warn about them ASAP rather than swallowing them by default.\nvar rerrorNames = /^(Eval|Internal|Range|Reference|Syntax|Type|URI)Error$/;\n\njQuery.Deferred.exceptionHook = function( error, stack ) {\n\n\t// Support: IE 8 - 9 only\n\t// Console exists when dev tools are open, which can happen at any time\n\tif ( window.console && window.console.warn && error && rerrorNames.test( error.name ) ) {\n\t\twindow.console.warn( \"jQuery.Deferred exception: \" + error.message, error.stack, stack );\n\t}\n};\n\n\n\n\njQuery.readyException = function( error ) {\n\twindow.setTimeout( function() {\n\t\tthrow error;\n\t} );\n};\n\n\n\n\n// The deferred used on DOM ready\nvar readyList = jQuery.Deferred();\n\njQuery.fn.ready = function( fn ) {\n\n\treadyList\n\t\t.then( fn )\n\n\t\t// Wrap jQuery.readyException in a function so that the lookup\n\t\t// happens at the time of error handling instead of callback\n\t\t// registration.\n\t\t.catch( function( error ) {\n\t\t\tjQuery.readyException( error );\n\t\t} );\n\n\treturn this;\n};\n\njQuery.extend( {\n\n\t// Is the DOM ready to be used? Set to true once it occurs.\n\tisReady: false,\n\n\t// A counter to track how many items to wait for before\n\t// the ready event fires. See #6781\n\treadyWait: 1,\n\n\t// Handle when the DOM is ready\n\tready: function( wait ) {\n\n\t\t// Abort if there are pending holds or we're already ready\n\t\tif ( wait === true ? --jQuery.readyWait : jQuery.isReady ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Remember that the DOM is ready\n\t\tjQuery.isReady = true;\n\n\t\t// If a normal DOM Ready event fired, decrement, and wait if need be\n\t\tif ( wait !== true && --jQuery.readyWait > 0 ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// If there are functions bound, to execute\n\t\treadyList.resolveWith( document, [ jQuery ] );\n\t}\n} );\n\njQuery.ready.then = readyList.then;\n\n// The ready event handler and self cleanup method\nfunction completed() {\n\tdocument.removeEventListener( \"DOMContentLoaded\", completed );\n\twindow.removeEventListener( \"load\", completed );\n\tjQuery.ready();\n}\n\n// Catch cases where $(document).ready() is called\n// after the browser event has already occurred.\n// Support: IE <=9 - 10 only\n// Older IE sometimes signals \"interactive\" too soon\nif ( document.readyState === \"complete\" ||\n\t( document.readyState !== \"loading\" && !document.documentElement.doScroll ) ) {\n\n\t// Handle it asynchronously to allow scripts the opportunity to delay ready\n\twindow.setTimeout( jQuery.ready );\n\n} else {\n\n\t// Use the handy event callback\n\tdocument.addEventListener( \"DOMContentLoaded\", completed );\n\n\t// A fallback to window.onload, that will always work\n\twindow.addEventListener( \"load\", completed );\n}\n\n\n\n\n// Multifunctional method to get and set values of a collection\n// The value/s can optionally be executed if it's a function\nvar access = function( elems, fn, key, value, chainable, emptyGet, raw ) {\n\tvar i = 0,\n\t\tlen = elems.length,\n\t\tbulk = key == null;\n\n\t// Sets many values\n\tif ( jQuery.type( key ) === \"object\" ) {\n\t\tchainable = true;\n\t\tfor ( i in key ) {\n\t\t\taccess( elems, fn, i, key[ i ], true, emptyGet, raw );\n\t\t}\n\n\t// Sets one value\n\t} else if ( value !== undefined ) {\n\t\tchainable = true;\n\n\t\tif ( !jQuery.isFunction( value ) ) {\n\t\t\traw = true;\n\t\t}\n\n\t\tif ( bulk ) {\n\n\t\t\t// Bulk operations run against the entire set\n\t\t\tif ( raw ) {\n\t\t\t\tfn.call( elems, value );\n\t\t\t\tfn = null;\n\n\t\t\t// ...except when executing function values\n\t\t\t} else {\n\t\t\t\tbulk = fn;\n\t\t\t\tfn = function( elem, key, value ) {\n\t\t\t\t\treturn bulk.call( jQuery( elem ), value );\n\t\t\t\t};\n\t\t\t}\n\t\t}\n\n\t\tif ( fn ) {\n\t\t\tfor ( ; i < len; i++ ) {\n\t\t\t\tfn(\n\t\t\t\t\telems[ i ], key, raw ?\n\t\t\t\t\tvalue :\n\t\t\t\t\tvalue.call( elems[ i ], i, fn( elems[ i ], key ) )\n\t\t\t\t);\n\t\t\t}\n\t\t}\n\t}\n\n\tif ( chainable ) {\n\t\treturn elems;\n\t}\n\n\t// Gets\n\tif ( bulk ) {\n\t\treturn fn.call( elems );\n\t}\n\n\treturn len ? fn( elems[ 0 ], key ) : emptyGet;\n};\nvar acceptData = function( owner ) {\n\n\t// Accepts only:\n\t//  - Node\n\t//    - Node.ELEMENT_NODE\n\t//    - Node.DOCUMENT_NODE\n\t//  - Object\n\t//    - Any\n\treturn owner.nodeType === 1 || owner.nodeType === 9 || !( +owner.nodeType );\n};\n\n\n\n\nfunction Data() {\n\tthis.expando = jQuery.expando + Data.uid++;\n}\n\nData.uid = 1;\n\nData.prototype = {\n\n\tcache: function( owner ) {\n\n\t\t// Check if the owner object already has a cache\n\t\tvar value = owner[ this.expando ];\n\n\t\t// If not, create one\n\t\tif ( !value ) {\n\t\t\tvalue = {};\n\n\t\t\t// We can accept data for non-element nodes in modern browsers,\n\t\t\t// but we should not, see #8335.\n\t\t\t// Always return an empty object.\n\t\t\tif ( acceptData( owner ) ) {\n\n\t\t\t\t// If it is a node unlikely to be stringify-ed or looped over\n\t\t\t\t// use plain assignment\n\t\t\t\tif ( owner.nodeType ) {\n\t\t\t\t\towner[ this.expando ] = value;\n\n\t\t\t\t// Otherwise secure it in a non-enumerable property\n\t\t\t\t// configurable must be true to allow the property to be\n\t\t\t\t// deleted when data is removed\n\t\t\t\t} else {\n\t\t\t\t\tObject.defineProperty( owner, this.expando, {\n\t\t\t\t\t\tvalue: value,\n\t\t\t\t\t\tconfigurable: true\n\t\t\t\t\t} );\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn value;\n\t},\n\tset: function( owner, data, value ) {\n\t\tvar prop,\n\t\t\tcache = this.cache( owner );\n\n\t\t// Handle: [ owner, key, value ] args\n\t\t// Always use camelCase key (gh-2257)\n\t\tif ( typeof data === \"string\" ) {\n\t\t\tcache[ jQuery.camelCase( data ) ] = value;\n\n\t\t// Handle: [ owner, { properties } ] args\n\t\t} else {\n\n\t\t\t// Copy the properties one-by-one to the cache object\n\t\t\tfor ( prop in data ) {\n\t\t\t\tcache[ jQuery.camelCase( prop ) ] = data[ prop ];\n\t\t\t}\n\t\t}\n\t\treturn cache;\n\t},\n\tget: function( owner, key ) {\n\t\treturn key === undefined ?\n\t\t\tthis.cache( owner ) :\n\n\t\t\t// Always use camelCase key (gh-2257)\n\t\t\towner[ this.expando ] && owner[ this.expando ][ jQuery.camelCase( key ) ];\n\t},\n\taccess: function( owner, key, value ) {\n\n\t\t// In cases where either:\n\t\t//\n\t\t//   1. No key was specified\n\t\t//   2. A string key was specified, but no value provided\n\t\t//\n\t\t// Take the \"read\" path and allow the get method to determine\n\t\t// which value to return, respectively either:\n\t\t//\n\t\t//   1. The entire cache object\n\t\t//   2. The data stored at the key\n\t\t//\n\t\tif ( key === undefined ||\n\t\t\t\t( ( key && typeof key === \"string\" ) && value === undefined ) ) {\n\n\t\t\treturn this.get( owner, key );\n\t\t}\n\n\t\t// When the key is not a string, or both a key and value\n\t\t// are specified, set or extend (existing objects) with either:\n\t\t//\n\t\t//   1. An object of properties\n\t\t//   2. A key and value\n\t\t//\n\t\tthis.set( owner, key, value );\n\n\t\t// Since the \"set\" path can have two possible entry points\n\t\t// return the expected data based on which path was taken[*]\n\t\treturn value !== undefined ? value : key;\n\t},\n\tremove: function( owner, key ) {\n\t\tvar i,\n\t\t\tcache = owner[ this.expando ];\n\n\t\tif ( cache === undefined ) {\n\t\t\treturn;\n\t\t}\n\n\t\tif ( key !== undefined ) {\n\n\t\t\t// Support array or space separated string of keys\n\t\t\tif ( Array.isArray( key ) ) {\n\n\t\t\t\t// If key is an array of keys...\n\t\t\t\t// We always set camelCase keys, so remove that.\n\t\t\t\tkey = key.map( jQuery.camelCase );\n\t\t\t} else {\n\t\t\t\tkey = jQuery.camelCase( key );\n\n\t\t\t\t// If a key with the spaces exists, use it.\n\t\t\t\t// Otherwise, create an array by matching non-whitespace\n\t\t\t\tkey = key in cache ?\n\t\t\t\t\t[ key ] :\n\t\t\t\t\t( key.match( rnothtmlwhite ) || [] );\n\t\t\t}\n\n\t\t\ti = key.length;\n\n\t\t\twhile ( i-- ) {\n\t\t\t\tdelete cache[ key[ i ] ];\n\t\t\t}\n\t\t}\n\n\t\t// Remove the expando if there's no more data\n\t\tif ( key === undefined || jQuery.isEmptyObject( cache ) ) {\n\n\t\t\t// Support: Chrome <=35 - 45\n\t\t\t// Webkit & Blink performance suffers when deleting properties\n\t\t\t// from DOM nodes, so set to undefined instead\n\t\t\t// https://bugs.chromium.org/p/chromium/issues/detail?id=378607 (bug restricted)\n\t\t\tif ( owner.nodeType ) {\n\t\t\t\towner[ this.expando ] = undefined;\n\t\t\t} else {\n\t\t\t\tdelete owner[ this.expando ];\n\t\t\t}\n\t\t}\n\t},\n\thasData: function( owner ) {\n\t\tvar cache = owner[ this.expando ];\n\t\treturn cache !== undefined && !jQuery.isEmptyObject( cache );\n\t}\n};\nvar dataPriv = new Data();\n\nvar dataUser = new Data();\n\n\n\n//\tImplementation Summary\n//\n//\t1. Enforce API surface and semantic compatibility with 1.9.x branch\n//\t2. Improve the module's maintainability by reducing the storage\n//\t\tpaths to a single mechanism.\n//\t3. Use the same single mechanism to support \"private\" and \"user\" data.\n//\t4. _Never_ expose \"private\" data to user code (TODO: Drop _data, _removeData)\n//\t5. Avoid exposing implementation details on user objects (eg. expando properties)\n//\t6. Provide a clear path for implementation upgrade to WeakMap in 2014\n\nvar rbrace = /^(?:\\{[\\w\\W]*\\}|\\[[\\w\\W]*\\])$/,\n\trmultiDash = /[A-Z]/g;\n\nfunction getData( data ) {\n\tif ( data === \"true\" ) {\n\t\treturn true;\n\t}\n\n\tif ( data === \"false\" ) {\n\t\treturn false;\n\t}\n\n\tif ( data === \"null\" ) {\n\t\treturn null;\n\t}\n\n\t// Only convert to a number if it doesn't change the string\n\tif ( data === +data + \"\" ) {\n\t\treturn +data;\n\t}\n\n\tif ( rbrace.test( data ) ) {\n\t\treturn JSON.parse( data );\n\t}\n\n\treturn data;\n}\n\nfunction dataAttr( elem, key, data ) {\n\tvar name;\n\n\t// If nothing was found internally, try to fetch any\n\t// data from the HTML5 data-* attribute\n\tif ( data === undefined && elem.nodeType === 1 ) {\n\t\tname = \"data-\" + key.replace( rmultiDash, \"-$&\" ).toLowerCase();\n\t\tdata = elem.getAttribute( name );\n\n\t\tif ( typeof data === \"string\" ) {\n\t\t\ttry {\n\t\t\t\tdata = getData( data );\n\t\t\t} catch ( e ) {}\n\n\t\t\t// Make sure we set the data so it isn't changed later\n\t\t\tdataUser.set( elem, key, data );\n\t\t} else {\n\t\t\tdata = undefined;\n\t\t}\n\t}\n\treturn data;\n}\n\njQuery.extend( {\n\thasData: function( elem ) {\n\t\treturn dataUser.hasData( elem ) || dataPriv.hasData( elem );\n\t},\n\n\tdata: function( elem, name, data ) {\n\t\treturn dataUser.access( elem, name, data );\n\t},\n\n\tremoveData: function( elem, name ) {\n\t\tdataUser.remove( elem, name );\n\t},\n\n\t// TODO: Now that all calls to _data and _removeData have been replaced\n\t// with direct calls to dataPriv methods, these can be deprecated.\n\t_data: function( elem, name, data ) {\n\t\treturn dataPriv.access( elem, name, data );\n\t},\n\n\t_removeData: function( elem, name ) {\n\t\tdataPriv.remove( elem, name );\n\t}\n} );\n\njQuery.fn.extend( {\n\tdata: function( key, value ) {\n\t\tvar i, name, data,\n\t\t\telem = this[ 0 ],\n\t\t\tattrs = elem && elem.attributes;\n\n\t\t// Gets all values\n\t\tif ( key === undefined ) {\n\t\t\tif ( this.length ) {\n\t\t\t\tdata = dataUser.get( elem );\n\n\t\t\t\tif ( elem.nodeType === 1 && !dataPriv.get( elem, \"hasDataAttrs\" ) ) {\n\t\t\t\t\ti = attrs.length;\n\t\t\t\t\twhile ( i-- ) {\n\n\t\t\t\t\t\t// Support: IE 11 only\n\t\t\t\t\t\t// The attrs elements can be null (#14894)\n\t\t\t\t\t\tif ( attrs[ i ] ) {\n\t\t\t\t\t\t\tname = attrs[ i ].name;\n\t\t\t\t\t\t\tif ( name.indexOf( \"data-\" ) === 0 ) {\n\t\t\t\t\t\t\t\tname = jQuery.camelCase( name.slice( 5 ) );\n\t\t\t\t\t\t\t\tdataAttr( elem, name, data[ name ] );\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tdataPriv.set( elem, \"hasDataAttrs\", true );\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn data;\n\t\t}\n\n\t\t// Sets multiple values\n\t\tif ( typeof key === \"object\" ) {\n\t\t\treturn this.each( function() {\n\t\t\t\tdataUser.set( this, key );\n\t\t\t} );\n\t\t}\n\n\t\treturn access( this, function( value ) {\n\t\t\tvar data;\n\n\t\t\t// The calling jQuery object (element matches) is not empty\n\t\t\t// (and therefore has an element appears at this[ 0 ]) and the\n\t\t\t// `value` parameter was not undefined. An empty jQuery object\n\t\t\t// will result in `undefined` for elem = this[ 0 ] which will\n\t\t\t// throw an exception if an attempt to read a data cache is made.\n\t\t\tif ( elem && value === undefined ) {\n\n\t\t\t\t// Attempt to get data from the cache\n\t\t\t\t// The key will always be camelCased in Data\n\t\t\t\tdata = dataUser.get( elem, key );\n\t\t\t\tif ( data !== undefined ) {\n\t\t\t\t\treturn data;\n\t\t\t\t}\n\n\t\t\t\t// Attempt to \"discover\" the data in\n\t\t\t\t// HTML5 custom data-* attrs\n\t\t\t\tdata = dataAttr( elem, key );\n\t\t\t\tif ( data !== undefined ) {\n\t\t\t\t\treturn data;\n\t\t\t\t}\n\n\t\t\t\t// We tried really hard, but the data doesn't exist.\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// Set the data...\n\t\t\tthis.each( function() {\n\n\t\t\t\t// We always store the camelCased key\n\t\t\t\tdataUser.set( this, key, value );\n\t\t\t} );\n\t\t}, null, value, arguments.length > 1, null, true );\n\t},\n\n\tremoveData: function( key ) {\n\t\treturn this.each( function() {\n\t\t\tdataUser.remove( this, key );\n\t\t} );\n\t}\n} );\n\n\njQuery.extend( {\n\tqueue: function( elem, type, data ) {\n\t\tvar queue;\n\n\t\tif ( elem ) {\n\t\t\ttype = ( type || \"fx\" ) + \"queue\";\n\t\t\tqueue = dataPriv.get( elem, type );\n\n\t\t\t// Speed up dequeue by getting out quickly if this is just a lookup\n\t\t\tif ( data ) {\n\t\t\t\tif ( !queue || Array.isArray( data ) ) {\n\t\t\t\t\tqueue = dataPriv.access( elem, type, jQuery.makeArray( data ) );\n\t\t\t\t} else {\n\t\t\t\t\tqueue.push( data );\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn queue || [];\n\t\t}\n\t},\n\n\tdequeue: function( elem, type ) {\n\t\ttype = type || \"fx\";\n\n\t\tvar queue = jQuery.queue( elem, type ),\n\t\t\tstartLength = queue.length,\n\t\t\tfn = queue.shift(),\n\t\t\thooks = jQuery._queueHooks( elem, type ),\n\t\t\tnext = function() {\n\t\t\t\tjQuery.dequeue( elem, type );\n\t\t\t};\n\n\t\t// If the fx queue is dequeued, always remove the progress sentinel\n\t\tif ( fn === \"inprogress\" ) {\n\t\t\tfn = queue.shift();\n\t\t\tstartLength--;\n\t\t}\n\n\t\tif ( fn ) {\n\n\t\t\t// Add a progress sentinel to prevent the fx queue from being\n\t\t\t// automatically dequeued\n\t\t\tif ( type === \"fx\" ) {\n\t\t\t\tqueue.unshift( \"inprogress\" );\n\t\t\t}\n\n\t\t\t// Clear up the last queue stop function\n\t\t\tdelete hooks.stop;\n\t\t\tfn.call( elem, next, hooks );\n\t\t}\n\n\t\tif ( !startLength && hooks ) {\n\t\t\thooks.empty.fire();\n\t\t}\n\t},\n\n\t// Not public - generate a queueHooks object, or return the current one\n\t_queueHooks: function( elem, type ) {\n\t\tvar key = type + \"queueHooks\";\n\t\treturn dataPriv.get( elem, key ) || dataPriv.access( elem, key, {\n\t\t\tempty: jQuery.Callbacks( \"once memory\" ).add( function() {\n\t\t\t\tdataPriv.remove( elem, [ type + \"queue\", key ] );\n\t\t\t} )\n\t\t} );\n\t}\n} );\n\njQuery.fn.extend( {\n\tqueue: function( type, data ) {\n\t\tvar setter = 2;\n\n\t\tif ( typeof type !== \"string\" ) {\n\t\t\tdata = type;\n\t\t\ttype = \"fx\";\n\t\t\tsetter--;\n\t\t}\n\n\t\tif ( arguments.length < setter ) {\n\t\t\treturn jQuery.queue( this[ 0 ], type );\n\t\t}\n\n\t\treturn data === undefined ?\n\t\t\tthis :\n\t\t\tthis.each( function() {\n\t\t\t\tvar queue = jQuery.queue( this, type, data );\n\n\t\t\t\t// Ensure a hooks for this queue\n\t\t\t\tjQuery._queueHooks( this, type );\n\n\t\t\t\tif ( type === \"fx\" && queue[ 0 ] !== \"inprogress\" ) {\n\t\t\t\t\tjQuery.dequeue( this, type );\n\t\t\t\t}\n\t\t\t} );\n\t},\n\tdequeue: function( type ) {\n\t\treturn this.each( function() {\n\t\t\tjQuery.dequeue( this, type );\n\t\t} );\n\t},\n\tclearQueue: function( type ) {\n\t\treturn this.queue( type || \"fx\", [] );\n\t},\n\n\t// Get a promise resolved when queues of a certain type\n\t// are emptied (fx is the type by default)\n\tpromise: function( type, obj ) {\n\t\tvar tmp,\n\t\t\tcount = 1,\n\t\t\tdefer = jQuery.Deferred(),\n\t\t\telements = this,\n\t\t\ti = this.length,\n\t\t\tresolve = function() {\n\t\t\t\tif ( !( --count ) ) {\n\t\t\t\t\tdefer.resolveWith( elements, [ elements ] );\n\t\t\t\t}\n\t\t\t};\n\n\t\tif ( typeof type !== \"string\" ) {\n\t\t\tobj = type;\n\t\t\ttype = undefined;\n\t\t}\n\t\ttype = type || \"fx\";\n\n\t\twhile ( i-- ) {\n\t\t\ttmp = dataPriv.get( elements[ i ], type + \"queueHooks\" );\n\t\t\tif ( tmp && tmp.empty ) {\n\t\t\t\tcount++;\n\t\t\t\ttmp.empty.add( resolve );\n\t\t\t}\n\t\t}\n\t\tresolve();\n\t\treturn defer.promise( obj );\n\t}\n} );\nvar pnum = ( /[+-]?(?:\\d*\\.|)\\d+(?:[eE][+-]?\\d+|)/ ).source;\n\nvar rcssNum = new RegExp( \"^(?:([+-])=|)(\" + pnum + \")([a-z%]*)$\", \"i\" );\n\n\nvar cssExpand = [ \"Top\", \"Right\", \"Bottom\", \"Left\" ];\n\nvar isHiddenWithinTree = function( elem, el ) {\n\n\t\t// isHiddenWithinTree might be called from jQuery#filter function;\n\t\t// in that case, element will be second argument\n\t\telem = el || elem;\n\n\t\t// Inline style trumps all\n\t\treturn elem.style.display === \"none\" ||\n\t\t\telem.style.display === \"\" &&\n\n\t\t\t// Otherwise, check computed style\n\t\t\t// Support: Firefox <=43 - 45\n\t\t\t// Disconnected elements can have computed display: none, so first confirm that elem is\n\t\t\t// in the document.\n\t\t\tjQuery.contains( elem.ownerDocument, elem ) &&\n\n\t\t\tjQuery.css( elem, \"display\" ) === \"none\";\n\t};\n\nvar swap = function( elem, options, callback, args ) {\n\tvar ret, name,\n\t\told = {};\n\n\t// Remember the old values, and insert the new ones\n\tfor ( name in options ) {\n\t\told[ name ] = elem.style[ name ];\n\t\telem.style[ name ] = options[ name ];\n\t}\n\n\tret = callback.apply( elem, args || [] );\n\n\t// Revert the old values\n\tfor ( name in options ) {\n\t\telem.style[ name ] = old[ name ];\n\t}\n\n\treturn ret;\n};\n\n\n\n\nfunction adjustCSS( elem, prop, valueParts, tween ) {\n\tvar adjusted,\n\t\tscale = 1,\n\t\tmaxIterations = 20,\n\t\tcurrentValue = tween ?\n\t\t\tfunction() {\n\t\t\t\treturn tween.cur();\n\t\t\t} :\n\t\t\tfunction() {\n\t\t\t\treturn jQuery.css( elem, prop, \"\" );\n\t\t\t},\n\t\tinitial = currentValue(),\n\t\tunit = valueParts && valueParts[ 3 ] || ( jQuery.cssNumber[ prop ] ? \"\" : \"px\" ),\n\n\t\t// Starting value computation is required for potential unit mismatches\n\t\tinitialInUnit = ( jQuery.cssNumber[ prop ] || unit !== \"px\" && +initial ) &&\n\t\t\trcssNum.exec( jQuery.css( elem, prop ) );\n\n\tif ( initialInUnit && initialInUnit[ 3 ] !== unit ) {\n\n\t\t// Trust units reported by jQuery.css\n\t\tunit = unit || initialInUnit[ 3 ];\n\n\t\t// Make sure we update the tween properties later on\n\t\tvalueParts = valueParts || [];\n\n\t\t// Iteratively approximate from a nonzero starting point\n\t\tinitialInUnit = +initial || 1;\n\n\t\tdo {\n\n\t\t\t// If previous iteration zeroed out, double until we get *something*.\n\t\t\t// Use string for doubling so we don't accidentally see scale as unchanged below\n\t\t\tscale = scale || \".5\";\n\n\t\t\t// Adjust and apply\n\t\t\tinitialInUnit = initialInUnit / scale;\n\t\t\tjQuery.style( elem, prop, initialInUnit + unit );\n\n\t\t// Update scale, tolerating zero or NaN from tween.cur()\n\t\t// Break the loop if scale is unchanged or perfect, or if we've just had enough.\n\t\t} while (\n\t\t\tscale !== ( scale = currentValue() / initial ) && scale !== 1 && --maxIterations\n\t\t);\n\t}\n\n\tif ( valueParts ) {\n\t\tinitialInUnit = +initialInUnit || +initial || 0;\n\n\t\t// Apply relative offset (+=/-=) if specified\n\t\tadjusted = valueParts[ 1 ] ?\n\t\t\tinitialInUnit + ( valueParts[ 1 ] + 1 ) * valueParts[ 2 ] :\n\t\t\t+valueParts[ 2 ];\n\t\tif ( tween ) {\n\t\t\ttween.unit = unit;\n\t\t\ttween.start = initialInUnit;\n\t\t\ttween.end = adjusted;\n\t\t}\n\t}\n\treturn adjusted;\n}\n\n\nvar defaultDisplayMap = {};\n\nfunction getDefaultDisplay( elem ) {\n\tvar temp,\n\t\tdoc = elem.ownerDocument,\n\t\tnodeName = elem.nodeName,\n\t\tdisplay = defaultDisplayMap[ nodeName ];\n\n\tif ( display ) {\n\t\treturn display;\n\t}\n\n\ttemp = doc.body.appendChild( doc.createElement( nodeName ) );\n\tdisplay = jQuery.css( temp, \"display\" );\n\n\ttemp.parentNode.removeChild( temp );\n\n\tif ( display === \"none\" ) {\n\t\tdisplay = \"block\";\n\t}\n\tdefaultDisplayMap[ nodeName ] = display;\n\n\treturn display;\n}\n\nfunction showHide( elements, show ) {\n\tvar display, elem,\n\t\tvalues = [],\n\t\tindex = 0,\n\t\tlength = elements.length;\n\n\t// Determine new display value for elements that need to change\n\tfor ( ; index < length; index++ ) {\n\t\telem = elements[ index ];\n\t\tif ( !elem.style ) {\n\t\t\tcontinue;\n\t\t}\n\n\t\tdisplay = elem.style.display;\n\t\tif ( show ) {\n\n\t\t\t// Since we force visibility upon cascade-hidden elements, an immediate (and slow)\n\t\t\t// check is required in this first loop unless we have a nonempty display value (either\n\t\t\t// inline or about-to-be-restored)\n\t\t\tif ( display === \"none\" ) {\n\t\t\t\tvalues[ index ] = dataPriv.get( elem, \"display\" ) || null;\n\t\t\t\tif ( !values[ index ] ) {\n\t\t\t\t\telem.style.display = \"\";\n\t\t\t\t}\n\t\t\t}\n\t\t\tif ( elem.style.display === \"\" && isHiddenWithinTree( elem ) ) {\n\t\t\t\tvalues[ index ] = getDefaultDisplay( elem );\n\t\t\t}\n\t\t} else {\n\t\t\tif ( display !== \"none\" ) {\n\t\t\t\tvalues[ index ] = \"none\";\n\n\t\t\t\t// Remember what we're overwriting\n\t\t\t\tdataPriv.set( elem, \"display\", display );\n\t\t\t}\n\t\t}\n\t}\n\n\t// Set the display of the elements in a second loop to avoid constant reflow\n\tfor ( index = 0; index < length; index++ ) {\n\t\tif ( values[ index ] != null ) {\n\t\t\telements[ index ].style.display = values[ index ];\n\t\t}\n\t}\n\n\treturn elements;\n}\n\njQuery.fn.extend( {\n\tshow: function() {\n\t\treturn showHide( this, true );\n\t},\n\thide: function() {\n\t\treturn showHide( this );\n\t},\n\ttoggle: function( state ) {\n\t\tif ( typeof state === \"boolean\" ) {\n\t\t\treturn state ? this.show() : this.hide();\n\t\t}\n\n\t\treturn this.each( function() {\n\t\t\tif ( isHiddenWithinTree( this ) ) {\n\t\t\t\tjQuery( this ).show();\n\t\t\t} else {\n\t\t\t\tjQuery( this ).hide();\n\t\t\t}\n\t\t} );\n\t}\n} );\nvar rcheckableType = ( /^(?:checkbox|radio)$/i );\n\nvar rtagName = ( /<([a-z][^\\/\\0>\\x20\\t\\r\\n\\f]+)/i );\n\nvar rscriptType = ( /^$|\\/(?:java|ecma)script/i );\n\n\n\n// We have to close these tags to support XHTML (#13200)\nvar wrapMap = {\n\n\t// Support: IE <=9 only\n\toption: [ 1, \"<select multiple='multiple'>\", \"</select>\" ],\n\n\t// XHTML parsers do not magically insert elements in the\n\t// same way that tag soup parsers do. So we cannot shorten\n\t// this by omitting <tbody> or other required elements.\n\tthead: [ 1, \"<table>\", \"</table>\" ],\n\tcol: [ 2, \"<table><colgroup>\", \"</colgroup></table>\" ],\n\ttr: [ 2, \"<table><tbody>\", \"</tbody></table>\" ],\n\ttd: [ 3, \"<table><tbody><tr>\", \"</tr></tbody></table>\" ],\n\n\t_default: [ 0, \"\", \"\" ]\n};\n\n// Support: IE <=9 only\nwrapMap.optgroup = wrapMap.option;\n\nwrapMap.tbody = wrapMap.tfoot = wrapMap.colgroup = wrapMap.caption = wrapMap.thead;\nwrapMap.th = wrapMap.td;\n\n\nfunction getAll( context, tag ) {\n\n\t// Support: IE <=9 - 11 only\n\t// Use typeof to avoid zero-argument method invocation on host objects (#15151)\n\tvar ret;\n\n\tif ( typeof context.getElementsByTagName !== \"undefined\" ) {\n\t\tret = context.getElementsByTagName( tag || \"*\" );\n\n\t} else if ( typeof context.querySelectorAll !== \"undefined\" ) {\n\t\tret = context.querySelectorAll( tag || \"*\" );\n\n\t} else {\n\t\tret = [];\n\t}\n\n\tif ( tag === undefined || tag && nodeName( context, tag ) ) {\n\t\treturn jQuery.merge( [ context ], ret );\n\t}\n\n\treturn ret;\n}\n\n\n// Mark scripts as having already been evaluated\nfunction setGlobalEval( elems, refElements ) {\n\tvar i = 0,\n\t\tl = elems.length;\n\n\tfor ( ; i < l; i++ ) {\n\t\tdataPriv.set(\n\t\t\telems[ i ],\n\t\t\t\"globalEval\",\n\t\t\t!refElements || dataPriv.get( refElements[ i ], \"globalEval\" )\n\t\t);\n\t}\n}\n\n\nvar rhtml = /<|&#?\\w+;/;\n\nfunction buildFragment( elems, context, scripts, selection, ignored ) {\n\tvar elem, tmp, tag, wrap, contains, j,\n\t\tfragment = context.createDocumentFragment(),\n\t\tnodes = [],\n\t\ti = 0,\n\t\tl = elems.length;\n\n\tfor ( ; i < l; i++ ) {\n\t\telem = elems[ i ];\n\n\t\tif ( elem || elem === 0 ) {\n\n\t\t\t// Add nodes directly\n\t\t\tif ( jQuery.type( elem ) === \"object\" ) {\n\n\t\t\t\t// Support: Android <=4.0 only, PhantomJS 1 only\n\t\t\t\t// push.apply(_, arraylike) throws on ancient WebKit\n\t\t\t\tjQuery.merge( nodes, elem.nodeType ? [ elem ] : elem );\n\n\t\t\t// Convert non-html into a text node\n\t\t\t} else if ( !rhtml.test( elem ) ) {\n\t\t\t\tnodes.push( context.createTextNode( elem ) );\n\n\t\t\t// Convert html into DOM nodes\n\t\t\t} else {\n\t\t\t\ttmp = tmp || fragment.appendChild( context.createElement( \"div\" ) );\n\n\t\t\t\t// Deserialize a standard representation\n\t\t\t\ttag = ( rtagName.exec( elem ) || [ \"\", \"\" ] )[ 1 ].toLowerCase();\n\t\t\t\twrap = wrapMap[ tag ] || wrapMap._default;\n\t\t\t\ttmp.innerHTML = wrap[ 1 ] + jQuery.htmlPrefilter( elem ) + wrap[ 2 ];\n\n\t\t\t\t// Descend through wrappers to the right content\n\t\t\t\tj = wrap[ 0 ];\n\t\t\t\twhile ( j-- ) {\n\t\t\t\t\ttmp = tmp.lastChild;\n\t\t\t\t}\n\n\t\t\t\t// Support: Android <=4.0 only, PhantomJS 1 only\n\t\t\t\t// push.apply(_, arraylike) throws on ancient WebKit\n\t\t\t\tjQuery.merge( nodes, tmp.childNodes );\n\n\t\t\t\t// Remember the top-level container\n\t\t\t\ttmp = fragment.firstChild;\n\n\t\t\t\t// Ensure the created nodes are orphaned (#12392)\n\t\t\t\ttmp.textContent = \"\";\n\t\t\t}\n\t\t}\n\t}\n\n\t// Remove wrapper from fragment\n\tfragment.textContent = \"\";\n\n\ti = 0;\n\twhile ( ( elem = nodes[ i++ ] ) ) {\n\n\t\t// Skip elements already in the context collection (trac-4087)\n\t\tif ( selection && jQuery.inArray( elem, selection ) > -1 ) {\n\t\t\tif ( ignored ) {\n\t\t\t\tignored.push( elem );\n\t\t\t}\n\t\t\tcontinue;\n\t\t}\n\n\t\tcontains = jQuery.contains( elem.ownerDocument, elem );\n\n\t\t// Append to fragment\n\t\ttmp = getAll( fragment.appendChild( elem ), \"script\" );\n\n\t\t// Preserve script evaluation history\n\t\tif ( contains ) {\n\t\t\tsetGlobalEval( tmp );\n\t\t}\n\n\t\t// Capture executables\n\t\tif ( scripts ) {\n\t\t\tj = 0;\n\t\t\twhile ( ( elem = tmp[ j++ ] ) ) {\n\t\t\t\tif ( rscriptType.test( elem.type || \"\" ) ) {\n\t\t\t\t\tscripts.push( elem );\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\treturn fragment;\n}\n\n\n( function() {\n\tvar fragment = document.createDocumentFragment(),\n\t\tdiv = fragment.appendChild( document.createElement( \"div\" ) ),\n\t\tinput = document.createElement( \"input\" );\n\n\t// Support: Android 4.0 - 4.3 only\n\t// Check state lost if the name is set (#11217)\n\t// Support: Windows Web Apps (WWA)\n\t// `name` and `type` must use .setAttribute for WWA (#14901)\n\tinput.setAttribute( \"type\", \"radio\" );\n\tinput.setAttribute( \"checked\", \"checked\" );\n\tinput.setAttribute( \"name\", \"t\" );\n\n\tdiv.appendChild( input );\n\n\t// Support: Android <=4.1 only\n\t// Older WebKit doesn't clone checked state correctly in fragments\n\tsupport.checkClone = div.cloneNode( true ).cloneNode( true ).lastChild.checked;\n\n\t// Support: IE <=11 only\n\t// Make sure textarea (and checkbox) defaultValue is properly cloned\n\tdiv.innerHTML = \"<textarea>x</textarea>\";\n\tsupport.noCloneChecked = !!div.cloneNode( true ).lastChild.defaultValue;\n} )();\nvar documentElement = document.documentElement;\n\n\n\nvar\n\trkeyEvent = /^key/,\n\trmouseEvent = /^(?:mouse|pointer|contextmenu|drag|drop)|click/,\n\trtypenamespace = /^([^.]*)(?:\\.(.+)|)/;\n\nfunction returnTrue() {\n\treturn true;\n}\n\nfunction returnFalse() {\n\treturn false;\n}\n\n// Support: IE <=9 only\n// See #13393 for more info\nfunction safeActiveElement() {\n\ttry {\n\t\treturn document.activeElement;\n\t} catch ( err ) { }\n}\n\nfunction on( elem, types, selector, data, fn, one ) {\n\tvar origFn, type;\n\n\t// Types can be a map of types/handlers\n\tif ( typeof types === \"object\" ) {\n\n\t\t// ( types-Object, selector, data )\n\t\tif ( typeof selector !== \"string\" ) {\n\n\t\t\t// ( types-Object, data )\n\t\t\tdata = data || selector;\n\t\t\tselector = undefined;\n\t\t}\n\t\tfor ( type in types ) {\n\t\t\ton( elem, type, selector, data, types[ type ], one );\n\t\t}\n\t\treturn elem;\n\t}\n\n\tif ( data == null && fn == null ) {\n\n\t\t// ( types, fn )\n\t\tfn = selector;\n\t\tdata = selector = undefined;\n\t} else if ( fn == null ) {\n\t\tif ( typeof selector === \"string\" ) {\n\n\t\t\t// ( types, selector, fn )\n\t\t\tfn = data;\n\t\t\tdata = undefined;\n\t\t} else {\n\n\t\t\t// ( types, data, fn )\n\t\t\tfn = data;\n\t\t\tdata = selector;\n\t\t\tselector = undefined;\n\t\t}\n\t}\n\tif ( fn === false ) {\n\t\tfn = returnFalse;\n\t} else if ( !fn ) {\n\t\treturn elem;\n\t}\n\n\tif ( one === 1 ) {\n\t\torigFn = fn;\n\t\tfn = function( event ) {\n\n\t\t\t// Can use an empty set, since event contains the info\n\t\t\tjQuery().off( event );\n\t\t\treturn origFn.apply( this, arguments );\n\t\t};\n\n\t\t// Use same guid so caller can remove using origFn\n\t\tfn.guid = origFn.guid || ( origFn.guid = jQuery.guid++ );\n\t}\n\treturn elem.each( function() {\n\t\tjQuery.event.add( this, types, fn, data, selector );\n\t} );\n}\n\n/*\n * Helper functions for managing events -- not part of the public interface.\n * Props to Dean Edwards' addEvent library for many of the ideas.\n */\njQuery.event = {\n\n\tglobal: {},\n\n\tadd: function( elem, types, handler, data, selector ) {\n\n\t\tvar handleObjIn, eventHandle, tmp,\n\t\t\tevents, t, handleObj,\n\t\t\tspecial, handlers, type, namespaces, origType,\n\t\t\telemData = dataPriv.get( elem );\n\n\t\t// Don't attach events to noData or text/comment nodes (but allow plain objects)\n\t\tif ( !elemData ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Caller can pass in an object of custom data in lieu of the handler\n\t\tif ( handler.handler ) {\n\t\t\thandleObjIn = handler;\n\t\t\thandler = handleObjIn.handler;\n\t\t\tselector = handleObjIn.selector;\n\t\t}\n\n\t\t// Ensure that invalid selectors throw exceptions at attach time\n\t\t// Evaluate against documentElement in case elem is a non-element node (e.g., document)\n\t\tif ( selector ) {\n\t\t\tjQuery.find.matchesSelector( documentElement, selector );\n\t\t}\n\n\t\t// Make sure that the handler has a unique ID, used to find/remove it later\n\t\tif ( !handler.guid ) {\n\t\t\thandler.guid = jQuery.guid++;\n\t\t}\n\n\t\t// Init the element's event structure and main handler, if this is the first\n\t\tif ( !( events = elemData.events ) ) {\n\t\t\tevents = elemData.events = {};\n\t\t}\n\t\tif ( !( eventHandle = elemData.handle ) ) {\n\t\t\teventHandle = elemData.handle = function( e ) {\n\n\t\t\t\t// Discard the second event of a jQuery.event.trigger() and\n\t\t\t\t// when an event is called after a page has unloaded\n\t\t\t\treturn typeof jQuery !== \"undefined\" && jQuery.event.triggered !== e.type ?\n\t\t\t\t\tjQuery.event.dispatch.apply( elem, arguments ) : undefined;\n\t\t\t};\n\t\t}\n\n\t\t// Handle multiple events separated by a space\n\t\ttypes = ( types || \"\" ).match( rnothtmlwhite ) || [ \"\" ];\n\t\tt = types.length;\n\t\twhile ( t-- ) {\n\t\t\ttmp = rtypenamespace.exec( types[ t ] ) || [];\n\t\t\ttype = origType = tmp[ 1 ];\n\t\t\tnamespaces = ( tmp[ 2 ] || \"\" ).split( \".\" ).sort();\n\n\t\t\t// There *must* be a type, no attaching namespace-only handlers\n\t\t\tif ( !type ) {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\t// If event changes its type, use the special event handlers for the changed type\n\t\t\tspecial = jQuery.event.special[ type ] || {};\n\n\t\t\t// If selector defined, determine special event api type, otherwise given type\n\t\t\ttype = ( selector ? special.delegateType : special.bindType ) || type;\n\n\t\t\t// Update special based on newly reset type\n\t\t\tspecial = jQuery.event.special[ type ] || {};\n\n\t\t\t// handleObj is passed to all event handlers\n\t\t\thandleObj = jQuery.extend( {\n\t\t\t\ttype: type,\n\t\t\t\torigType: origType,\n\t\t\t\tdata: data,\n\t\t\t\thandler: handler,\n\t\t\t\tguid: handler.guid,\n\t\t\t\tselector: selector,\n\t\t\t\tneedsContext: selector && jQuery.expr.match.needsContext.test( selector ),\n\t\t\t\tnamespace: namespaces.join( \".\" )\n\t\t\t}, handleObjIn );\n\n\t\t\t// Init the event handler queue if we're the first\n\t\t\tif ( !( handlers = events[ type ] ) ) {\n\t\t\t\thandlers = events[ type ] = [];\n\t\t\t\thandlers.delegateCount = 0;\n\n\t\t\t\t// Only use addEventListener if the special events handler returns false\n\t\t\t\tif ( !special.setup ||\n\t\t\t\t\tspecial.setup.call( elem, data, namespaces, eventHandle ) === false ) {\n\n\t\t\t\t\tif ( elem.addEventListener ) {\n\t\t\t\t\t\telem.addEventListener( type, eventHandle );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif ( special.add ) {\n\t\t\t\tspecial.add.call( elem, handleObj );\n\n\t\t\t\tif ( !handleObj.handler.guid ) {\n\t\t\t\t\thandleObj.handler.guid = handler.guid;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Add to the element's handler list, delegates in front\n\t\t\tif ( selector ) {\n\t\t\t\thandlers.splice( handlers.delegateCount++, 0, handleObj );\n\t\t\t} else {\n\t\t\t\thandlers.push( handleObj );\n\t\t\t}\n\n\t\t\t// Keep track of which events have ever been used, for event optimization\n\t\t\tjQuery.event.global[ type ] = true;\n\t\t}\n\n\t},\n\n\t// Detach an event or set of events from an element\n\tremove: function( elem, types, handler, selector, mappedTypes ) {\n\n\t\tvar j, origCount, tmp,\n\t\t\tevents, t, handleObj,\n\t\t\tspecial, handlers, type, namespaces, origType,\n\t\t\telemData = dataPriv.hasData( elem ) && dataPriv.get( elem );\n\n\t\tif ( !elemData || !( events = elemData.events ) ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Once for each type.namespace in types; type may be omitted\n\t\ttypes = ( types || \"\" ).match( rnothtmlwhite ) || [ \"\" ];\n\t\tt = types.length;\n\t\twhile ( t-- ) {\n\t\t\ttmp = rtypenamespace.exec( types[ t ] ) || [];\n\t\t\ttype = origType = tmp[ 1 ];\n\t\t\tnamespaces = ( tmp[ 2 ] || \"\" ).split( \".\" ).sort();\n\n\t\t\t// Unbind all events (on this namespace, if provided) for the element\n\t\t\tif ( !type ) {\n\t\t\t\tfor ( type in events ) {\n\t\t\t\t\tjQuery.event.remove( elem, type + types[ t ], handler, selector, true );\n\t\t\t\t}\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tspecial = jQuery.event.special[ type ] || {};\n\t\t\ttype = ( selector ? special.delegateType : special.bindType ) || type;\n\t\t\thandlers = events[ type ] || [];\n\t\t\ttmp = tmp[ 2 ] &&\n\t\t\t\tnew RegExp( \"(^|\\\\.)\" + namespaces.join( \"\\\\.(?:.*\\\\.|)\" ) + \"(\\\\.|$)\" );\n\n\t\t\t// Remove matching events\n\t\t\torigCount = j = handlers.length;\n\t\t\twhile ( j-- ) {\n\t\t\t\thandleObj = handlers[ j ];\n\n\t\t\t\tif ( ( mappedTypes || origType === handleObj.origType ) &&\n\t\t\t\t\t( !handler || handler.guid === handleObj.guid ) &&\n\t\t\t\t\t( !tmp || tmp.test( handleObj.namespace ) ) &&\n\t\t\t\t\t( !selector || selector === handleObj.selector ||\n\t\t\t\t\t\tselector === \"**\" && handleObj.selector ) ) {\n\t\t\t\t\thandlers.splice( j, 1 );\n\n\t\t\t\t\tif ( handleObj.selector ) {\n\t\t\t\t\t\thandlers.delegateCount--;\n\t\t\t\t\t}\n\t\t\t\t\tif ( special.remove ) {\n\t\t\t\t\t\tspecial.remove.call( elem, handleObj );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Remove generic event handler if we removed something and no more handlers exist\n\t\t\t// (avoids potential for endless recursion during removal of special event handlers)\n\t\t\tif ( origCount && !handlers.length ) {\n\t\t\t\tif ( !special.teardown ||\n\t\t\t\t\tspecial.teardown.call( elem, namespaces, elemData.handle ) === false ) {\n\n\t\t\t\t\tjQuery.removeEvent( elem, type, elemData.handle );\n\t\t\t\t}\n\n\t\t\t\tdelete events[ type ];\n\t\t\t}\n\t\t}\n\n\t\t// Remove data and the expando if it's no longer used\n\t\tif ( jQuery.isEmptyObject( events ) ) {\n\t\t\tdataPriv.remove( elem, \"handle events\" );\n\t\t}\n\t},\n\n\tdispatch: function( nativeEvent ) {\n\n\t\t// Make a writable jQuery.Event from the native event object\n\t\tvar event = jQuery.event.fix( nativeEvent );\n\n\t\tvar i, j, ret, matched, handleObj, handlerQueue,\n\t\t\targs = new Array( arguments.length ),\n\t\t\thandlers = ( dataPriv.get( this, \"events\" ) || {} )[ event.type ] || [],\n\t\t\tspecial = jQuery.event.special[ event.type ] || {};\n\n\t\t// Use the fix-ed jQuery.Event rather than the (read-only) native event\n\t\targs[ 0 ] = event;\n\n\t\tfor ( i = 1; i < arguments.length; i++ ) {\n\t\t\targs[ i ] = arguments[ i ];\n\t\t}\n\n\t\tevent.delegateTarget = this;\n\n\t\t// Call the preDispatch hook for the mapped type, and let it bail if desired\n\t\tif ( special.preDispatch && special.preDispatch.call( this, event ) === false ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Determine handlers\n\t\thandlerQueue = jQuery.event.handlers.call( this, event, handlers );\n\n\t\t// Run delegates first; they may want to stop propagation beneath us\n\t\ti = 0;\n\t\twhile ( ( matched = handlerQueue[ i++ ] ) && !event.isPropagationStopped() ) {\n\t\t\tevent.currentTarget = matched.elem;\n\n\t\t\tj = 0;\n\t\t\twhile ( ( handleObj = matched.handlers[ j++ ] ) &&\n\t\t\t\t!event.isImmediatePropagationStopped() ) {\n\n\t\t\t\t// Triggered event must either 1) have no namespace, or 2) have namespace(s)\n\t\t\t\t// a subset or equal to those in the bound event (both can have no namespace).\n\t\t\t\tif ( !event.rnamespace || event.rnamespace.test( handleObj.namespace ) ) {\n\n\t\t\t\t\tevent.handleObj = handleObj;\n\t\t\t\t\tevent.data = handleObj.data;\n\n\t\t\t\t\tret = ( ( jQuery.event.special[ handleObj.origType ] || {} ).handle ||\n\t\t\t\t\t\thandleObj.handler ).apply( matched.elem, args );\n\n\t\t\t\t\tif ( ret !== undefined ) {\n\t\t\t\t\t\tif ( ( event.result = ret ) === false ) {\n\t\t\t\t\t\t\tevent.preventDefault();\n\t\t\t\t\t\t\tevent.stopPropagation();\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// Call the postDispatch hook for the mapped type\n\t\tif ( special.postDispatch ) {\n\t\t\tspecial.postDispatch.call( this, event );\n\t\t}\n\n\t\treturn event.result;\n\t},\n\n\thandlers: function( event, handlers ) {\n\t\tvar i, handleObj, sel, matchedHandlers, matchedSelectors,\n\t\t\thandlerQueue = [],\n\t\t\tdelegateCount = handlers.delegateCount,\n\t\t\tcur = event.target;\n\n\t\t// Find delegate handlers\n\t\tif ( delegateCount &&\n\n\t\t\t// Support: IE <=9\n\t\t\t// Black-hole SVG <use> instance trees (trac-13180)\n\t\t\tcur.nodeType &&\n\n\t\t\t// Support: Firefox <=42\n\t\t\t// Suppress spec-violating clicks indicating a non-primary pointer button (trac-3861)\n\t\t\t// https://www.w3.org/TR/DOM-Level-3-Events/#event-type-click\n\t\t\t// Support: IE 11 only\n\t\t\t// ...but not arrow key \"clicks\" of radio inputs, which can have `button` -1 (gh-2343)\n\t\t\t!( event.type === \"click\" && event.button >= 1 ) ) {\n\n\t\t\tfor ( ; cur !== this; cur = cur.parentNode || this ) {\n\n\t\t\t\t// Don't check non-elements (#13208)\n\t\t\t\t// Don't process clicks on disabled elements (#6911, #8165, #11382, #11764)\n\t\t\t\tif ( cur.nodeType === 1 && !( event.type === \"click\" && cur.disabled === true ) ) {\n\t\t\t\t\tmatchedHandlers = [];\n\t\t\t\t\tmatchedSelectors = {};\n\t\t\t\t\tfor ( i = 0; i < delegateCount; i++ ) {\n\t\t\t\t\t\thandleObj = handlers[ i ];\n\n\t\t\t\t\t\t// Don't conflict with Object.prototype properties (#13203)\n\t\t\t\t\t\tsel = handleObj.selector + \" \";\n\n\t\t\t\t\t\tif ( matchedSelectors[ sel ] === undefined ) {\n\t\t\t\t\t\t\tmatchedSelectors[ sel ] = handleObj.needsContext ?\n\t\t\t\t\t\t\t\tjQuery( sel, this ).index( cur ) > -1 :\n\t\t\t\t\t\t\t\tjQuery.find( sel, this, null, [ cur ] ).length;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif ( matchedSelectors[ sel ] ) {\n\t\t\t\t\t\t\tmatchedHandlers.push( handleObj );\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tif ( matchedHandlers.length ) {\n\t\t\t\t\t\thandlerQueue.push( { elem: cur, handlers: matchedHandlers } );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// Add the remaining (directly-bound) handlers\n\t\tcur = this;\n\t\tif ( delegateCount < handlers.length ) {\n\t\t\thandlerQueue.push( { elem: cur, handlers: handlers.slice( delegateCount ) } );\n\t\t}\n\n\t\treturn handlerQueue;\n\t},\n\n\taddProp: function( name, hook ) {\n\t\tObject.defineProperty( jQuery.Event.prototype, name, {\n\t\t\tenumerable: true,\n\t\t\tconfigurable: true,\n\n\t\t\tget: jQuery.isFunction( hook ) ?\n\t\t\t\tfunction() {\n\t\t\t\t\tif ( this.originalEvent ) {\n\t\t\t\t\t\t\treturn hook( this.originalEvent );\n\t\t\t\t\t}\n\t\t\t\t} :\n\t\t\t\tfunction() {\n\t\t\t\t\tif ( this.originalEvent ) {\n\t\t\t\t\t\t\treturn this.originalEvent[ name ];\n\t\t\t\t\t}\n\t\t\t\t},\n\n\t\t\tset: function( value ) {\n\t\t\t\tObject.defineProperty( this, name, {\n\t\t\t\t\tenumerable: true,\n\t\t\t\t\tconfigurable: true,\n\t\t\t\t\twritable: true,\n\t\t\t\t\tvalue: value\n\t\t\t\t} );\n\t\t\t}\n\t\t} );\n\t},\n\n\tfix: function( originalEvent ) {\n\t\treturn originalEvent[ jQuery.expando ] ?\n\t\t\toriginalEvent :\n\t\t\tnew jQuery.Event( originalEvent );\n\t},\n\n\tspecial: {\n\t\tload: {\n\n\t\t\t// Prevent triggered image.load events from bubbling to window.load\n\t\t\tnoBubble: true\n\t\t},\n\t\tfocus: {\n\n\t\t\t// Fire native event if possible so blur/focus sequence is correct\n\t\t\ttrigger: function() {\n\t\t\t\tif ( this !== safeActiveElement() && this.focus ) {\n\t\t\t\t\tthis.focus();\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t},\n\t\t\tdelegateType: \"focusin\"\n\t\t},\n\t\tblur: {\n\t\t\ttrigger: function() {\n\t\t\t\tif ( this === safeActiveElement() && this.blur ) {\n\t\t\t\t\tthis.blur();\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t},\n\t\t\tdelegateType: \"focusout\"\n\t\t},\n\t\tclick: {\n\n\t\t\t// For checkbox, fire native event so checked state will be right\n\t\t\ttrigger: function() {\n\t\t\t\tif ( this.type === \"checkbox\" && this.click && nodeName( this, \"input\" ) ) {\n\t\t\t\t\tthis.click();\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t},\n\n\t\t\t// For cross-browser consistency, don't fire native .click() on links\n\t\t\t_default: function( event ) {\n\t\t\t\treturn nodeName( event.target, \"a\" );\n\t\t\t}\n\t\t},\n\n\t\tbeforeunload: {\n\t\t\tpostDispatch: function( event ) {\n\n\t\t\t\t// Support: Firefox 20+\n\t\t\t\t// Firefox doesn't alert if the returnValue field is not set.\n\t\t\t\tif ( event.result !== undefined && event.originalEvent ) {\n\t\t\t\t\tevent.originalEvent.returnValue = event.result;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n};\n\njQuery.removeEvent = function( elem, type, handle ) {\n\n\t// This \"if\" is needed for plain objects\n\tif ( elem.removeEventListener ) {\n\t\telem.removeEventListener( type, handle );\n\t}\n};\n\njQuery.Event = function( src, props ) {\n\n\t// Allow instantiation without the 'new' keyword\n\tif ( !( this instanceof jQuery.Event ) ) {\n\t\treturn new jQuery.Event( src, props );\n\t}\n\n\t// Event object\n\tif ( src && src.type ) {\n\t\tthis.originalEvent = src;\n\t\tthis.type = src.type;\n\n\t\t// Events bubbling up the document may have been marked as prevented\n\t\t// by a handler lower down the tree; reflect the correct value.\n\t\tthis.isDefaultPrevented = src.defaultPrevented ||\n\t\t\t\tsrc.defaultPrevented === undefined &&\n\n\t\t\t\t// Support: Android <=2.3 only\n\t\t\t\tsrc.returnValue === false ?\n\t\t\treturnTrue :\n\t\t\treturnFalse;\n\n\t\t// Create target properties\n\t\t// Support: Safari <=6 - 7 only\n\t\t// Target should not be a text node (#504, #13143)\n\t\tthis.target = ( src.target && src.target.nodeType === 3 ) ?\n\t\t\tsrc.target.parentNode :\n\t\t\tsrc.target;\n\n\t\tthis.currentTarget = src.currentTarget;\n\t\tthis.relatedTarget = src.relatedTarget;\n\n\t// Event type\n\t} else {\n\t\tthis.type = src;\n\t}\n\n\t// Put explicitly provided properties onto the event object\n\tif ( props ) {\n\t\tjQuery.extend( this, props );\n\t}\n\n\t// Create a timestamp if incoming event doesn't have one\n\tthis.timeStamp = src && src.timeStamp || jQuery.now();\n\n\t// Mark it as fixed\n\tthis[ jQuery.expando ] = true;\n};\n\n// jQuery.Event is based on DOM3 Events as specified by the ECMAScript Language Binding\n// https://www.w3.org/TR/2003/WD-DOM-Level-3-Events-20030331/ecma-script-binding.html\njQuery.Event.prototype = {\n\tconstructor: jQuery.Event,\n\tisDefaultPrevented: returnFalse,\n\tisPropagationStopped: returnFalse,\n\tisImmediatePropagationStopped: returnFalse,\n\tisSimulated: false,\n\n\tpreventDefault: function() {\n\t\tvar e = this.originalEvent;\n\n\t\tthis.isDefaultPrevented = returnTrue;\n\n\t\tif ( e && !this.isSimulated ) {\n\t\t\te.preventDefault();\n\t\t}\n\t},\n\tstopPropagation: function() {\n\t\tvar e = this.originalEvent;\n\n\t\tthis.isPropagationStopped = returnTrue;\n\n\t\tif ( e && !this.isSimulated ) {\n\t\t\te.stopPropagation();\n\t\t}\n\t},\n\tstopImmediatePropagation: function() {\n\t\tvar e = this.originalEvent;\n\n\t\tthis.isImmediatePropagationStopped = returnTrue;\n\n\t\tif ( e && !this.isSimulated ) {\n\t\t\te.stopImmediatePropagation();\n\t\t}\n\n\t\tthis.stopPropagation();\n\t}\n};\n\n// Includes all common event props including KeyEvent and MouseEvent specific props\njQuery.each( {\n\taltKey: true,\n\tbubbles: true,\n\tcancelable: true,\n\tchangedTouches: true,\n\tctrlKey: true,\n\tdetail: true,\n\teventPhase: true,\n\tmetaKey: true,\n\tpageX: true,\n\tpageY: true,\n\tshiftKey: true,\n\tview: true,\n\t\"char\": true,\n\tcharCode: true,\n\tkey: true,\n\tkeyCode: true,\n\tbutton: true,\n\tbuttons: true,\n\tclientX: true,\n\tclientY: true,\n\toffsetX: true,\n\toffsetY: true,\n\tpointerId: true,\n\tpointerType: true,\n\tscreenX: true,\n\tscreenY: true,\n\ttargetTouches: true,\n\ttoElement: true,\n\ttouches: true,\n\n\twhich: function( event ) {\n\t\tvar button = event.button;\n\n\t\t// Add which for key events\n\t\tif ( event.which == null && rkeyEvent.test( event.type ) ) {\n\t\t\treturn event.charCode != null ? event.charCode : event.keyCode;\n\t\t}\n\n\t\t// Add which for click: 1 === left; 2 === middle; 3 === right\n\t\tif ( !event.which && button !== undefined && rmouseEvent.test( event.type ) ) {\n\t\t\tif ( button & 1 ) {\n\t\t\t\treturn 1;\n\t\t\t}\n\n\t\t\tif ( button & 2 ) {\n\t\t\t\treturn 3;\n\t\t\t}\n\n\t\t\tif ( button & 4 ) {\n\t\t\t\treturn 2;\n\t\t\t}\n\n\t\t\treturn 0;\n\t\t}\n\n\t\treturn event.which;\n\t}\n}, jQuery.event.addProp );\n\n// Create mouseenter/leave events using mouseover/out and event-time checks\n// so that event delegation works in jQuery.\n// Do the same for pointerenter/pointerleave and pointerover/pointerout\n//\n// Support: Safari 7 only\n// Safari sends mouseenter too often; see:\n// https://bugs.chromium.org/p/chromium/issues/detail?id=470258\n// for the description of the bug (it existed in older Chrome versions as well).\njQuery.each( {\n\tmouseenter: \"mouseover\",\n\tmouseleave: \"mouseout\",\n\tpointerenter: \"pointerover\",\n\tpointerleave: \"pointerout\"\n}, function( orig, fix ) {\n\tjQuery.event.special[ orig ] = {\n\t\tdelegateType: fix,\n\t\tbindType: fix,\n\n\t\thandle: function( event ) {\n\t\t\tvar ret,\n\t\t\t\ttarget = this,\n\t\t\t\trelated = event.relatedTarget,\n\t\t\t\thandleObj = event.handleObj;\n\n\t\t\t// For mouseenter/leave call the handler if related is outside the target.\n\t\t\t// NB: No relatedTarget if the mouse left/entered the browser window\n\t\t\tif ( !related || ( related !== target && !jQuery.contains( target, related ) ) ) {\n\t\t\t\tevent.type = handleObj.origType;\n\t\t\t\tret = handleObj.handler.apply( this, arguments );\n\t\t\t\tevent.type = fix;\n\t\t\t}\n\t\t\treturn ret;\n\t\t}\n\t};\n} );\n\njQuery.fn.extend( {\n\n\ton: function( types, selector, data, fn ) {\n\t\treturn on( this, types, selector, data, fn );\n\t},\n\tone: function( types, selector, data, fn ) {\n\t\treturn on( this, types, selector, data, fn, 1 );\n\t},\n\toff: function( types, selector, fn ) {\n\t\tvar handleObj, type;\n\t\tif ( types && types.preventDefault && types.handleObj ) {\n\n\t\t\t// ( event )  dispatched jQuery.Event\n\t\t\thandleObj = types.handleObj;\n\t\t\tjQuery( types.delegateTarget ).off(\n\t\t\t\thandleObj.namespace ?\n\t\t\t\t\thandleObj.origType + \".\" + handleObj.namespace :\n\t\t\t\t\thandleObj.origType,\n\t\t\t\thandleObj.selector,\n\t\t\t\thandleObj.handler\n\t\t\t);\n\t\t\treturn this;\n\t\t}\n\t\tif ( typeof types === \"object\" ) {\n\n\t\t\t// ( types-object [, selector] )\n\t\t\tfor ( type in types ) {\n\t\t\t\tthis.off( type, selector, types[ type ] );\n\t\t\t}\n\t\t\treturn this;\n\t\t}\n\t\tif ( selector === false || typeof selector === \"function\" ) {\n\n\t\t\t// ( types [, fn] )\n\t\t\tfn = selector;\n\t\t\tselector = undefined;\n\t\t}\n\t\tif ( fn === false ) {\n\t\t\tfn = returnFalse;\n\t\t}\n\t\treturn this.each( function() {\n\t\t\tjQuery.event.remove( this, types, fn, selector );\n\t\t} );\n\t}\n} );\n\n\nvar\n\n\t/* eslint-disable max-len */\n\n\t// See https://github.com/eslint/eslint/issues/3229\n\trxhtmlTag = /<(?!area|br|col|embed|hr|img|input|link|meta|param)(([a-z][^\\/\\0>\\x20\\t\\r\\n\\f]*)[^>]*)\\/>/gi,\n\n\t/* eslint-enable */\n\n\t// Support: IE <=10 - 11, Edge 12 - 13\n\t// In IE/Edge using regex groups here causes severe slowdowns.\n\t// See https://connect.microsoft.com/IE/feedback/details/1736512/\n\trnoInnerhtml = /<script|<style|<link/i,\n\n\t// checked=\"checked\" or checked\n\trchecked = /checked\\s*(?:[^=]|=\\s*.checked.)/i,\n\trscriptTypeMasked = /^true\\/(.*)/,\n\trcleanScript = /^\\s*<!(?:\\[CDATA\\[|--)|(?:\\]\\]|--)>\\s*$/g;\n\n// Prefer a tbody over its parent table for containing new rows\nfunction manipulationTarget( elem, content ) {\n\tif ( nodeName( elem, \"table\" ) &&\n\t\tnodeName( content.nodeType !== 11 ? content : content.firstChild, \"tr\" ) ) {\n\n\t\treturn jQuery( \">tbody\", elem )[ 0 ] || elem;\n\t}\n\n\treturn elem;\n}\n\n// Replace/restore the type attribute of script elements for safe DOM manipulation\nfunction disableScript( elem ) {\n\telem.type = ( elem.getAttribute( \"type\" ) !== null ) + \"/\" + elem.type;\n\treturn elem;\n}\nfunction restoreScript( elem ) {\n\tvar match = rscriptTypeMasked.exec( elem.type );\n\n\tif ( match ) {\n\t\telem.type = match[ 1 ];\n\t} else {\n\t\telem.removeAttribute( \"type\" );\n\t}\n\n\treturn elem;\n}\n\nfunction cloneCopyEvent( src, dest ) {\n\tvar i, l, type, pdataOld, pdataCur, udataOld, udataCur, events;\n\n\tif ( dest.nodeType !== 1 ) {\n\t\treturn;\n\t}\n\n\t// 1. Copy private data: events, handlers, etc.\n\tif ( dataPriv.hasData( src ) ) {\n\t\tpdataOld = dataPriv.access( src );\n\t\tpdataCur = dataPriv.set( dest, pdataOld );\n\t\tevents = pdataOld.events;\n\n\t\tif ( events ) {\n\t\t\tdelete pdataCur.handle;\n\t\t\tpdataCur.events = {};\n\n\t\t\tfor ( type in events ) {\n\t\t\t\tfor ( i = 0, l = events[ type ].length; i < l; i++ ) {\n\t\t\t\t\tjQuery.event.add( dest, type, events[ type ][ i ] );\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\t// 2. Copy user data\n\tif ( dataUser.hasData( src ) ) {\n\t\tudataOld = dataUser.access( src );\n\t\tudataCur = jQuery.extend( {}, udataOld );\n\n\t\tdataUser.set( dest, udataCur );\n\t}\n}\n\n// Fix IE bugs, see support tests\nfunction fixInput( src, dest ) {\n\tvar nodeName = dest.nodeName.toLowerCase();\n\n\t// Fails to persist the checked state of a cloned checkbox or radio button.\n\tif ( nodeName === \"input\" && rcheckableType.test( src.type ) ) {\n\t\tdest.checked = src.checked;\n\n\t// Fails to return the selected option to the default selected state when cloning options\n\t} else if ( nodeName === \"input\" || nodeName === \"textarea\" ) {\n\t\tdest.defaultValue = src.defaultValue;\n\t}\n}\n\nfunction domManip( collection, args, callback, ignored ) {\n\n\t// Flatten any nested arrays\n\targs = concat.apply( [], args );\n\n\tvar fragment, first, scripts, hasScripts, node, doc,\n\t\ti = 0,\n\t\tl = collection.length,\n\t\tiNoClone = l - 1,\n\t\tvalue = args[ 0 ],\n\t\tisFunction = jQuery.isFunction( value );\n\n\t// We can't cloneNode fragments that contain checked, in WebKit\n\tif ( isFunction ||\n\t\t\t( l > 1 && typeof value === \"string\" &&\n\t\t\t\t!support.checkClone && rchecked.test( value ) ) ) {\n\t\treturn collection.each( function( index ) {\n\t\t\tvar self = collection.eq( index );\n\t\t\tif ( isFunction ) {\n\t\t\t\targs[ 0 ] = value.call( this, index, self.html() );\n\t\t\t}\n\t\t\tdomManip( self, args, callback, ignored );\n\t\t} );\n\t}\n\n\tif ( l ) {\n\t\tfragment = buildFragment( args, collection[ 0 ].ownerDocument, false, collection, ignored );\n\t\tfirst = fragment.firstChild;\n\n\t\tif ( fragment.childNodes.length === 1 ) {\n\t\t\tfragment = first;\n\t\t}\n\n\t\t// Require either new content or an interest in ignored elements to invoke the callback\n\t\tif ( first || ignored ) {\n\t\t\tscripts = jQuery.map( getAll( fragment, \"script\" ), disableScript );\n\t\t\thasScripts = scripts.length;\n\n\t\t\t// Use the original fragment for the last item\n\t\t\t// instead of the first because it can end up\n\t\t\t// being emptied incorrectly in certain situations (#8070).\n\t\t\tfor ( ; i < l; i++ ) {\n\t\t\t\tnode = fragment;\n\n\t\t\t\tif ( i !== iNoClone ) {\n\t\t\t\t\tnode = jQuery.clone( node, true, true );\n\n\t\t\t\t\t// Keep references to cloned scripts for later restoration\n\t\t\t\t\tif ( hasScripts ) {\n\n\t\t\t\t\t\t// Support: Android <=4.0 only, PhantomJS 1 only\n\t\t\t\t\t\t// push.apply(_, arraylike) throws on ancient WebKit\n\t\t\t\t\t\tjQuery.merge( scripts, getAll( node, \"script\" ) );\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tcallback.call( collection[ i ], node, i );\n\t\t\t}\n\n\t\t\tif ( hasScripts ) {\n\t\t\t\tdoc = scripts[ scripts.length - 1 ].ownerDocument;\n\n\t\t\t\t// Reenable scripts\n\t\t\t\tjQuery.map( scripts, restoreScript );\n\n\t\t\t\t// Evaluate executable scripts on first document insertion\n\t\t\t\tfor ( i = 0; i < hasScripts; i++ ) {\n\t\t\t\t\tnode = scripts[ i ];\n\t\t\t\t\tif ( rscriptType.test( node.type || \"\" ) &&\n\t\t\t\t\t\t!dataPriv.access( node, \"globalEval\" ) &&\n\t\t\t\t\t\tjQuery.contains( doc, node ) ) {\n\n\t\t\t\t\t\tif ( node.src ) {\n\n\t\t\t\t\t\t\t// Optional AJAX dependency, but won't run scripts if not present\n\t\t\t\t\t\t\tif ( jQuery._evalUrl ) {\n\t\t\t\t\t\t\t\tjQuery._evalUrl( node.src );\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tDOMEval( node.textContent.replace( rcleanScript, \"\" ), doc );\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\treturn collection;\n}\n\nfunction remove( elem, selector, keepData ) {\n\tvar node,\n\t\tnodes = selector ? jQuery.filter( selector, elem ) : elem,\n\t\ti = 0;\n\n\tfor ( ; ( node = nodes[ i ] ) != null; i++ ) {\n\t\tif ( !keepData && node.nodeType === 1 ) {\n\t\t\tjQuery.cleanData( getAll( node ) );\n\t\t}\n\n\t\tif ( node.parentNode ) {\n\t\t\tif ( keepData && jQuery.contains( node.ownerDocument, node ) ) {\n\t\t\t\tsetGlobalEval( getAll( node, \"script\" ) );\n\t\t\t}\n\t\t\tnode.parentNode.removeChild( node );\n\t\t}\n\t}\n\n\treturn elem;\n}\n\njQuery.extend( {\n\thtmlPrefilter: function( html ) {\n\t\treturn html.replace( rxhtmlTag, \"<$1></$2>\" );\n\t},\n\n\tclone: function( elem, dataAndEvents, deepDataAndEvents ) {\n\t\tvar i, l, srcElements, destElements,\n\t\t\tclone = elem.cloneNode( true ),\n\t\t\tinPage = jQuery.contains( elem.ownerDocument, elem );\n\n\t\t// Fix IE cloning issues\n\t\tif ( !support.noCloneChecked && ( elem.nodeType === 1 || elem.nodeType === 11 ) &&\n\t\t\t\t!jQuery.isXMLDoc( elem ) ) {\n\n\t\t\t// We eschew Sizzle here for performance reasons: https://jsperf.com/getall-vs-sizzle/2\n\t\t\tdestElements = getAll( clone );\n\t\t\tsrcElements = getAll( elem );\n\n\t\t\tfor ( i = 0, l = srcElements.length; i < l; i++ ) {\n\t\t\t\tfixInput( srcElements[ i ], destElements[ i ] );\n\t\t\t}\n\t\t}\n\n\t\t// Copy the events from the original to the clone\n\t\tif ( dataAndEvents ) {\n\t\t\tif ( deepDataAndEvents ) {\n\t\t\t\tsrcElements = srcElements || getAll( elem );\n\t\t\t\tdestElements = destElements || getAll( clone );\n\n\t\t\t\tfor ( i = 0, l = srcElements.length; i < l; i++ ) {\n\t\t\t\t\tcloneCopyEvent( srcElements[ i ], destElements[ i ] );\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tcloneCopyEvent( elem, clone );\n\t\t\t}\n\t\t}\n\n\t\t// Preserve script evaluation history\n\t\tdestElements = getAll( clone, \"script\" );\n\t\tif ( destElements.length > 0 ) {\n\t\t\tsetGlobalEval( destElements, !inPage && getAll( elem, \"script\" ) );\n\t\t}\n\n\t\t// Return the cloned set\n\t\treturn clone;\n\t},\n\n\tcleanData: function( elems ) {\n\t\tvar data, elem, type,\n\t\t\tspecial = jQuery.event.special,\n\t\t\ti = 0;\n\n\t\tfor ( ; ( elem = elems[ i ] ) !== undefined; i++ ) {\n\t\t\tif ( acceptData( elem ) ) {\n\t\t\t\tif ( ( data = elem[ dataPriv.expando ] ) ) {\n\t\t\t\t\tif ( data.events ) {\n\t\t\t\t\t\tfor ( type in data.events ) {\n\t\t\t\t\t\t\tif ( special[ type ] ) {\n\t\t\t\t\t\t\t\tjQuery.event.remove( elem, type );\n\n\t\t\t\t\t\t\t// This is a shortcut to avoid jQuery.event.remove's overhead\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\tjQuery.removeEvent( elem, type, data.handle );\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\t// Support: Chrome <=35 - 45+\n\t\t\t\t\t// Assign undefined instead of using delete, see Data#remove\n\t\t\t\t\telem[ dataPriv.expando ] = undefined;\n\t\t\t\t}\n\t\t\t\tif ( elem[ dataUser.expando ] ) {\n\n\t\t\t\t\t// Support: Chrome <=35 - 45+\n\t\t\t\t\t// Assign undefined instead of using delete, see Data#remove\n\t\t\t\t\telem[ dataUser.expando ] = undefined;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n} );\n\njQuery.fn.extend( {\n\tdetach: function( selector ) {\n\t\treturn remove( this, selector, true );\n\t},\n\n\tremove: function( selector ) {\n\t\treturn remove( this, selector );\n\t},\n\n\ttext: function( value ) {\n\t\treturn access( this, function( value ) {\n\t\t\treturn value === undefined ?\n\t\t\t\tjQuery.text( this ) :\n\t\t\t\tthis.empty().each( function() {\n\t\t\t\t\tif ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) {\n\t\t\t\t\t\tthis.textContent = value;\n\t\t\t\t\t}\n\t\t\t\t} );\n\t\t}, null, value, arguments.length );\n\t},\n\n\tappend: function() {\n\t\treturn domManip( this, arguments, function( elem ) {\n\t\t\tif ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) {\n\t\t\t\tvar target = manipulationTarget( this, elem );\n\t\t\t\ttarget.appendChild( elem );\n\t\t\t}\n\t\t} );\n\t},\n\n\tprepend: function() {\n\t\treturn domManip( this, arguments, function( elem ) {\n\t\t\tif ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) {\n\t\t\t\tvar target = manipulationTarget( this, elem );\n\t\t\t\ttarget.insertBefore( elem, target.firstChild );\n\t\t\t}\n\t\t} );\n\t},\n\n\tbefore: function() {\n\t\treturn domManip( this, arguments, function( elem ) {\n\t\t\tif ( this.parentNode ) {\n\t\t\t\tthis.parentNode.insertBefore( elem, this );\n\t\t\t}\n\t\t} );\n\t},\n\n\tafter: function() {\n\t\treturn domManip( this, arguments, function( elem ) {\n\t\t\tif ( this.parentNode ) {\n\t\t\t\tthis.parentNode.insertBefore( elem, this.nextSibling );\n\t\t\t}\n\t\t} );\n\t},\n\n\tempty: function() {\n\t\tvar elem,\n\t\t\ti = 0;\n\n\t\tfor ( ; ( elem = this[ i ] ) != null; i++ ) {\n\t\t\tif ( elem.nodeType === 1 ) {\n\n\t\t\t\t// Prevent memory leaks\n\t\t\t\tjQuery.cleanData( getAll( elem, false ) );\n\n\t\t\t\t// Remove any remaining nodes\n\t\t\t\telem.textContent = \"\";\n\t\t\t}\n\t\t}\n\n\t\treturn this;\n\t},\n\n\tclone: function( dataAndEvents, deepDataAndEvents ) {\n\t\tdataAndEvents = dataAndEvents == null ? false : dataAndEvents;\n\t\tdeepDataAndEvents = deepDataAndEvents == null ? dataAndEvents : deepDataAndEvents;\n\n\t\treturn this.map( function() {\n\t\t\treturn jQuery.clone( this, dataAndEvents, deepDataAndEvents );\n\t\t} );\n\t},\n\n\thtml: function( value ) {\n\t\treturn access( this, function( value ) {\n\t\t\tvar elem = this[ 0 ] || {},\n\t\t\t\ti = 0,\n\t\t\t\tl = this.length;\n\n\t\t\tif ( value === undefined && elem.nodeType === 1 ) {\n\t\t\t\treturn elem.innerHTML;\n\t\t\t}\n\n\t\t\t// See if we can take a shortcut and just use innerHTML\n\t\t\tif ( typeof value === \"string\" && !rnoInnerhtml.test( value ) &&\n\t\t\t\t!wrapMap[ ( rtagName.exec( value ) || [ \"\", \"\" ] )[ 1 ].toLowerCase() ] ) {\n\n\t\t\t\tvalue = jQuery.htmlPrefilter( value );\n\n\t\t\t\ttry {\n\t\t\t\t\tfor ( ; i < l; i++ ) {\n\t\t\t\t\t\telem = this[ i ] || {};\n\n\t\t\t\t\t\t// Remove element nodes and prevent memory leaks\n\t\t\t\t\t\tif ( elem.nodeType === 1 ) {\n\t\t\t\t\t\t\tjQuery.cleanData( getAll( elem, false ) );\n\t\t\t\t\t\t\telem.innerHTML = value;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\telem = 0;\n\n\t\t\t\t// If using innerHTML throws an exception, use the fallback method\n\t\t\t\t} catch ( e ) {}\n\t\t\t}\n\n\t\t\tif ( elem ) {\n\t\t\t\tthis.empty().append( value );\n\t\t\t}\n\t\t}, null, value, arguments.length );\n\t},\n\n\treplaceWith: function() {\n\t\tvar ignored = [];\n\n\t\t// Make the changes, replacing each non-ignored context element with the new content\n\t\treturn domManip( this, arguments, function( elem ) {\n\t\t\tvar parent = this.parentNode;\n\n\t\t\tif ( jQuery.inArray( this, ignored ) < 0 ) {\n\t\t\t\tjQuery.cleanData( getAll( this ) );\n\t\t\t\tif ( parent ) {\n\t\t\t\t\tparent.replaceChild( elem, this );\n\t\t\t\t}\n\t\t\t}\n\n\t\t// Force callback invocation\n\t\t}, ignored );\n\t}\n} );\n\njQuery.each( {\n\tappendTo: \"append\",\n\tprependTo: \"prepend\",\n\tinsertBefore: \"before\",\n\tinsertAfter: \"after\",\n\treplaceAll: \"replaceWith\"\n}, function( name, original ) {\n\tjQuery.fn[ name ] = function( selector ) {\n\t\tvar elems,\n\t\t\tret = [],\n\t\t\tinsert = jQuery( selector ),\n\t\t\tlast = insert.length - 1,\n\t\t\ti = 0;\n\n\t\tfor ( ; i <= last; i++ ) {\n\t\t\telems = i === last ? this : this.clone( true );\n\t\t\tjQuery( insert[ i ] )[ original ]( elems );\n\n\t\t\t// Support: Android <=4.0 only, PhantomJS 1 only\n\t\t\t// .get() because push.apply(_, arraylike) throws on ancient WebKit\n\t\t\tpush.apply( ret, elems.get() );\n\t\t}\n\n\t\treturn this.pushStack( ret );\n\t};\n} );\nvar rmargin = ( /^margin/ );\n\nvar rnumnonpx = new RegExp( \"^(\" + pnum + \")(?!px)[a-z%]+$\", \"i\" );\n\nvar getStyles = function( elem ) {\n\n\t\t// Support: IE <=11 only, Firefox <=30 (#15098, #14150)\n\t\t// IE throws on elements created in popups\n\t\t// FF meanwhile throws on frame elements through \"defaultView.getComputedStyle\"\n\t\tvar view = elem.ownerDocument.defaultView;\n\n\t\tif ( !view || !view.opener ) {\n\t\t\tview = window;\n\t\t}\n\n\t\treturn view.getComputedStyle( elem );\n\t};\n\n\n\n( function() {\n\n\t// Executing both pixelPosition & boxSizingReliable tests require only one layout\n\t// so they're executed at the same time to save the second computation.\n\tfunction computeStyleTests() {\n\n\t\t// This is a singleton, we need to execute it only once\n\t\tif ( !div ) {\n\t\t\treturn;\n\t\t}\n\n\t\tdiv.style.cssText =\n\t\t\t\"box-sizing:border-box;\" +\n\t\t\t\"position:relative;display:block;\" +\n\t\t\t\"margin:auto;border:1px;padding:1px;\" +\n\t\t\t\"top:1%;width:50%\";\n\t\tdiv.innerHTML = \"\";\n\t\tdocumentElement.appendChild( container );\n\n\t\tvar divStyle = window.getComputedStyle( div );\n\t\tpixelPositionVal = divStyle.top !== \"1%\";\n\n\t\t// Support: Android 4.0 - 4.3 only, Firefox <=3 - 44\n\t\treliableMarginLeftVal = divStyle.marginLeft === \"2px\";\n\t\tboxSizingReliableVal = divStyle.width === \"4px\";\n\n\t\t// Support: Android 4.0 - 4.3 only\n\t\t// Some styles come back with percentage values, even though they shouldn't\n\t\tdiv.style.marginRight = \"50%\";\n\t\tpixelMarginRightVal = divStyle.marginRight === \"4px\";\n\n\t\tdocumentElement.removeChild( container );\n\n\t\t// Nullify the div so it wouldn't be stored in the memory and\n\t\t// it will also be a sign that checks already performed\n\t\tdiv = null;\n\t}\n\n\tvar pixelPositionVal, boxSizingReliableVal, pixelMarginRightVal, reliableMarginLeftVal,\n\t\tcontainer = document.createElement( \"div\" ),\n\t\tdiv = document.createElement( \"div\" );\n\n\t// Finish early in limited (non-browser) environments\n\tif ( !div.style ) {\n\t\treturn;\n\t}\n\n\t// Support: IE <=9 - 11 only\n\t// Style of cloned element affects source element cloned (#8908)\n\tdiv.style.backgroundClip = \"content-box\";\n\tdiv.cloneNode( true ).style.backgroundClip = \"\";\n\tsupport.clearCloneStyle = div.style.backgroundClip === \"content-box\";\n\n\tcontainer.style.cssText = \"border:0;width:8px;height:0;top:0;left:-9999px;\" +\n\t\t\"padding:0;margin-top:1px;position:absolute\";\n\tcontainer.appendChild( div );\n\n\tjQuery.extend( support, {\n\t\tpixelPosition: function() {\n\t\t\tcomputeStyleTests();\n\t\t\treturn pixelPositionVal;\n\t\t},\n\t\tboxSizingReliable: function() {\n\t\t\tcomputeStyleTests();\n\t\t\treturn boxSizingReliableVal;\n\t\t},\n\t\tpixelMarginRight: function() {\n\t\t\tcomputeStyleTests();\n\t\t\treturn pixelMarginRightVal;\n\t\t},\n\t\treliableMarginLeft: function() {\n\t\t\tcomputeStyleTests();\n\t\t\treturn reliableMarginLeftVal;\n\t\t}\n\t} );\n} )();\n\n\nfunction curCSS( elem, name, computed ) {\n\tvar width, minWidth, maxWidth, ret,\n\n\t\t// Support: Firefox 51+\n\t\t// Retrieving style before computed somehow\n\t\t// fixes an issue with getting wrong values\n\t\t// on detached elements\n\t\tstyle = elem.style;\n\n\tcomputed = computed || getStyles( elem );\n\n\t// getPropertyValue is needed for:\n\t//   .css('filter') (IE 9 only, #12537)\n\t//   .css('--customProperty) (#3144)\n\tif ( computed ) {\n\t\tret = computed.getPropertyValue( name ) || computed[ name ];\n\n\t\tif ( ret === \"\" && !jQuery.contains( elem.ownerDocument, elem ) ) {\n\t\t\tret = jQuery.style( elem, name );\n\t\t}\n\n\t\t// A tribute to the \"awesome hack by Dean Edwards\"\n\t\t// Android Browser returns percentage for some values,\n\t\t// but width seems to be reliably pixels.\n\t\t// This is against the CSSOM draft spec:\n\t\t// https://drafts.csswg.org/cssom/#resolved-values\n\t\tif ( !support.pixelMarginRight() && rnumnonpx.test( ret ) && rmargin.test( name ) ) {\n\n\t\t\t// Remember the original values\n\t\t\twidth = style.width;\n\t\t\tminWidth = style.minWidth;\n\t\t\tmaxWidth = style.maxWidth;\n\n\t\t\t// Put in the new values to get a computed value out\n\t\t\tstyle.minWidth = style.maxWidth = style.width = ret;\n\t\t\tret = computed.width;\n\n\t\t\t// Revert the changed values\n\t\t\tstyle.width = width;\n\t\t\tstyle.minWidth = minWidth;\n\t\t\tstyle.maxWidth = maxWidth;\n\t\t}\n\t}\n\n\treturn ret !== undefined ?\n\n\t\t// Support: IE <=9 - 11 only\n\t\t// IE returns zIndex value as an integer.\n\t\tret + \"\" :\n\t\tret;\n}\n\n\nfunction addGetHookIf( conditionFn, hookFn ) {\n\n\t// Define the hook, we'll check on the first run if it's really needed.\n\treturn {\n\t\tget: function() {\n\t\t\tif ( conditionFn() ) {\n\n\t\t\t\t// Hook not needed (or it's not possible to use it due\n\t\t\t\t// to missing dependency), remove it.\n\t\t\t\tdelete this.get;\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// Hook needed; redefine it so that the support test is not executed again.\n\t\t\treturn ( this.get = hookFn ).apply( this, arguments );\n\t\t}\n\t};\n}\n\n\nvar\n\n\t// Swappable if display is none or starts with table\n\t// except \"table\", \"table-cell\", or \"table-caption\"\n\t// See here for display values: https://developer.mozilla.org/en-US/docs/CSS/display\n\trdisplayswap = /^(none|table(?!-c[ea]).+)/,\n\trcustomProp = /^--/,\n\tcssShow = { position: \"absolute\", visibility: \"hidden\", display: \"block\" },\n\tcssNormalTransform = {\n\t\tletterSpacing: \"0\",\n\t\tfontWeight: \"400\"\n\t},\n\n\tcssPrefixes = [ \"Webkit\", \"Moz\", \"ms\" ],\n\temptyStyle = document.createElement( \"div\" ).style;\n\n// Return a css property mapped to a potentially vendor prefixed property\nfunction vendorPropName( name ) {\n\n\t// Shortcut for names that are not vendor prefixed\n\tif ( name in emptyStyle ) {\n\t\treturn name;\n\t}\n\n\t// Check for vendor prefixed names\n\tvar capName = name[ 0 ].toUpperCase() + name.slice( 1 ),\n\t\ti = cssPrefixes.length;\n\n\twhile ( i-- ) {\n\t\tname = cssPrefixes[ i ] + capName;\n\t\tif ( name in emptyStyle ) {\n\t\t\treturn name;\n\t\t}\n\t}\n}\n\n// Return a property mapped along what jQuery.cssProps suggests or to\n// a vendor prefixed property.\nfunction finalPropName( name ) {\n\tvar ret = jQuery.cssProps[ name ];\n\tif ( !ret ) {\n\t\tret = jQuery.cssProps[ name ] = vendorPropName( name ) || name;\n\t}\n\treturn ret;\n}\n\nfunction setPositiveNumber( elem, value, subtract ) {\n\n\t// Any relative (+/-) values have already been\n\t// normalized at this point\n\tvar matches = rcssNum.exec( value );\n\treturn matches ?\n\n\t\t// Guard against undefined \"subtract\", e.g., when used as in cssHooks\n\t\tMath.max( 0, matches[ 2 ] - ( subtract || 0 ) ) + ( matches[ 3 ] || \"px\" ) :\n\t\tvalue;\n}\n\nfunction augmentWidthOrHeight( elem, name, extra, isBorderBox, styles ) {\n\tvar i,\n\t\tval = 0;\n\n\t// If we already have the right measurement, avoid augmentation\n\tif ( extra === ( isBorderBox ? \"border\" : \"content\" ) ) {\n\t\ti = 4;\n\n\t// Otherwise initialize for horizontal or vertical properties\n\t} else {\n\t\ti = name === \"width\" ? 1 : 0;\n\t}\n\n\tfor ( ; i < 4; i += 2 ) {\n\n\t\t// Both box models exclude margin, so add it if we want it\n\t\tif ( extra === \"margin\" ) {\n\t\t\tval += jQuery.css( elem, extra + cssExpand[ i ], true, styles );\n\t\t}\n\n\t\tif ( isBorderBox ) {\n\n\t\t\t// border-box includes padding, so remove it if we want content\n\t\t\tif ( extra === \"content\" ) {\n\t\t\t\tval -= jQuery.css( elem, \"padding\" + cssExpand[ i ], true, styles );\n\t\t\t}\n\n\t\t\t// At this point, extra isn't border nor margin, so remove border\n\t\t\tif ( extra !== \"margin\" ) {\n\t\t\t\tval -= jQuery.css( elem, \"border\" + cssExpand[ i ] + \"Width\", true, styles );\n\t\t\t}\n\t\t} else {\n\n\t\t\t// At this point, extra isn't content, so add padding\n\t\t\tval += jQuery.css( elem, \"padding\" + cssExpand[ i ], true, styles );\n\n\t\t\t// At this point, extra isn't content nor padding, so add border\n\t\t\tif ( extra !== \"padding\" ) {\n\t\t\t\tval += jQuery.css( elem, \"border\" + cssExpand[ i ] + \"Width\", true, styles );\n\t\t\t}\n\t\t}\n\t}\n\n\treturn val;\n}\n\nfunction getWidthOrHeight( elem, name, extra ) {\n\n\t// Start with computed style\n\tvar valueIsBorderBox,\n\t\tstyles = getStyles( elem ),\n\t\tval = curCSS( elem, name, styles ),\n\t\tisBorderBox = jQuery.css( elem, \"boxSizing\", false, styles ) === \"border-box\";\n\n\t// Computed unit is not pixels. Stop here and return.\n\tif ( rnumnonpx.test( val ) ) {\n\t\treturn val;\n\t}\n\n\t// Check for style in case a browser which returns unreliable values\n\t// for getComputedStyle silently falls back to the reliable elem.style\n\tvalueIsBorderBox = isBorderBox &&\n\t\t( support.boxSizingReliable() || val === elem.style[ name ] );\n\n\t// Fall back to offsetWidth/Height when value is \"auto\"\n\t// This happens for inline elements with no explicit setting (gh-3571)\n\tif ( val === \"auto\" ) {\n\t\tval = elem[ \"offset\" + name[ 0 ].toUpperCase() + name.slice( 1 ) ];\n\t}\n\n\t// Normalize \"\", auto, and prepare for extra\n\tval = parseFloat( val ) || 0;\n\n\t// Use the active box-sizing model to add/subtract irrelevant styles\n\treturn ( val +\n\t\taugmentWidthOrHeight(\n\t\t\telem,\n\t\t\tname,\n\t\t\textra || ( isBorderBox ? \"border\" : \"content\" ),\n\t\t\tvalueIsBorderBox,\n\t\t\tstyles\n\t\t)\n\t) + \"px\";\n}\n\njQuery.extend( {\n\n\t// Add in style property hooks for overriding the default\n\t// behavior of getting and setting a style property\n\tcssHooks: {\n\t\topacity: {\n\t\t\tget: function( elem, computed ) {\n\t\t\t\tif ( computed ) {\n\n\t\t\t\t\t// We should always get a number back from opacity\n\t\t\t\t\tvar ret = curCSS( elem, \"opacity\" );\n\t\t\t\t\treturn ret === \"\" ? \"1\" : ret;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t},\n\n\t// Don't automatically add \"px\" to these possibly-unitless properties\n\tcssNumber: {\n\t\t\"animationIterationCount\": true,\n\t\t\"columnCount\": true,\n\t\t\"fillOpacity\": true,\n\t\t\"flexGrow\": true,\n\t\t\"flexShrink\": true,\n\t\t\"fontWeight\": true,\n\t\t\"lineHeight\": true,\n\t\t\"opacity\": true,\n\t\t\"order\": true,\n\t\t\"orphans\": true,\n\t\t\"widows\": true,\n\t\t\"zIndex\": true,\n\t\t\"zoom\": true\n\t},\n\n\t// Add in properties whose names you wish to fix before\n\t// setting or getting the value\n\tcssProps: {\n\t\t\"float\": \"cssFloat\"\n\t},\n\n\t// Get and set the style property on a DOM Node\n\tstyle: function( elem, name, value, extra ) {\n\n\t\t// Don't set styles on text and comment nodes\n\t\tif ( !elem || elem.nodeType === 3 || elem.nodeType === 8 || !elem.style ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Make sure that we're working with the right name\n\t\tvar ret, type, hooks,\n\t\t\torigName = jQuery.camelCase( name ),\n\t\t\tisCustomProp = rcustomProp.test( name ),\n\t\t\tstyle = elem.style;\n\n\t\t// Make sure that we're working with the right name. We don't\n\t\t// want to query the value if it is a CSS custom property\n\t\t// since they are user-defined.\n\t\tif ( !isCustomProp ) {\n\t\t\tname = finalPropName( origName );\n\t\t}\n\n\t\t// Gets hook for the prefixed version, then unprefixed version\n\t\thooks = jQuery.cssHooks[ name ] || jQuery.cssHooks[ origName ];\n\n\t\t// Check if we're setting a value\n\t\tif ( value !== undefined ) {\n\t\t\ttype = typeof value;\n\n\t\t\t// Convert \"+=\" or \"-=\" to relative numbers (#7345)\n\t\t\tif ( type === \"string\" && ( ret = rcssNum.exec( value ) ) && ret[ 1 ] ) {\n\t\t\t\tvalue = adjustCSS( elem, name, ret );\n\n\t\t\t\t// Fixes bug #9237\n\t\t\t\ttype = \"number\";\n\t\t\t}\n\n\t\t\t// Make sure that null and NaN values aren't set (#7116)\n\t\t\tif ( value == null || value !== value ) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// If a number was passed in, add the unit (except for certain CSS properties)\n\t\t\tif ( type === \"number\" ) {\n\t\t\t\tvalue += ret && ret[ 3 ] || ( jQuery.cssNumber[ origName ] ? \"\" : \"px\" );\n\t\t\t}\n\n\t\t\t// background-* props affect original clone's values\n\t\t\tif ( !support.clearCloneStyle && value === \"\" && name.indexOf( \"background\" ) === 0 ) {\n\t\t\t\tstyle[ name ] = \"inherit\";\n\t\t\t}\n\n\t\t\t// If a hook was provided, use that value, otherwise just set the specified value\n\t\t\tif ( !hooks || !( \"set\" in hooks ) ||\n\t\t\t\t( value = hooks.set( elem, value, extra ) ) !== undefined ) {\n\n\t\t\t\tif ( isCustomProp ) {\n\t\t\t\t\tstyle.setProperty( name, value );\n\t\t\t\t} else {\n\t\t\t\t\tstyle[ name ] = value;\n\t\t\t\t}\n\t\t\t}\n\n\t\t} else {\n\n\t\t\t// If a hook was provided get the non-computed value from there\n\t\t\tif ( hooks && \"get\" in hooks &&\n\t\t\t\t( ret = hooks.get( elem, false, extra ) ) !== undefined ) {\n\n\t\t\t\treturn ret;\n\t\t\t}\n\n\t\t\t// Otherwise just get the value from the style object\n\t\t\treturn style[ name ];\n\t\t}\n\t},\n\n\tcss: function( elem, name, extra, styles ) {\n\t\tvar val, num, hooks,\n\t\t\torigName = jQuery.camelCase( name ),\n\t\t\tisCustomProp = rcustomProp.test( name );\n\n\t\t// Make sure that we're working with the right name. We don't\n\t\t// want to modify the value if it is a CSS custom property\n\t\t// since they are user-defined.\n\t\tif ( !isCustomProp ) {\n\t\t\tname = finalPropName( origName );\n\t\t}\n\n\t\t// Try prefixed name followed by the unprefixed name\n\t\thooks = jQuery.cssHooks[ name ] || jQuery.cssHooks[ origName ];\n\n\t\t// If a hook was provided get the computed value from there\n\t\tif ( hooks && \"get\" in hooks ) {\n\t\t\tval = hooks.get( elem, true, extra );\n\t\t}\n\n\t\t// Otherwise, if a way to get the computed value exists, use that\n\t\tif ( val === undefined ) {\n\t\t\tval = curCSS( elem, name, styles );\n\t\t}\n\n\t\t// Convert \"normal\" to computed value\n\t\tif ( val === \"normal\" && name in cssNormalTransform ) {\n\t\t\tval = cssNormalTransform[ name ];\n\t\t}\n\n\t\t// Make numeric if forced or a qualifier was provided and val looks numeric\n\t\tif ( extra === \"\" || extra ) {\n\t\t\tnum = parseFloat( val );\n\t\t\treturn extra === true || isFinite( num ) ? num || 0 : val;\n\t\t}\n\n\t\treturn val;\n\t}\n} );\n\njQuery.each( [ \"height\", \"width\" ], function( i, name ) {\n\tjQuery.cssHooks[ name ] = {\n\t\tget: function( elem, computed, extra ) {\n\t\t\tif ( computed ) {\n\n\t\t\t\t// Certain elements can have dimension info if we invisibly show them\n\t\t\t\t// but it must have a current display style that would benefit\n\t\t\t\treturn rdisplayswap.test( jQuery.css( elem, \"display\" ) ) &&\n\n\t\t\t\t\t// Support: Safari 8+\n\t\t\t\t\t// Table columns in Safari have non-zero offsetWidth & zero\n\t\t\t\t\t// getBoundingClientRect().width unless display is changed.\n\t\t\t\t\t// Support: IE <=11 only\n\t\t\t\t\t// Running getBoundingClientRect on a disconnected node\n\t\t\t\t\t// in IE throws an error.\n\t\t\t\t\t( !elem.getClientRects().length || !elem.getBoundingClientRect().width ) ?\n\t\t\t\t\t\tswap( elem, cssShow, function() {\n\t\t\t\t\t\t\treturn getWidthOrHeight( elem, name, extra );\n\t\t\t\t\t\t} ) :\n\t\t\t\t\t\tgetWidthOrHeight( elem, name, extra );\n\t\t\t}\n\t\t},\n\n\t\tset: function( elem, value, extra ) {\n\t\t\tvar matches,\n\t\t\t\tstyles = extra && getStyles( elem ),\n\t\t\t\tsubtract = extra && augmentWidthOrHeight(\n\t\t\t\t\telem,\n\t\t\t\t\tname,\n\t\t\t\t\textra,\n\t\t\t\t\tjQuery.css( elem, \"boxSizing\", false, styles ) === \"border-box\",\n\t\t\t\t\tstyles\n\t\t\t\t);\n\n\t\t\t// Convert to pixels if value adjustment is needed\n\t\t\tif ( subtract && ( matches = rcssNum.exec( value ) ) &&\n\t\t\t\t( matches[ 3 ] || \"px\" ) !== \"px\" ) {\n\n\t\t\t\telem.style[ name ] = value;\n\t\t\t\tvalue = jQuery.css( elem, name );\n\t\t\t}\n\n\t\t\treturn setPositiveNumber( elem, value, subtract );\n\t\t}\n\t};\n} );\n\njQuery.cssHooks.marginLeft = addGetHookIf( support.reliableMarginLeft,\n\tfunction( elem, computed ) {\n\t\tif ( computed ) {\n\t\t\treturn ( parseFloat( curCSS( elem, \"marginLeft\" ) ) ||\n\t\t\t\telem.getBoundingClientRect().left -\n\t\t\t\t\tswap( elem, { marginLeft: 0 }, function() {\n\t\t\t\t\t\treturn elem.getBoundingClientRect().left;\n\t\t\t\t\t} )\n\t\t\t\t) + \"px\";\n\t\t}\n\t}\n);\n\n// These hooks are used by animate to expand properties\njQuery.each( {\n\tmargin: \"\",\n\tpadding: \"\",\n\tborder: \"Width\"\n}, function( prefix, suffix ) {\n\tjQuery.cssHooks[ prefix + suffix ] = {\n\t\texpand: function( value ) {\n\t\t\tvar i = 0,\n\t\t\t\texpanded = {},\n\n\t\t\t\t// Assumes a single number if not a string\n\t\t\t\tparts = typeof value === \"string\" ? value.split( \" \" ) : [ value ];\n\n\t\t\tfor ( ; i < 4; i++ ) {\n\t\t\t\texpanded[ prefix + cssExpand[ i ] + suffix ] =\n\t\t\t\t\tparts[ i ] || parts[ i - 2 ] || parts[ 0 ];\n\t\t\t}\n\n\t\t\treturn expanded;\n\t\t}\n\t};\n\n\tif ( !rmargin.test( prefix ) ) {\n\t\tjQuery.cssHooks[ prefix + suffix ].set = setPositiveNumber;\n\t}\n} );\n\njQuery.fn.extend( {\n\tcss: function( name, value ) {\n\t\treturn access( this, function( elem, name, value ) {\n\t\t\tvar styles, len,\n\t\t\t\tmap = {},\n\t\t\t\ti = 0;\n\n\t\t\tif ( Array.isArray( name ) ) {\n\t\t\t\tstyles = getStyles( elem );\n\t\t\t\tlen = name.length;\n\n\t\t\t\tfor ( ; i < len; i++ ) {\n\t\t\t\t\tmap[ name[ i ] ] = jQuery.css( elem, name[ i ], false, styles );\n\t\t\t\t}\n\n\t\t\t\treturn map;\n\t\t\t}\n\n\t\t\treturn value !== undefined ?\n\t\t\t\tjQuery.style( elem, name, value ) :\n\t\t\t\tjQuery.css( elem, name );\n\t\t}, name, value, arguments.length > 1 );\n\t}\n} );\n\n\nfunction Tween( elem, options, prop, end, easing ) {\n\treturn new Tween.prototype.init( elem, options, prop, end, easing );\n}\njQuery.Tween = Tween;\n\nTween.prototype = {\n\tconstructor: Tween,\n\tinit: function( elem, options, prop, end, easing, unit ) {\n\t\tthis.elem = elem;\n\t\tthis.prop = prop;\n\t\tthis.easing = easing || jQuery.easing._default;\n\t\tthis.options = options;\n\t\tthis.start = this.now = this.cur();\n\t\tthis.end = end;\n\t\tthis.unit = unit || ( jQuery.cssNumber[ prop ] ? \"\" : \"px\" );\n\t},\n\tcur: function() {\n\t\tvar hooks = Tween.propHooks[ this.prop ];\n\n\t\treturn hooks && hooks.get ?\n\t\t\thooks.get( this ) :\n\t\t\tTween.propHooks._default.get( this );\n\t},\n\trun: function( percent ) {\n\t\tvar eased,\n\t\t\thooks = Tween.propHooks[ this.prop ];\n\n\t\tif ( this.options.duration ) {\n\t\t\tthis.pos = eased = jQuery.easing[ this.easing ](\n\t\t\t\tpercent, this.options.duration * percent, 0, 1, this.options.duration\n\t\t\t);\n\t\t} else {\n\t\t\tthis.pos = eased = percent;\n\t\t}\n\t\tthis.now = ( this.end - this.start ) * eased + this.start;\n\n\t\tif ( this.options.step ) {\n\t\t\tthis.options.step.call( this.elem, this.now, this );\n\t\t}\n\n\t\tif ( hooks && hooks.set ) {\n\t\t\thooks.set( this );\n\t\t} else {\n\t\t\tTween.propHooks._default.set( this );\n\t\t}\n\t\treturn this;\n\t}\n};\n\nTween.prototype.init.prototype = Tween.prototype;\n\nTween.propHooks = {\n\t_default: {\n\t\tget: function( tween ) {\n\t\t\tvar result;\n\n\t\t\t// Use a property on the element directly when it is not a DOM element,\n\t\t\t// or when there is no matching style property that exists.\n\t\t\tif ( tween.elem.nodeType !== 1 ||\n\t\t\t\ttween.elem[ tween.prop ] != null && tween.elem.style[ tween.prop ] == null ) {\n\t\t\t\treturn tween.elem[ tween.prop ];\n\t\t\t}\n\n\t\t\t// Passing an empty string as a 3rd parameter to .css will automatically\n\t\t\t// attempt a parseFloat and fallback to a string if the parse fails.\n\t\t\t// Simple values such as \"10px\" are parsed to Float;\n\t\t\t// complex values such as \"rotate(1rad)\" are returned as-is.\n\t\t\tresult = jQuery.css( tween.elem, tween.prop, \"\" );\n\n\t\t\t// Empty strings, null, undefined and \"auto\" are converted to 0.\n\t\t\treturn !result || result === \"auto\" ? 0 : result;\n\t\t},\n\t\tset: function( tween ) {\n\n\t\t\t// Use step hook for back compat.\n\t\t\t// Use cssHook if its there.\n\t\t\t// Use .style if available and use plain properties where available.\n\t\t\tif ( jQuery.fx.step[ tween.prop ] ) {\n\t\t\t\tjQuery.fx.step[ tween.prop ]( tween );\n\t\t\t} else if ( tween.elem.nodeType === 1 &&\n\t\t\t\t( tween.elem.style[ jQuery.cssProps[ tween.prop ] ] != null ||\n\t\t\t\t\tjQuery.cssHooks[ tween.prop ] ) ) {\n\t\t\t\tjQuery.style( tween.elem, tween.prop, tween.now + tween.unit );\n\t\t\t} else {\n\t\t\t\ttween.elem[ tween.prop ] = tween.now;\n\t\t\t}\n\t\t}\n\t}\n};\n\n// Support: IE <=9 only\n// Panic based approach to setting things on disconnected nodes\nTween.propHooks.scrollTop = Tween.propHooks.scrollLeft = {\n\tset: function( tween ) {\n\t\tif ( tween.elem.nodeType && tween.elem.parentNode ) {\n\t\t\ttween.elem[ tween.prop ] = tween.now;\n\t\t}\n\t}\n};\n\njQuery.easing = {\n\tlinear: function( p ) {\n\t\treturn p;\n\t},\n\tswing: function( p ) {\n\t\treturn 0.5 - Math.cos( p * Math.PI ) / 2;\n\t},\n\t_default: \"swing\"\n};\n\njQuery.fx = Tween.prototype.init;\n\n// Back compat <1.8 extension point\njQuery.fx.step = {};\n\n\n\n\nvar\n\tfxNow, inProgress,\n\trfxtypes = /^(?:toggle|show|hide)$/,\n\trrun = /queueHooks$/;\n\nfunction schedule() {\n\tif ( inProgress ) {\n\t\tif ( document.hidden === false && window.requestAnimationFrame ) {\n\t\t\twindow.requestAnimationFrame( schedule );\n\t\t} else {\n\t\t\twindow.setTimeout( schedule, jQuery.fx.interval );\n\t\t}\n\n\t\tjQuery.fx.tick();\n\t}\n}\n\n// Animations created synchronously will run synchronously\nfunction createFxNow() {\n\twindow.setTimeout( function() {\n\t\tfxNow = undefined;\n\t} );\n\treturn ( fxNow = jQuery.now() );\n}\n\n// Generate parameters to create a standard animation\nfunction genFx( type, includeWidth ) {\n\tvar which,\n\t\ti = 0,\n\t\tattrs = { height: type };\n\n\t// If we include width, step value is 1 to do all cssExpand values,\n\t// otherwise step value is 2 to skip over Left and Right\n\tincludeWidth = includeWidth ? 1 : 0;\n\tfor ( ; i < 4; i += 2 - includeWidth ) {\n\t\twhich = cssExpand[ i ];\n\t\tattrs[ \"margin\" + which ] = attrs[ \"padding\" + which ] = type;\n\t}\n\n\tif ( includeWidth ) {\n\t\tattrs.opacity = attrs.width = type;\n\t}\n\n\treturn attrs;\n}\n\nfunction createTween( value, prop, animation ) {\n\tvar tween,\n\t\tcollection = ( Animation.tweeners[ prop ] || [] ).concat( Animation.tweeners[ \"*\" ] ),\n\t\tindex = 0,\n\t\tlength = collection.length;\n\tfor ( ; index < length; index++ ) {\n\t\tif ( ( tween = collection[ index ].call( animation, prop, value ) ) ) {\n\n\t\t\t// We're done with this property\n\t\t\treturn tween;\n\t\t}\n\t}\n}\n\nfunction defaultPrefilter( elem, props, opts ) {\n\tvar prop, value, toggle, hooks, oldfire, propTween, restoreDisplay, display,\n\t\tisBox = \"width\" in props || \"height\" in props,\n\t\tanim = this,\n\t\torig = {},\n\t\tstyle = elem.style,\n\t\thidden = elem.nodeType && isHiddenWithinTree( elem ),\n\t\tdataShow = dataPriv.get( elem, \"fxshow\" );\n\n\t// Queue-skipping animations hijack the fx hooks\n\tif ( !opts.queue ) {\n\t\thooks = jQuery._queueHooks( elem, \"fx\" );\n\t\tif ( hooks.unqueued == null ) {\n\t\t\thooks.unqueued = 0;\n\t\t\toldfire = hooks.empty.fire;\n\t\t\thooks.empty.fire = function() {\n\t\t\t\tif ( !hooks.unqueued ) {\n\t\t\t\t\toldfire();\n\t\t\t\t}\n\t\t\t};\n\t\t}\n\t\thooks.unqueued++;\n\n\t\tanim.always( function() {\n\n\t\t\t// Ensure the complete handler is called before this completes\n\t\t\tanim.always( function() {\n\t\t\t\thooks.unqueued--;\n\t\t\t\tif ( !jQuery.queue( elem, \"fx\" ).length ) {\n\t\t\t\t\thooks.empty.fire();\n\t\t\t\t}\n\t\t\t} );\n\t\t} );\n\t}\n\n\t// Detect show/hide animations\n\tfor ( prop in props ) {\n\t\tvalue = props[ prop ];\n\t\tif ( rfxtypes.test( value ) ) {\n\t\t\tdelete props[ prop ];\n\t\t\ttoggle = toggle || value === \"toggle\";\n\t\t\tif ( value === ( hidden ? \"hide\" : \"show\" ) ) {\n\n\t\t\t\t// Pretend to be hidden if this is a \"show\" and\n\t\t\t\t// there is still data from a stopped show/hide\n\t\t\t\tif ( value === \"show\" && dataShow && dataShow[ prop ] !== undefined ) {\n\t\t\t\t\thidden = true;\n\n\t\t\t\t// Ignore all other no-op show/hide data\n\t\t\t\t} else {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t}\n\t\t\torig[ prop ] = dataShow && dataShow[ prop ] || jQuery.style( elem, prop );\n\t\t}\n\t}\n\n\t// Bail out if this is a no-op like .hide().hide()\n\tpropTween = !jQuery.isEmptyObject( props );\n\tif ( !propTween && jQuery.isEmptyObject( orig ) ) {\n\t\treturn;\n\t}\n\n\t// Restrict \"overflow\" and \"display\" styles during box animations\n\tif ( isBox && elem.nodeType === 1 ) {\n\n\t\t// Support: IE <=9 - 11, Edge 12 - 13\n\t\t// Record all 3 overflow attributes because IE does not infer the shorthand\n\t\t// from identically-valued overflowX and overflowY\n\t\topts.overflow = [ style.overflow, style.overflowX, style.overflowY ];\n\n\t\t// Identify a display type, preferring old show/hide data over the CSS cascade\n\t\trestoreDisplay = dataShow && dataShow.display;\n\t\tif ( restoreDisplay == null ) {\n\t\t\trestoreDisplay = dataPriv.get( elem, \"display\" );\n\t\t}\n\t\tdisplay = jQuery.css( elem, \"display\" );\n\t\tif ( display === \"none\" ) {\n\t\t\tif ( restoreDisplay ) {\n\t\t\t\tdisplay = restoreDisplay;\n\t\t\t} else {\n\n\t\t\t\t// Get nonempty value(s) by temporarily forcing visibility\n\t\t\t\tshowHide( [ elem ], true );\n\t\t\t\trestoreDisplay = elem.style.display || restoreDisplay;\n\t\t\t\tdisplay = jQuery.css( elem, \"display\" );\n\t\t\t\tshowHide( [ elem ] );\n\t\t\t}\n\t\t}\n\n\t\t// Animate inline elements as inline-block\n\t\tif ( display === \"inline\" || display === \"inline-block\" && restoreDisplay != null ) {\n\t\t\tif ( jQuery.css( elem, \"float\" ) === \"none\" ) {\n\n\t\t\t\t// Restore the original display value at the end of pure show/hide animations\n\t\t\t\tif ( !propTween ) {\n\t\t\t\t\tanim.done( function() {\n\t\t\t\t\t\tstyle.display = restoreDisplay;\n\t\t\t\t\t} );\n\t\t\t\t\tif ( restoreDisplay == null ) {\n\t\t\t\t\t\tdisplay = style.display;\n\t\t\t\t\t\trestoreDisplay = display === \"none\" ? \"\" : display;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tstyle.display = \"inline-block\";\n\t\t\t}\n\t\t}\n\t}\n\n\tif ( opts.overflow ) {\n\t\tstyle.overflow = \"hidden\";\n\t\tanim.always( function() {\n\t\t\tstyle.overflow = opts.overflow[ 0 ];\n\t\t\tstyle.overflowX = opts.overflow[ 1 ];\n\t\t\tstyle.overflowY = opts.overflow[ 2 ];\n\t\t} );\n\t}\n\n\t// Implement show/hide animations\n\tpropTween = false;\n\tfor ( prop in orig ) {\n\n\t\t// General show/hide setup for this element animation\n\t\tif ( !propTween ) {\n\t\t\tif ( dataShow ) {\n\t\t\t\tif ( \"hidden\" in dataShow ) {\n\t\t\t\t\thidden = dataShow.hidden;\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tdataShow = dataPriv.access( elem, \"fxshow\", { display: restoreDisplay } );\n\t\t\t}\n\n\t\t\t// Store hidden/visible for toggle so `.stop().toggle()` \"reverses\"\n\t\t\tif ( toggle ) {\n\t\t\t\tdataShow.hidden = !hidden;\n\t\t\t}\n\n\t\t\t// Show elements before animating them\n\t\t\tif ( hidden ) {\n\t\t\t\tshowHide( [ elem ], true );\n\t\t\t}\n\n\t\t\t/* eslint-disable no-loop-func */\n\n\t\t\tanim.done( function() {\n\n\t\t\t/* eslint-enable no-loop-func */\n\n\t\t\t\t// The final step of a \"hide\" animation is actually hiding the element\n\t\t\t\tif ( !hidden ) {\n\t\t\t\t\tshowHide( [ elem ] );\n\t\t\t\t}\n\t\t\t\tdataPriv.remove( elem, \"fxshow\" );\n\t\t\t\tfor ( prop in orig ) {\n\t\t\t\t\tjQuery.style( elem, prop, orig[ prop ] );\n\t\t\t\t}\n\t\t\t} );\n\t\t}\n\n\t\t// Per-property setup\n\t\tpropTween = createTween( hidden ? dataShow[ prop ] : 0, prop, anim );\n\t\tif ( !( prop in dataShow ) ) {\n\t\t\tdataShow[ prop ] = propTween.start;\n\t\t\tif ( hidden ) {\n\t\t\t\tpropTween.end = propTween.start;\n\t\t\t\tpropTween.start = 0;\n\t\t\t}\n\t\t}\n\t}\n}\n\nfunction propFilter( props, specialEasing ) {\n\tvar index, name, easing, value, hooks;\n\n\t// camelCase, specialEasing and expand cssHook pass\n\tfor ( index in props ) {\n\t\tname = jQuery.camelCase( index );\n\t\teasing = specialEasing[ name ];\n\t\tvalue = props[ index ];\n\t\tif ( Array.isArray( value ) ) {\n\t\t\teasing = value[ 1 ];\n\t\t\tvalue = props[ index ] = value[ 0 ];\n\t\t}\n\n\t\tif ( index !== name ) {\n\t\t\tprops[ name ] = value;\n\t\t\tdelete props[ index ];\n\t\t}\n\n\t\thooks = jQuery.cssHooks[ name ];\n\t\tif ( hooks && \"expand\" in hooks ) {\n\t\t\tvalue = hooks.expand( value );\n\t\t\tdelete props[ name ];\n\n\t\t\t// Not quite $.extend, this won't overwrite existing keys.\n\t\t\t// Reusing 'index' because we have the correct \"name\"\n\t\t\tfor ( index in value ) {\n\t\t\t\tif ( !( index in props ) ) {\n\t\t\t\t\tprops[ index ] = value[ index ];\n\t\t\t\t\tspecialEasing[ index ] = easing;\n\t\t\t\t}\n\t\t\t}\n\t\t} else {\n\t\t\tspecialEasing[ name ] = easing;\n\t\t}\n\t}\n}\n\nfunction Animation( elem, properties, options ) {\n\tvar result,\n\t\tstopped,\n\t\tindex = 0,\n\t\tlength = Animation.prefilters.length,\n\t\tdeferred = jQuery.Deferred().always( function() {\n\n\t\t\t// Don't match elem in the :animated selector\n\t\t\tdelete tick.elem;\n\t\t} ),\n\t\ttick = function() {\n\t\t\tif ( stopped ) {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t\tvar currentTime = fxNow || createFxNow(),\n\t\t\t\tremaining = Math.max( 0, animation.startTime + animation.duration - currentTime ),\n\n\t\t\t\t// Support: Android 2.3 only\n\t\t\t\t// Archaic crash bug won't allow us to use `1 - ( 0.5 || 0 )` (#12497)\n\t\t\t\ttemp = remaining / animation.duration || 0,\n\t\t\t\tpercent = 1 - temp,\n\t\t\t\tindex = 0,\n\t\t\t\tlength = animation.tweens.length;\n\n\t\t\tfor ( ; index < length; index++ ) {\n\t\t\t\tanimation.tweens[ index ].run( percent );\n\t\t\t}\n\n\t\t\tdeferred.notifyWith( elem, [ animation, percent, remaining ] );\n\n\t\t\t// If there's more to do, yield\n\t\t\tif ( percent < 1 && length ) {\n\t\t\t\treturn remaining;\n\t\t\t}\n\n\t\t\t// If this was an empty animation, synthesize a final progress notification\n\t\t\tif ( !length ) {\n\t\t\t\tdeferred.notifyWith( elem, [ animation, 1, 0 ] );\n\t\t\t}\n\n\t\t\t// Resolve the animation and report its conclusion\n\t\t\tdeferred.resolveWith( elem, [ animation ] );\n\t\t\treturn false;\n\t\t},\n\t\tanimation = deferred.promise( {\n\t\t\telem: elem,\n\t\t\tprops: jQuery.extend( {}, properties ),\n\t\t\topts: jQuery.extend( true, {\n\t\t\t\tspecialEasing: {},\n\t\t\t\teasing: jQuery.easing._default\n\t\t\t}, options ),\n\t\t\toriginalProperties: properties,\n\t\t\toriginalOptions: options,\n\t\t\tstartTime: fxNow || createFxNow(),\n\t\t\tduration: options.duration,\n\t\t\ttweens: [],\n\t\t\tcreateTween: function( prop, end ) {\n\t\t\t\tvar tween = jQuery.Tween( elem, animation.opts, prop, end,\n\t\t\t\t\t\tanimation.opts.specialEasing[ prop ] || animation.opts.easing );\n\t\t\t\tanimation.tweens.push( tween );\n\t\t\t\treturn tween;\n\t\t\t},\n\t\t\tstop: function( gotoEnd ) {\n\t\t\t\tvar index = 0,\n\n\t\t\t\t\t// If we are going to the end, we want to run all the tweens\n\t\t\t\t\t// otherwise we skip this part\n\t\t\t\t\tlength = gotoEnd ? animation.tweens.length : 0;\n\t\t\t\tif ( stopped ) {\n\t\t\t\t\treturn this;\n\t\t\t\t}\n\t\t\t\tstopped = true;\n\t\t\t\tfor ( ; index < length; index++ ) {\n\t\t\t\t\tanimation.tweens[ index ].run( 1 );\n\t\t\t\t}\n\n\t\t\t\t// Resolve when we played the last frame; otherwise, reject\n\t\t\t\tif ( gotoEnd ) {\n\t\t\t\t\tdeferred.notifyWith( elem, [ animation, 1, 0 ] );\n\t\t\t\t\tdeferred.resolveWith( elem, [ animation, gotoEnd ] );\n\t\t\t\t} else {\n\t\t\t\t\tdeferred.rejectWith( elem, [ animation, gotoEnd ] );\n\t\t\t\t}\n\t\t\t\treturn this;\n\t\t\t}\n\t\t} ),\n\t\tprops = animation.props;\n\n\tpropFilter( props, animation.opts.specialEasing );\n\n\tfor ( ; index < length; index++ ) {\n\t\tresult = Animation.prefilters[ index ].call( animation, elem, props, animation.opts );\n\t\tif ( result ) {\n\t\t\tif ( jQuery.isFunction( result.stop ) ) {\n\t\t\t\tjQuery._queueHooks( animation.elem, animation.opts.queue ).stop =\n\t\t\t\t\tjQuery.proxy( result.stop, result );\n\t\t\t}\n\t\t\treturn result;\n\t\t}\n\t}\n\n\tjQuery.map( props, createTween, animation );\n\n\tif ( jQuery.isFunction( animation.opts.start ) ) {\n\t\tanimation.opts.start.call( elem, animation );\n\t}\n\n\t// Attach callbacks from options\n\tanimation\n\t\t.progress( animation.opts.progress )\n\t\t.done( animation.opts.done, animation.opts.complete )\n\t\t.fail( animation.opts.fail )\n\t\t.always( animation.opts.always );\n\n\tjQuery.fx.timer(\n\t\tjQuery.extend( tick, {\n\t\t\telem: elem,\n\t\t\tanim: animation,\n\t\t\tqueue: animation.opts.queue\n\t\t} )\n\t);\n\n\treturn animation;\n}\n\njQuery.Animation = jQuery.extend( Animation, {\n\n\ttweeners: {\n\t\t\"*\": [ function( prop, value ) {\n\t\t\tvar tween = this.createTween( prop, value );\n\t\t\tadjustCSS( tween.elem, prop, rcssNum.exec( value ), tween );\n\t\t\treturn tween;\n\t\t} ]\n\t},\n\n\ttweener: function( props, callback ) {\n\t\tif ( jQuery.isFunction( props ) ) {\n\t\t\tcallback = props;\n\t\t\tprops = [ \"*\" ];\n\t\t} else {\n\t\t\tprops = props.match( rnothtmlwhite );\n\t\t}\n\n\t\tvar prop,\n\t\t\tindex = 0,\n\t\t\tlength = props.length;\n\n\t\tfor ( ; index < length; index++ ) {\n\t\t\tprop = props[ index ];\n\t\t\tAnimation.tweeners[ prop ] = Animation.tweeners[ prop ] || [];\n\t\t\tAnimation.tweeners[ prop ].unshift( callback );\n\t\t}\n\t},\n\n\tprefilters: [ defaultPrefilter ],\n\n\tprefilter: function( callback, prepend ) {\n\t\tif ( prepend ) {\n\t\t\tAnimation.prefilters.unshift( callback );\n\t\t} else {\n\t\t\tAnimation.prefilters.push( callback );\n\t\t}\n\t}\n} );\n\njQuery.speed = function( speed, easing, fn ) {\n\tvar opt = speed && typeof speed === \"object\" ? jQuery.extend( {}, speed ) : {\n\t\tcomplete: fn || !fn && easing ||\n\t\t\tjQuery.isFunction( speed ) && speed,\n\t\tduration: speed,\n\t\teasing: fn && easing || easing && !jQuery.isFunction( easing ) && easing\n\t};\n\n\t// Go to the end state if fx are off\n\tif ( jQuery.fx.off ) {\n\t\topt.duration = 0;\n\n\t} else {\n\t\tif ( typeof opt.duration !== \"number\" ) {\n\t\t\tif ( opt.duration in jQuery.fx.speeds ) {\n\t\t\t\topt.duration = jQuery.fx.speeds[ opt.duration ];\n\n\t\t\t} else {\n\t\t\t\topt.duration = jQuery.fx.speeds._default;\n\t\t\t}\n\t\t}\n\t}\n\n\t// Normalize opt.queue - true/undefined/null -> \"fx\"\n\tif ( opt.queue == null || opt.queue === true ) {\n\t\topt.queue = \"fx\";\n\t}\n\n\t// Queueing\n\topt.old = opt.complete;\n\n\topt.complete = function() {\n\t\tif ( jQuery.isFunction( opt.old ) ) {\n\t\t\topt.old.call( this );\n\t\t}\n\n\t\tif ( opt.queue ) {\n\t\t\tjQuery.dequeue( this, opt.queue );\n\t\t}\n\t};\n\n\treturn opt;\n};\n\njQuery.fn.extend( {\n\tfadeTo: function( speed, to, easing, callback ) {\n\n\t\t// Show any hidden elements after setting opacity to 0\n\t\treturn this.filter( isHiddenWithinTree ).css( \"opacity\", 0 ).show()\n\n\t\t\t// Animate to the value specified\n\t\t\t.end().animate( { opacity: to }, speed, easing, callback );\n\t},\n\tanimate: function( prop, speed, easing, callback ) {\n\t\tvar empty = jQuery.isEmptyObject( prop ),\n\t\t\toptall = jQuery.speed( speed, easing, callback ),\n\t\t\tdoAnimation = function() {\n\n\t\t\t\t// Operate on a copy of prop so per-property easing won't be lost\n\t\t\t\tvar anim = Animation( this, jQuery.extend( {}, prop ), optall );\n\n\t\t\t\t// Empty animations, or finishing resolves immediately\n\t\t\t\tif ( empty || dataPriv.get( this, \"finish\" ) ) {\n\t\t\t\t\tanim.stop( true );\n\t\t\t\t}\n\t\t\t};\n\t\t\tdoAnimation.finish = doAnimation;\n\n\t\treturn empty || optall.queue === false ?\n\t\t\tthis.each( doAnimation ) :\n\t\t\tthis.queue( optall.queue, doAnimation );\n\t},\n\tstop: function( type, clearQueue, gotoEnd ) {\n\t\tvar stopQueue = function( hooks ) {\n\t\t\tvar stop = hooks.stop;\n\t\t\tdelete hooks.stop;\n\t\t\tstop( gotoEnd );\n\t\t};\n\n\t\tif ( typeof type !== \"string\" ) {\n\t\t\tgotoEnd = clearQueue;\n\t\t\tclearQueue = type;\n\t\t\ttype = undefined;\n\t\t}\n\t\tif ( clearQueue && type !== false ) {\n\t\t\tthis.queue( type || \"fx\", [] );\n\t\t}\n\n\t\treturn this.each( function() {\n\t\t\tvar dequeue = true,\n\t\t\t\tindex = type != null && type + \"queueHooks\",\n\t\t\t\ttimers = jQuery.timers,\n\t\t\t\tdata = dataPriv.get( this );\n\n\t\t\tif ( index ) {\n\t\t\t\tif ( data[ index ] && data[ index ].stop ) {\n\t\t\t\t\tstopQueue( data[ index ] );\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tfor ( index in data ) {\n\t\t\t\t\tif ( data[ index ] && data[ index ].stop && rrun.test( index ) ) {\n\t\t\t\t\t\tstopQueue( data[ index ] );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tfor ( index = timers.length; index--; ) {\n\t\t\t\tif ( timers[ index ].elem === this &&\n\t\t\t\t\t( type == null || timers[ index ].queue === type ) ) {\n\n\t\t\t\t\ttimers[ index ].anim.stop( gotoEnd );\n\t\t\t\t\tdequeue = false;\n\t\t\t\t\ttimers.splice( index, 1 );\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Start the next in the queue if the last step wasn't forced.\n\t\t\t// Timers currently will call their complete callbacks, which\n\t\t\t// will dequeue but only if they were gotoEnd.\n\t\t\tif ( dequeue || !gotoEnd ) {\n\t\t\t\tjQuery.dequeue( this, type );\n\t\t\t}\n\t\t} );\n\t},\n\tfinish: function( type ) {\n\t\tif ( type !== false ) {\n\t\t\ttype = type || \"fx\";\n\t\t}\n\t\treturn this.each( function() {\n\t\t\tvar index,\n\t\t\t\tdata = dataPriv.get( this ),\n\t\t\t\tqueue = data[ type + \"queue\" ],\n\t\t\t\thooks = data[ type + \"queueHooks\" ],\n\t\t\t\ttimers = jQuery.timers,\n\t\t\t\tlength = queue ? queue.length : 0;\n\n\t\t\t// Enable finishing flag on private data\n\t\t\tdata.finish = true;\n\n\t\t\t// Empty the queue first\n\t\t\tjQuery.queue( this, type, [] );\n\n\t\t\tif ( hooks && hooks.stop ) {\n\t\t\t\thooks.stop.call( this, true );\n\t\t\t}\n\n\t\t\t// Look for any active animations, and finish them\n\t\t\tfor ( index = timers.length; index--; ) {\n\t\t\t\tif ( timers[ index ].elem === this && timers[ index ].queue === type ) {\n\t\t\t\t\ttimers[ index ].anim.stop( true );\n\t\t\t\t\ttimers.splice( index, 1 );\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Look for any animations in the old queue and finish them\n\t\t\tfor ( index = 0; index < length; index++ ) {\n\t\t\t\tif ( queue[ index ] && queue[ index ].finish ) {\n\t\t\t\t\tqueue[ index ].finish.call( this );\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Turn off finishing flag\n\t\t\tdelete data.finish;\n\t\t} );\n\t}\n} );\n\njQuery.each( [ \"toggle\", \"show\", \"hide\" ], function( i, name ) {\n\tvar cssFn = jQuery.fn[ name ];\n\tjQuery.fn[ name ] = function( speed, easing, callback ) {\n\t\treturn speed == null || typeof speed === \"boolean\" ?\n\t\t\tcssFn.apply( this, arguments ) :\n\t\t\tthis.animate( genFx( name, true ), speed, easing, callback );\n\t};\n} );\n\n// Generate shortcuts for custom animations\njQuery.each( {\n\tslideDown: genFx( \"show\" ),\n\tslideUp: genFx( \"hide\" ),\n\tslideToggle: genFx( \"toggle\" ),\n\tfadeIn: { opacity: \"show\" },\n\tfadeOut: { opacity: \"hide\" },\n\tfadeToggle: { opacity: \"toggle\" }\n}, function( name, props ) {\n\tjQuery.fn[ name ] = function( speed, easing, callback ) {\n\t\treturn this.animate( props, speed, easing, callback );\n\t};\n} );\n\njQuery.timers = [];\njQuery.fx.tick = function() {\n\tvar timer,\n\t\ti = 0,\n\t\ttimers = jQuery.timers;\n\n\tfxNow = jQuery.now();\n\n\tfor ( ; i < timers.length; i++ ) {\n\t\ttimer = timers[ i ];\n\n\t\t// Run the timer and safely remove it when done (allowing for external removal)\n\t\tif ( !timer() && timers[ i ] === timer ) {\n\t\t\ttimers.splice( i--, 1 );\n\t\t}\n\t}\n\n\tif ( !timers.length ) {\n\t\tjQuery.fx.stop();\n\t}\n\tfxNow = undefined;\n};\n\njQuery.fx.timer = function( timer ) {\n\tjQuery.timers.push( timer );\n\tjQuery.fx.start();\n};\n\njQuery.fx.interval = 13;\njQuery.fx.start = function() {\n\tif ( inProgress ) {\n\t\treturn;\n\t}\n\n\tinProgress = true;\n\tschedule();\n};\n\njQuery.fx.stop = function() {\n\tinProgress = null;\n};\n\njQuery.fx.speeds = {\n\tslow: 600,\n\tfast: 200,\n\n\t// Default speed\n\t_default: 400\n};\n\n\n// Based off of the plugin by Clint Helfers, with permission.\n// https://web.archive.org/web/20100324014747/http://blindsignals.com/index.php/2009/07/jquery-delay/\njQuery.fn.delay = function( time, type ) {\n\ttime = jQuery.fx ? jQuery.fx.speeds[ time ] || time : time;\n\ttype = type || \"fx\";\n\n\treturn this.queue( type, function( next, hooks ) {\n\t\tvar timeout = window.setTimeout( next, time );\n\t\thooks.stop = function() {\n\t\t\twindow.clearTimeout( timeout );\n\t\t};\n\t} );\n};\n\n\n( function() {\n\tvar input = document.createElement( \"input\" ),\n\t\tselect = document.createElement( \"select\" ),\n\t\topt = select.appendChild( document.createElement( \"option\" ) );\n\n\tinput.type = \"checkbox\";\n\n\t// Support: Android <=4.3 only\n\t// Default value for a checkbox should be \"on\"\n\tsupport.checkOn = input.value !== \"\";\n\n\t// Support: IE <=11 only\n\t// Must access selectedIndex to make default options select\n\tsupport.optSelected = opt.selected;\n\n\t// Support: IE <=11 only\n\t// An input loses its value after becoming a radio\n\tinput = document.createElement( \"input\" );\n\tinput.value = \"t\";\n\tinput.type = \"radio\";\n\tsupport.radioValue = input.value === \"t\";\n} )();\n\n\nvar boolHook,\n\tattrHandle = jQuery.expr.attrHandle;\n\njQuery.fn.extend( {\n\tattr: function( name, value ) {\n\t\treturn access( this, jQuery.attr, name, value, arguments.length > 1 );\n\t},\n\n\tremoveAttr: function( name ) {\n\t\treturn this.each( function() {\n\t\t\tjQuery.removeAttr( this, name );\n\t\t} );\n\t}\n} );\n\njQuery.extend( {\n\tattr: function( elem, name, value ) {\n\t\tvar ret, hooks,\n\t\t\tnType = elem.nodeType;\n\n\t\t// Don't get/set attributes on text, comment and attribute nodes\n\t\tif ( nType === 3 || nType === 8 || nType === 2 ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Fallback to prop when attributes are not supported\n\t\tif ( typeof elem.getAttribute === \"undefined\" ) {\n\t\t\treturn jQuery.prop( elem, name, value );\n\t\t}\n\n\t\t// Attribute hooks are determined by the lowercase version\n\t\t// Grab necessary hook if one is defined\n\t\tif ( nType !== 1 || !jQuery.isXMLDoc( elem ) ) {\n\t\t\thooks = jQuery.attrHooks[ name.toLowerCase() ] ||\n\t\t\t\t( jQuery.expr.match.bool.test( name ) ? boolHook : undefined );\n\t\t}\n\n\t\tif ( value !== undefined ) {\n\t\t\tif ( value === null ) {\n\t\t\t\tjQuery.removeAttr( elem, name );\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif ( hooks && \"set\" in hooks &&\n\t\t\t\t( ret = hooks.set( elem, value, name ) ) !== undefined ) {\n\t\t\t\treturn ret;\n\t\t\t}\n\n\t\t\telem.setAttribute( name, value + \"\" );\n\t\t\treturn value;\n\t\t}\n\n\t\tif ( hooks && \"get\" in hooks && ( ret = hooks.get( elem, name ) ) !== null ) {\n\t\t\treturn ret;\n\t\t}\n\n\t\tret = jQuery.find.attr( elem, name );\n\n\t\t// Non-existent attributes return null, we normalize to undefined\n\t\treturn ret == null ? undefined : ret;\n\t},\n\n\tattrHooks: {\n\t\ttype: {\n\t\t\tset: function( elem, value ) {\n\t\t\t\tif ( !support.radioValue && value === \"radio\" &&\n\t\t\t\t\tnodeName( elem, \"input\" ) ) {\n\t\t\t\t\tvar val = elem.value;\n\t\t\t\t\telem.setAttribute( \"type\", value );\n\t\t\t\t\tif ( val ) {\n\t\t\t\t\t\telem.value = val;\n\t\t\t\t\t}\n\t\t\t\t\treturn value;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t},\n\n\tremoveAttr: function( elem, value ) {\n\t\tvar name,\n\t\t\ti = 0,\n\n\t\t\t// Attribute names can contain non-HTML whitespace characters\n\t\t\t// https://html.spec.whatwg.org/multipage/syntax.html#attributes-2\n\t\t\tattrNames = value && value.match( rnothtmlwhite );\n\n\t\tif ( attrNames && elem.nodeType === 1 ) {\n\t\t\twhile ( ( name = attrNames[ i++ ] ) ) {\n\t\t\t\telem.removeAttribute( name );\n\t\t\t}\n\t\t}\n\t}\n} );\n\n// Hooks for boolean attributes\nboolHook = {\n\tset: function( elem, value, name ) {\n\t\tif ( value === false ) {\n\n\t\t\t// Remove boolean attributes when set to false\n\t\t\tjQuery.removeAttr( elem, name );\n\t\t} else {\n\t\t\telem.setAttribute( name, name );\n\t\t}\n\t\treturn name;\n\t}\n};\n\njQuery.each( jQuery.expr.match.bool.source.match( /\\w+/g ), function( i, name ) {\n\tvar getter = attrHandle[ name ] || jQuery.find.attr;\n\n\tattrHandle[ name ] = function( elem, name, isXML ) {\n\t\tvar ret, handle,\n\t\t\tlowercaseName = name.toLowerCase();\n\n\t\tif ( !isXML ) {\n\n\t\t\t// Avoid an infinite loop by temporarily removing this function from the getter\n\t\t\thandle = attrHandle[ lowercaseName ];\n\t\t\tattrHandle[ lowercaseName ] = ret;\n\t\t\tret = getter( elem, name, isXML ) != null ?\n\t\t\t\tlowercaseName :\n\t\t\t\tnull;\n\t\t\tattrHandle[ lowercaseName ] = handle;\n\t\t}\n\t\treturn ret;\n\t};\n} );\n\n\n\n\nvar rfocusable = /^(?:input|select|textarea|button)$/i,\n\trclickable = /^(?:a|area)$/i;\n\njQuery.fn.extend( {\n\tprop: function( name, value ) {\n\t\treturn access( this, jQuery.prop, name, value, arguments.length > 1 );\n\t},\n\n\tremoveProp: function( name ) {\n\t\treturn this.each( function() {\n\t\t\tdelete this[ jQuery.propFix[ name ] || name ];\n\t\t} );\n\t}\n} );\n\njQuery.extend( {\n\tprop: function( elem, name, value ) {\n\t\tvar ret, hooks,\n\t\t\tnType = elem.nodeType;\n\n\t\t// Don't get/set properties on text, comment and attribute nodes\n\t\tif ( nType === 3 || nType === 8 || nType === 2 ) {\n\t\t\treturn;\n\t\t}\n\n\t\tif ( nType !== 1 || !jQuery.isXMLDoc( elem ) ) {\n\n\t\t\t// Fix name and attach hooks\n\t\t\tname = jQuery.propFix[ name ] || name;\n\t\t\thooks = jQuery.propHooks[ name ];\n\t\t}\n\n\t\tif ( value !== undefined ) {\n\t\t\tif ( hooks && \"set\" in hooks &&\n\t\t\t\t( ret = hooks.set( elem, value, name ) ) !== undefined ) {\n\t\t\t\treturn ret;\n\t\t\t}\n\n\t\t\treturn ( elem[ name ] = value );\n\t\t}\n\n\t\tif ( hooks && \"get\" in hooks && ( ret = hooks.get( elem, name ) ) !== null ) {\n\t\t\treturn ret;\n\t\t}\n\n\t\treturn elem[ name ];\n\t},\n\n\tpropHooks: {\n\t\ttabIndex: {\n\t\t\tget: function( elem ) {\n\n\t\t\t\t// Support: IE <=9 - 11 only\n\t\t\t\t// elem.tabIndex doesn't always return the\n\t\t\t\t// correct value when it hasn't been explicitly set\n\t\t\t\t// https://web.archive.org/web/20141116233347/http://fluidproject.org/blog/2008/01/09/getting-setting-and-removing-tabindex-values-with-javascript/\n\t\t\t\t// Use proper attribute retrieval(#12072)\n\t\t\t\tvar tabindex = jQuery.find.attr( elem, \"tabindex\" );\n\n\t\t\t\tif ( tabindex ) {\n\t\t\t\t\treturn parseInt( tabindex, 10 );\n\t\t\t\t}\n\n\t\t\t\tif (\n\t\t\t\t\trfocusable.test( elem.nodeName ) ||\n\t\t\t\t\trclickable.test( elem.nodeName ) &&\n\t\t\t\t\telem.href\n\t\t\t\t) {\n\t\t\t\t\treturn 0;\n\t\t\t\t}\n\n\t\t\t\treturn -1;\n\t\t\t}\n\t\t}\n\t},\n\n\tpropFix: {\n\t\t\"for\": \"htmlFor\",\n\t\t\"class\": \"className\"\n\t}\n} );\n\n// Support: IE <=11 only\n// Accessing the selectedIndex property\n// forces the browser to respect setting selected\n// on the option\n// The getter ensures a default option is selected\n// when in an optgroup\n// eslint rule \"no-unused-expressions\" is disabled for this code\n// since it considers such accessions noop\nif ( !support.optSelected ) {\n\tjQuery.propHooks.selected = {\n\t\tget: function( elem ) {\n\n\t\t\t/* eslint no-unused-expressions: \"off\" */\n\n\t\t\tvar parent = elem.parentNode;\n\t\t\tif ( parent && parent.parentNode ) {\n\t\t\t\tparent.parentNode.selectedIndex;\n\t\t\t}\n\t\t\treturn null;\n\t\t},\n\t\tset: function( elem ) {\n\n\t\t\t/* eslint no-unused-expressions: \"off\" */\n\n\t\t\tvar parent = elem.parentNode;\n\t\t\tif ( parent ) {\n\t\t\t\tparent.selectedIndex;\n\n\t\t\t\tif ( parent.parentNode ) {\n\t\t\t\t\tparent.parentNode.selectedIndex;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t};\n}\n\njQuery.each( [\n\t\"tabIndex\",\n\t\"readOnly\",\n\t\"maxLength\",\n\t\"cellSpacing\",\n\t\"cellPadding\",\n\t\"rowSpan\",\n\t\"colSpan\",\n\t\"useMap\",\n\t\"frameBorder\",\n\t\"contentEditable\"\n], function() {\n\tjQuery.propFix[ this.toLowerCase() ] = this;\n} );\n\n\n\n\n\t// Strip and collapse whitespace according to HTML spec\n\t// https://html.spec.whatwg.org/multipage/infrastructure.html#strip-and-collapse-whitespace\n\tfunction stripAndCollapse( value ) {\n\t\tvar tokens = value.match( rnothtmlwhite ) || [];\n\t\treturn tokens.join( \" \" );\n\t}\n\n\nfunction getClass( elem ) {\n\treturn elem.getAttribute && elem.getAttribute( \"class\" ) || \"\";\n}\n\njQuery.fn.extend( {\n\taddClass: function( value ) {\n\t\tvar classes, elem, cur, curValue, clazz, j, finalValue,\n\t\t\ti = 0;\n\n\t\tif ( jQuery.isFunction( value ) ) {\n\t\t\treturn this.each( function( j ) {\n\t\t\t\tjQuery( this ).addClass( value.call( this, j, getClass( this ) ) );\n\t\t\t} );\n\t\t}\n\n\t\tif ( typeof value === \"string\" && value ) {\n\t\t\tclasses = value.match( rnothtmlwhite ) || [];\n\n\t\t\twhile ( ( elem = this[ i++ ] ) ) {\n\t\t\t\tcurValue = getClass( elem );\n\t\t\t\tcur = elem.nodeType === 1 && ( \" \" + stripAndCollapse( curValue ) + \" \" );\n\n\t\t\t\tif ( cur ) {\n\t\t\t\t\tj = 0;\n\t\t\t\t\twhile ( ( clazz = classes[ j++ ] ) ) {\n\t\t\t\t\t\tif ( cur.indexOf( \" \" + clazz + \" \" ) < 0 ) {\n\t\t\t\t\t\t\tcur += clazz + \" \";\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\t// Only assign if different to avoid unneeded rendering.\n\t\t\t\t\tfinalValue = stripAndCollapse( cur );\n\t\t\t\t\tif ( curValue !== finalValue ) {\n\t\t\t\t\t\telem.setAttribute( \"class\", finalValue );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn this;\n\t},\n\n\tremoveClass: function( value ) {\n\t\tvar classes, elem, cur, curValue, clazz, j, finalValue,\n\t\t\ti = 0;\n\n\t\tif ( jQuery.isFunction( value ) ) {\n\t\t\treturn this.each( function( j ) {\n\t\t\t\tjQuery( this ).removeClass( value.call( this, j, getClass( this ) ) );\n\t\t\t} );\n\t\t}\n\n\t\tif ( !arguments.length ) {\n\t\t\treturn this.attr( \"class\", \"\" );\n\t\t}\n\n\t\tif ( typeof value === \"string\" && value ) {\n\t\t\tclasses = value.match( rnothtmlwhite ) || [];\n\n\t\t\twhile ( ( elem = this[ i++ ] ) ) {\n\t\t\t\tcurValue = getClass( elem );\n\n\t\t\t\t// This expression is here for better compressibility (see addClass)\n\t\t\t\tcur = elem.nodeType === 1 && ( \" \" + stripAndCollapse( curValue ) + \" \" );\n\n\t\t\t\tif ( cur ) {\n\t\t\t\t\tj = 0;\n\t\t\t\t\twhile ( ( clazz = classes[ j++ ] ) ) {\n\n\t\t\t\t\t\t// Remove *all* instances\n\t\t\t\t\t\twhile ( cur.indexOf( \" \" + clazz + \" \" ) > -1 ) {\n\t\t\t\t\t\t\tcur = cur.replace( \" \" + clazz + \" \", \" \" );\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\t// Only assign if different to avoid unneeded rendering.\n\t\t\t\t\tfinalValue = stripAndCollapse( cur );\n\t\t\t\t\tif ( curValue !== finalValue ) {\n\t\t\t\t\t\telem.setAttribute( \"class\", finalValue );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn this;\n\t},\n\n\ttoggleClass: function( value, stateVal ) {\n\t\tvar type = typeof value;\n\n\t\tif ( typeof stateVal === \"boolean\" && type === \"string\" ) {\n\t\t\treturn stateVal ? this.addClass( value ) : this.removeClass( value );\n\t\t}\n\n\t\tif ( jQuery.isFunction( value ) ) {\n\t\t\treturn this.each( function( i ) {\n\t\t\t\tjQuery( this ).toggleClass(\n\t\t\t\t\tvalue.call( this, i, getClass( this ), stateVal ),\n\t\t\t\t\tstateVal\n\t\t\t\t);\n\t\t\t} );\n\t\t}\n\n\t\treturn this.each( function() {\n\t\t\tvar className, i, self, classNames;\n\n\t\t\tif ( type === \"string\" ) {\n\n\t\t\t\t// Toggle individual class names\n\t\t\t\ti = 0;\n\t\t\t\tself = jQuery( this );\n\t\t\t\tclassNames = value.match( rnothtmlwhite ) || [];\n\n\t\t\t\twhile ( ( className = classNames[ i++ ] ) ) {\n\n\t\t\t\t\t// Check each className given, space separated list\n\t\t\t\t\tif ( self.hasClass( className ) ) {\n\t\t\t\t\t\tself.removeClass( className );\n\t\t\t\t\t} else {\n\t\t\t\t\t\tself.addClass( className );\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t// Toggle whole class name\n\t\t\t} else if ( value === undefined || type === \"boolean\" ) {\n\t\t\t\tclassName = getClass( this );\n\t\t\t\tif ( className ) {\n\n\t\t\t\t\t// Store className if set\n\t\t\t\t\tdataPriv.set( this, \"__className__\", className );\n\t\t\t\t}\n\n\t\t\t\t// If the element has a class name or if we're passed `false`,\n\t\t\t\t// then remove the whole classname (if there was one, the above saved it).\n\t\t\t\t// Otherwise bring back whatever was previously saved (if anything),\n\t\t\t\t// falling back to the empty string if nothing was stored.\n\t\t\t\tif ( this.setAttribute ) {\n\t\t\t\t\tthis.setAttribute( \"class\",\n\t\t\t\t\t\tclassName || value === false ?\n\t\t\t\t\t\t\"\" :\n\t\t\t\t\t\tdataPriv.get( this, \"__className__\" ) || \"\"\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t}\n\t\t} );\n\t},\n\n\thasClass: function( selector ) {\n\t\tvar className, elem,\n\t\t\ti = 0;\n\n\t\tclassName = \" \" + selector + \" \";\n\t\twhile ( ( elem = this[ i++ ] ) ) {\n\t\t\tif ( elem.nodeType === 1 &&\n\t\t\t\t( \" \" + stripAndCollapse( getClass( elem ) ) + \" \" ).indexOf( className ) > -1 ) {\n\t\t\t\t\treturn true;\n\t\t\t}\n\t\t}\n\n\t\treturn false;\n\t}\n} );\n\n\n\n\nvar rreturn = /\\r/g;\n\njQuery.fn.extend( {\n\tval: function( value ) {\n\t\tvar hooks, ret, isFunction,\n\t\t\telem = this[ 0 ];\n\n\t\tif ( !arguments.length ) {\n\t\t\tif ( elem ) {\n\t\t\t\thooks = jQuery.valHooks[ elem.type ] ||\n\t\t\t\t\tjQuery.valHooks[ elem.nodeName.toLowerCase() ];\n\n\t\t\t\tif ( hooks &&\n\t\t\t\t\t\"get\" in hooks &&\n\t\t\t\t\t( ret = hooks.get( elem, \"value\" ) ) !== undefined\n\t\t\t\t) {\n\t\t\t\t\treturn ret;\n\t\t\t\t}\n\n\t\t\t\tret = elem.value;\n\n\t\t\t\t// Handle most common string cases\n\t\t\t\tif ( typeof ret === \"string\" ) {\n\t\t\t\t\treturn ret.replace( rreturn, \"\" );\n\t\t\t\t}\n\n\t\t\t\t// Handle cases where value is null/undef or number\n\t\t\t\treturn ret == null ? \"\" : ret;\n\t\t\t}\n\n\t\t\treturn;\n\t\t}\n\n\t\tisFunction = jQuery.isFunction( value );\n\n\t\treturn this.each( function( i ) {\n\t\t\tvar val;\n\n\t\t\tif ( this.nodeType !== 1 ) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif ( isFunction ) {\n\t\t\t\tval = value.call( this, i, jQuery( this ).val() );\n\t\t\t} else {\n\t\t\t\tval = value;\n\t\t\t}\n\n\t\t\t// Treat null/undefined as \"\"; convert numbers to string\n\t\t\tif ( val == null ) {\n\t\t\t\tval = \"\";\n\n\t\t\t} else if ( typeof val === \"number\" ) {\n\t\t\t\tval += \"\";\n\n\t\t\t} else if ( Array.isArray( val ) ) {\n\t\t\t\tval = jQuery.map( val, function( value ) {\n\t\t\t\t\treturn value == null ? \"\" : value + \"\";\n\t\t\t\t} );\n\t\t\t}\n\n\t\t\thooks = jQuery.valHooks[ this.type ] || jQuery.valHooks[ this.nodeName.toLowerCase() ];\n\n\t\t\t// If set returns undefined, fall back to normal setting\n\t\t\tif ( !hooks || !( \"set\" in hooks ) || hooks.set( this, val, \"value\" ) === undefined ) {\n\t\t\t\tthis.value = val;\n\t\t\t}\n\t\t} );\n\t}\n} );\n\njQuery.extend( {\n\tvalHooks: {\n\t\toption: {\n\t\t\tget: function( elem ) {\n\n\t\t\t\tvar val = jQuery.find.attr( elem, \"value\" );\n\t\t\t\treturn val != null ?\n\t\t\t\t\tval :\n\n\t\t\t\t\t// Support: IE <=10 - 11 only\n\t\t\t\t\t// option.text throws exceptions (#14686, #14858)\n\t\t\t\t\t// Strip and collapse whitespace\n\t\t\t\t\t// https://html.spec.whatwg.org/#strip-and-collapse-whitespace\n\t\t\t\t\tstripAndCollapse( jQuery.text( elem ) );\n\t\t\t}\n\t\t},\n\t\tselect: {\n\t\t\tget: function( elem ) {\n\t\t\t\tvar value, option, i,\n\t\t\t\t\toptions = elem.options,\n\t\t\t\t\tindex = elem.selectedIndex,\n\t\t\t\t\tone = elem.type === \"select-one\",\n\t\t\t\t\tvalues = one ? null : [],\n\t\t\t\t\tmax = one ? index + 1 : options.length;\n\n\t\t\t\tif ( index < 0 ) {\n\t\t\t\t\ti = max;\n\n\t\t\t\t} else {\n\t\t\t\t\ti = one ? index : 0;\n\t\t\t\t}\n\n\t\t\t\t// Loop through all the selected options\n\t\t\t\tfor ( ; i < max; i++ ) {\n\t\t\t\t\toption = options[ i ];\n\n\t\t\t\t\t// Support: IE <=9 only\n\t\t\t\t\t// IE8-9 doesn't update selected after form reset (#2551)\n\t\t\t\t\tif ( ( option.selected || i === index ) &&\n\n\t\t\t\t\t\t\t// Don't return options that are disabled or in a disabled optgroup\n\t\t\t\t\t\t\t!option.disabled &&\n\t\t\t\t\t\t\t( !option.parentNode.disabled ||\n\t\t\t\t\t\t\t\t!nodeName( option.parentNode, \"optgroup\" ) ) ) {\n\n\t\t\t\t\t\t// Get the specific value for the option\n\t\t\t\t\t\tvalue = jQuery( option ).val();\n\n\t\t\t\t\t\t// We don't need an array for one selects\n\t\t\t\t\t\tif ( one ) {\n\t\t\t\t\t\t\treturn value;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// Multi-Selects return an array\n\t\t\t\t\t\tvalues.push( value );\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\treturn values;\n\t\t\t},\n\n\t\t\tset: function( elem, value ) {\n\t\t\t\tvar optionSet, option,\n\t\t\t\t\toptions = elem.options,\n\t\t\t\t\tvalues = jQuery.makeArray( value ),\n\t\t\t\t\ti = options.length;\n\n\t\t\t\twhile ( i-- ) {\n\t\t\t\t\toption = options[ i ];\n\n\t\t\t\t\t/* eslint-disable no-cond-assign */\n\n\t\t\t\t\tif ( option.selected =\n\t\t\t\t\t\tjQuery.inArray( jQuery.valHooks.option.get( option ), values ) > -1\n\t\t\t\t\t) {\n\t\t\t\t\t\toptionSet = true;\n\t\t\t\t\t}\n\n\t\t\t\t\t/* eslint-enable no-cond-assign */\n\t\t\t\t}\n\n\t\t\t\t// Force browsers to behave consistently when non-matching value is set\n\t\t\t\tif ( !optionSet ) {\n\t\t\t\t\telem.selectedIndex = -1;\n\t\t\t\t}\n\t\t\t\treturn values;\n\t\t\t}\n\t\t}\n\t}\n} );\n\n// Radios and checkboxes getter/setter\njQuery.each( [ \"radio\", \"checkbox\" ], function() {\n\tjQuery.valHooks[ this ] = {\n\t\tset: function( elem, value ) {\n\t\t\tif ( Array.isArray( value ) ) {\n\t\t\t\treturn ( elem.checked = jQuery.inArray( jQuery( elem ).val(), value ) > -1 );\n\t\t\t}\n\t\t}\n\t};\n\tif ( !support.checkOn ) {\n\t\tjQuery.valHooks[ this ].get = function( elem ) {\n\t\t\treturn elem.getAttribute( \"value\" ) === null ? \"on\" : elem.value;\n\t\t};\n\t}\n} );\n\n\n\n\n// Return jQuery for attributes-only inclusion\n\n\nvar rfocusMorph = /^(?:focusinfocus|focusoutblur)$/;\n\njQuery.extend( jQuery.event, {\n\n\ttrigger: function( event, data, elem, onlyHandlers ) {\n\n\t\tvar i, cur, tmp, bubbleType, ontype, handle, special,\n\t\t\teventPath = [ elem || document ],\n\t\t\ttype = hasOwn.call( event, \"type\" ) ? event.type : event,\n\t\t\tnamespaces = hasOwn.call( event, \"namespace\" ) ? event.namespace.split( \".\" ) : [];\n\n\t\tcur = tmp = elem = elem || document;\n\n\t\t// Don't do events on text and comment nodes\n\t\tif ( elem.nodeType === 3 || elem.nodeType === 8 ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// focus/blur morphs to focusin/out; ensure we're not firing them right now\n\t\tif ( rfocusMorph.test( type + jQuery.event.triggered ) ) {\n\t\t\treturn;\n\t\t}\n\n\t\tif ( type.indexOf( \".\" ) > -1 ) {\n\n\t\t\t// Namespaced trigger; create a regexp to match event type in handle()\n\t\t\tnamespaces = type.split( \".\" );\n\t\t\ttype = namespaces.shift();\n\t\t\tnamespaces.sort();\n\t\t}\n\t\tontype = type.indexOf( \":\" ) < 0 && \"on\" + type;\n\n\t\t// Caller can pass in a jQuery.Event object, Object, or just an event type string\n\t\tevent = event[ jQuery.expando ] ?\n\t\t\tevent :\n\t\t\tnew jQuery.Event( type, typeof event === \"object\" && event );\n\n\t\t// Trigger bitmask: & 1 for native handlers; & 2 for jQuery (always true)\n\t\tevent.isTrigger = onlyHandlers ? 2 : 3;\n\t\tevent.namespace = namespaces.join( \".\" );\n\t\tevent.rnamespace = event.namespace ?\n\t\t\tnew RegExp( \"(^|\\\\.)\" + namespaces.join( \"\\\\.(?:.*\\\\.|)\" ) + \"(\\\\.|$)\" ) :\n\t\t\tnull;\n\n\t\t// Clean up the event in case it is being reused\n\t\tevent.result = undefined;\n\t\tif ( !event.target ) {\n\t\t\tevent.target = elem;\n\t\t}\n\n\t\t// Clone any incoming data and prepend the event, creating the handler arg list\n\t\tdata = data == null ?\n\t\t\t[ event ] :\n\t\t\tjQuery.makeArray( data, [ event ] );\n\n\t\t// Allow special events to draw outside the lines\n\t\tspecial = jQuery.event.special[ type ] || {};\n\t\tif ( !onlyHandlers && special.trigger && special.trigger.apply( elem, data ) === false ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Determine event propagation path in advance, per W3C events spec (#9951)\n\t\t// Bubble up to document, then to window; watch for a global ownerDocument var (#9724)\n\t\tif ( !onlyHandlers && !special.noBubble && !jQuery.isWindow( elem ) ) {\n\n\t\t\tbubbleType = special.delegateType || type;\n\t\t\tif ( !rfocusMorph.test( bubbleType + type ) ) {\n\t\t\t\tcur = cur.parentNode;\n\t\t\t}\n\t\t\tfor ( ; cur; cur = cur.parentNode ) {\n\t\t\t\teventPath.push( cur );\n\t\t\t\ttmp = cur;\n\t\t\t}\n\n\t\t\t// Only add window if we got to document (e.g., not plain obj or detached DOM)\n\t\t\tif ( tmp === ( elem.ownerDocument || document ) ) {\n\t\t\t\teventPath.push( tmp.defaultView || tmp.parentWindow || window );\n\t\t\t}\n\t\t}\n\n\t\t// Fire handlers on the event path\n\t\ti = 0;\n\t\twhile ( ( cur = eventPath[ i++ ] ) && !event.isPropagationStopped() ) {\n\n\t\t\tevent.type = i > 1 ?\n\t\t\t\tbubbleType :\n\t\t\t\tspecial.bindType || type;\n\n\t\t\t// jQuery handler\n\t\t\thandle = ( dataPriv.get( cur, \"events\" ) || {} )[ event.type ] &&\n\t\t\t\tdataPriv.get( cur, \"handle\" );\n\t\t\tif ( handle ) {\n\t\t\t\thandle.apply( cur, data );\n\t\t\t}\n\n\t\t\t// Native handler\n\t\t\thandle = ontype && cur[ ontype ];\n\t\t\tif ( handle && handle.apply && acceptData( cur ) ) {\n\t\t\t\tevent.result = handle.apply( cur, data );\n\t\t\t\tif ( event.result === false ) {\n\t\t\t\t\tevent.preventDefault();\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tevent.type = type;\n\n\t\t// If nobody prevented the default action, do it now\n\t\tif ( !onlyHandlers && !event.isDefaultPrevented() ) {\n\n\t\t\tif ( ( !special._default ||\n\t\t\t\tspecial._default.apply( eventPath.pop(), data ) === false ) &&\n\t\t\t\tacceptData( elem ) ) {\n\n\t\t\t\t// Call a native DOM method on the target with the same name as the event.\n\t\t\t\t// Don't do default actions on window, that's where global variables be (#6170)\n\t\t\t\tif ( ontype && jQuery.isFunction( elem[ type ] ) && !jQuery.isWindow( elem ) ) {\n\n\t\t\t\t\t// Don't re-trigger an onFOO event when we call its FOO() method\n\t\t\t\t\ttmp = elem[ ontype ];\n\n\t\t\t\t\tif ( tmp ) {\n\t\t\t\t\t\telem[ ontype ] = null;\n\t\t\t\t\t}\n\n\t\t\t\t\t// Prevent re-triggering of the same event, since we already bubbled it above\n\t\t\t\t\tjQuery.event.triggered = type;\n\t\t\t\t\telem[ type ]();\n\t\t\t\t\tjQuery.event.triggered = undefined;\n\n\t\t\t\t\tif ( tmp ) {\n\t\t\t\t\t\telem[ ontype ] = tmp;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn event.result;\n\t},\n\n\t// Piggyback on a donor event to simulate a different one\n\t// Used only for `focus(in | out)` events\n\tsimulate: function( type, elem, event ) {\n\t\tvar e = jQuery.extend(\n\t\t\tnew jQuery.Event(),\n\t\t\tevent,\n\t\t\t{\n\t\t\t\ttype: type,\n\t\t\t\tisSimulated: true\n\t\t\t}\n\t\t);\n\n\t\tjQuery.event.trigger( e, null, elem );\n\t}\n\n} );\n\njQuery.fn.extend( {\n\n\ttrigger: function( type, data ) {\n\t\treturn this.each( function() {\n\t\t\tjQuery.event.trigger( type, data, this );\n\t\t} );\n\t},\n\ttriggerHandler: function( type, data ) {\n\t\tvar elem = this[ 0 ];\n\t\tif ( elem ) {\n\t\t\treturn jQuery.event.trigger( type, data, elem, true );\n\t\t}\n\t}\n} );\n\n\njQuery.each( ( \"blur focus focusin focusout resize scroll click dblclick \" +\n\t\"mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave \" +\n\t\"change select submit keydown keypress keyup contextmenu\" ).split( \" \" ),\n\tfunction( i, name ) {\n\n\t// Handle event binding\n\tjQuery.fn[ name ] = function( data, fn ) {\n\t\treturn arguments.length > 0 ?\n\t\t\tthis.on( name, null, data, fn ) :\n\t\t\tthis.trigger( name );\n\t};\n} );\n\njQuery.fn.extend( {\n\thover: function( fnOver, fnOut ) {\n\t\treturn this.mouseenter( fnOver ).mouseleave( fnOut || fnOver );\n\t}\n} );\n\n\n\n\nsupport.focusin = \"onfocusin\" in window;\n\n\n// Support: Firefox <=44\n// Firefox doesn't have focus(in | out) events\n// Related ticket - https://bugzilla.mozilla.org/show_bug.cgi?id=687787\n//\n// Support: Chrome <=48 - 49, Safari <=9.0 - 9.1\n// focus(in | out) events fire after focus & blur events,\n// which is spec violation - http://www.w3.org/TR/DOM-Level-3-Events/#events-focusevent-event-order\n// Related ticket - https://bugs.chromium.org/p/chromium/issues/detail?id=449857\nif ( !support.focusin ) {\n\tjQuery.each( { focus: \"focusin\", blur: \"focusout\" }, function( orig, fix ) {\n\n\t\t// Attach a single capturing handler on the document while someone wants focusin/focusout\n\t\tvar handler = function( event ) {\n\t\t\tjQuery.event.simulate( fix, event.target, jQuery.event.fix( event ) );\n\t\t};\n\n\t\tjQuery.event.special[ fix ] = {\n\t\t\tsetup: function() {\n\t\t\t\tvar doc = this.ownerDocument || this,\n\t\t\t\t\tattaches = dataPriv.access( doc, fix );\n\n\t\t\t\tif ( !attaches ) {\n\t\t\t\t\tdoc.addEventListener( orig, handler, true );\n\t\t\t\t}\n\t\t\t\tdataPriv.access( doc, fix, ( attaches || 0 ) + 1 );\n\t\t\t},\n\t\t\tteardown: function() {\n\t\t\t\tvar doc = this.ownerDocument || this,\n\t\t\t\t\tattaches = dataPriv.access( doc, fix ) - 1;\n\n\t\t\t\tif ( !attaches ) {\n\t\t\t\t\tdoc.removeEventListener( orig, handler, true );\n\t\t\t\t\tdataPriv.remove( doc, fix );\n\n\t\t\t\t} else {\n\t\t\t\t\tdataPriv.access( doc, fix, attaches );\n\t\t\t\t}\n\t\t\t}\n\t\t};\n\t} );\n}\nvar location = window.location;\n\nvar nonce = jQuery.now();\n\nvar rquery = ( /\\?/ );\n\n\n\n// Cross-browser xml parsing\njQuery.parseXML = function( data ) {\n\tvar xml;\n\tif ( !data || typeof data !== \"string\" ) {\n\t\treturn null;\n\t}\n\n\t// Support: IE 9 - 11 only\n\t// IE throws on parseFromString with invalid input.\n\ttry {\n\t\txml = ( new window.DOMParser() ).parseFromString( data, \"text/xml\" );\n\t} catch ( e ) {\n\t\txml = undefined;\n\t}\n\n\tif ( !xml || xml.getElementsByTagName( \"parsererror\" ).length ) {\n\t\tjQuery.error( \"Invalid XML: \" + data );\n\t}\n\treturn xml;\n};\n\n\nvar\n\trbracket = /\\[\\]$/,\n\trCRLF = /\\r?\\n/g,\n\trsubmitterTypes = /^(?:submit|button|image|reset|file)$/i,\n\trsubmittable = /^(?:input|select|textarea|keygen)/i;\n\nfunction buildParams( prefix, obj, traditional, add ) {\n\tvar name;\n\n\tif ( Array.isArray( obj ) ) {\n\n\t\t// Serialize array item.\n\t\tjQuery.each( obj, function( i, v ) {\n\t\t\tif ( traditional || rbracket.test( prefix ) ) {\n\n\t\t\t\t// Treat each array item as a scalar.\n\t\t\t\tadd( prefix, v );\n\n\t\t\t} else {\n\n\t\t\t\t// Item is non-scalar (array or object), encode its numeric index.\n\t\t\t\tbuildParams(\n\t\t\t\t\tprefix + \"[\" + ( typeof v === \"object\" && v != null ? i : \"\" ) + \"]\",\n\t\t\t\t\tv,\n\t\t\t\t\ttraditional,\n\t\t\t\t\tadd\n\t\t\t\t);\n\t\t\t}\n\t\t} );\n\n\t} else if ( !traditional && jQuery.type( obj ) === \"object\" ) {\n\n\t\t// Serialize object item.\n\t\tfor ( name in obj ) {\n\t\t\tbuildParams( prefix + \"[\" + name + \"]\", obj[ name ], traditional, add );\n\t\t}\n\n\t} else {\n\n\t\t// Serialize scalar item.\n\t\tadd( prefix, obj );\n\t}\n}\n\n// Serialize an array of form elements or a set of\n// key/values into a query string\njQuery.param = function( a, traditional ) {\n\tvar prefix,\n\t\ts = [],\n\t\tadd = function( key, valueOrFunction ) {\n\n\t\t\t// If value is a function, invoke it and use its return value\n\t\t\tvar value = jQuery.isFunction( valueOrFunction ) ?\n\t\t\t\tvalueOrFunction() :\n\t\t\t\tvalueOrFunction;\n\n\t\t\ts[ s.length ] = encodeURIComponent( key ) + \"=\" +\n\t\t\t\tencodeURIComponent( value == null ? \"\" : value );\n\t\t};\n\n\t// If an array was passed in, assume that it is an array of form elements.\n\tif ( Array.isArray( a ) || ( a.jquery && !jQuery.isPlainObject( a ) ) ) {\n\n\t\t// Serialize the form elements\n\t\tjQuery.each( a, function() {\n\t\t\tadd( this.name, this.value );\n\t\t} );\n\n\t} else {\n\n\t\t// If traditional, encode the \"old\" way (the way 1.3.2 or older\n\t\t// did it), otherwise encode params recursively.\n\t\tfor ( prefix in a ) {\n\t\t\tbuildParams( prefix, a[ prefix ], traditional, add );\n\t\t}\n\t}\n\n\t// Return the resulting serialization\n\treturn s.join( \"&\" );\n};\n\njQuery.fn.extend( {\n\tserialize: function() {\n\t\treturn jQuery.param( this.serializeArray() );\n\t},\n\tserializeArray: function() {\n\t\treturn this.map( function() {\n\n\t\t\t// Can add propHook for \"elements\" to filter or add form elements\n\t\t\tvar elements = jQuery.prop( this, \"elements\" );\n\t\t\treturn elements ? jQuery.makeArray( elements ) : this;\n\t\t} )\n\t\t.filter( function() {\n\t\t\tvar type = this.type;\n\n\t\t\t// Use .is( \":disabled\" ) so that fieldset[disabled] works\n\t\t\treturn this.name && !jQuery( this ).is( \":disabled\" ) &&\n\t\t\t\trsubmittable.test( this.nodeName ) && !rsubmitterTypes.test( type ) &&\n\t\t\t\t( this.checked || !rcheckableType.test( type ) );\n\t\t} )\n\t\t.map( function( i, elem ) {\n\t\t\tvar val = jQuery( this ).val();\n\n\t\t\tif ( val == null ) {\n\t\t\t\treturn null;\n\t\t\t}\n\n\t\t\tif ( Array.isArray( val ) ) {\n\t\t\t\treturn jQuery.map( val, function( val ) {\n\t\t\t\t\treturn { name: elem.name, value: val.replace( rCRLF, \"\\r\\n\" ) };\n\t\t\t\t} );\n\t\t\t}\n\n\t\t\treturn { name: elem.name, value: val.replace( rCRLF, \"\\r\\n\" ) };\n\t\t} ).get();\n\t}\n} );\n\n\nvar\n\tr20 = /%20/g,\n\trhash = /#.*$/,\n\trantiCache = /([?&])_=[^&]*/,\n\trheaders = /^(.*?):[ \\t]*([^\\r\\n]*)$/mg,\n\n\t// #7653, #8125, #8152: local protocol detection\n\trlocalProtocol = /^(?:about|app|app-storage|.+-extension|file|res|widget):$/,\n\trnoContent = /^(?:GET|HEAD)$/,\n\trprotocol = /^\\/\\//,\n\n\t/* Prefilters\n\t * 1) They are useful to introduce custom dataTypes (see ajax/jsonp.js for an example)\n\t * 2) These are called:\n\t *    - BEFORE asking for a transport\n\t *    - AFTER param serialization (s.data is a string if s.processData is true)\n\t * 3) key is the dataType\n\t * 4) the catchall symbol \"*\" can be used\n\t * 5) execution will start with transport dataType and THEN continue down to \"*\" if needed\n\t */\n\tprefilters = {},\n\n\t/* Transports bindings\n\t * 1) key is the dataType\n\t * 2) the catchall symbol \"*\" can be used\n\t * 3) selection will start with transport dataType and THEN go to \"*\" if needed\n\t */\n\ttransports = {},\n\n\t// Avoid comment-prolog char sequence (#10098); must appease lint and evade compression\n\tallTypes = \"*/\".concat( \"*\" ),\n\n\t// Anchor tag for parsing the document origin\n\toriginAnchor = document.createElement( \"a\" );\n\toriginAnchor.href = location.href;\n\n// Base \"constructor\" for jQuery.ajaxPrefilter and jQuery.ajaxTransport\nfunction addToPrefiltersOrTransports( structure ) {\n\n\t// dataTypeExpression is optional and defaults to \"*\"\n\treturn function( dataTypeExpression, func ) {\n\n\t\tif ( typeof dataTypeExpression !== \"string\" ) {\n\t\t\tfunc = dataTypeExpression;\n\t\t\tdataTypeExpression = \"*\";\n\t\t}\n\n\t\tvar dataType,\n\t\t\ti = 0,\n\t\t\tdataTypes = dataTypeExpression.toLowerCase().match( rnothtmlwhite ) || [];\n\n\t\tif ( jQuery.isFunction( func ) ) {\n\n\t\t\t// For each dataType in the dataTypeExpression\n\t\t\twhile ( ( dataType = dataTypes[ i++ ] ) ) {\n\n\t\t\t\t// Prepend if requested\n\t\t\t\tif ( dataType[ 0 ] === \"+\" ) {\n\t\t\t\t\tdataType = dataType.slice( 1 ) || \"*\";\n\t\t\t\t\t( structure[ dataType ] = structure[ dataType ] || [] ).unshift( func );\n\n\t\t\t\t// Otherwise append\n\t\t\t\t} else {\n\t\t\t\t\t( structure[ dataType ] = structure[ dataType ] || [] ).push( func );\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t};\n}\n\n// Base inspection function for prefilters and transports\nfunction inspectPrefiltersOrTransports( structure, options, originalOptions, jqXHR ) {\n\n\tvar inspected = {},\n\t\tseekingTransport = ( structure === transports );\n\n\tfunction inspect( dataType ) {\n\t\tvar selected;\n\t\tinspected[ dataType ] = true;\n\t\tjQuery.each( structure[ dataType ] || [], function( _, prefilterOrFactory ) {\n\t\t\tvar dataTypeOrTransport = prefilterOrFactory( options, originalOptions, jqXHR );\n\t\t\tif ( typeof dataTypeOrTransport === \"string\" &&\n\t\t\t\t!seekingTransport && !inspected[ dataTypeOrTransport ] ) {\n\n\t\t\t\toptions.dataTypes.unshift( dataTypeOrTransport );\n\t\t\t\tinspect( dataTypeOrTransport );\n\t\t\t\treturn false;\n\t\t\t} else if ( seekingTransport ) {\n\t\t\t\treturn !( selected = dataTypeOrTransport );\n\t\t\t}\n\t\t} );\n\t\treturn selected;\n\t}\n\n\treturn inspect( options.dataTypes[ 0 ] ) || !inspected[ \"*\" ] && inspect( \"*\" );\n}\n\n// A special extend for ajax options\n// that takes \"flat\" options (not to be deep extended)\n// Fixes #9887\nfunction ajaxExtend( target, src ) {\n\tvar key, deep,\n\t\tflatOptions = jQuery.ajaxSettings.flatOptions || {};\n\n\tfor ( key in src ) {\n\t\tif ( src[ key ] !== undefined ) {\n\t\t\t( flatOptions[ key ] ? target : ( deep || ( deep = {} ) ) )[ key ] = src[ key ];\n\t\t}\n\t}\n\tif ( deep ) {\n\t\tjQuery.extend( true, target, deep );\n\t}\n\n\treturn target;\n}\n\n/* Handles responses to an ajax request:\n * - finds the right dataType (mediates between content-type and expected dataType)\n * - returns the corresponding response\n */\nfunction ajaxHandleResponses( s, jqXHR, responses ) {\n\n\tvar ct, type, finalDataType, firstDataType,\n\t\tcontents = s.contents,\n\t\tdataTypes = s.dataTypes;\n\n\t// Remove auto dataType and get content-type in the process\n\twhile ( dataTypes[ 0 ] === \"*\" ) {\n\t\tdataTypes.shift();\n\t\tif ( ct === undefined ) {\n\t\t\tct = s.mimeType || jqXHR.getResponseHeader( \"Content-Type\" );\n\t\t}\n\t}\n\n\t// Check if we're dealing with a known content-type\n\tif ( ct ) {\n\t\tfor ( type in contents ) {\n\t\t\tif ( contents[ type ] && contents[ type ].test( ct ) ) {\n\t\t\t\tdataTypes.unshift( type );\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t}\n\n\t// Check to see if we have a response for the expected dataType\n\tif ( dataTypes[ 0 ] in responses ) {\n\t\tfinalDataType = dataTypes[ 0 ];\n\t} else {\n\n\t\t// Try convertible dataTypes\n\t\tfor ( type in responses ) {\n\t\t\tif ( !dataTypes[ 0 ] || s.converters[ type + \" \" + dataTypes[ 0 ] ] ) {\n\t\t\t\tfinalDataType = type;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tif ( !firstDataType ) {\n\t\t\t\tfirstDataType = type;\n\t\t\t}\n\t\t}\n\n\t\t// Or just use first one\n\t\tfinalDataType = finalDataType || firstDataType;\n\t}\n\n\t// If we found a dataType\n\t// We add the dataType to the list if needed\n\t// and return the corresponding response\n\tif ( finalDataType ) {\n\t\tif ( finalDataType !== dataTypes[ 0 ] ) {\n\t\t\tdataTypes.unshift( finalDataType );\n\t\t}\n\t\treturn responses[ finalDataType ];\n\t}\n}\n\n/* Chain conversions given the request and the original response\n * Also sets the responseXXX fields on the jqXHR instance\n */\nfunction ajaxConvert( s, response, jqXHR, isSuccess ) {\n\tvar conv2, current, conv, tmp, prev,\n\t\tconverters = {},\n\n\t\t// Work with a copy of dataTypes in case we need to modify it for conversion\n\t\tdataTypes = s.dataTypes.slice();\n\n\t// Create converters map with lowercased keys\n\tif ( dataTypes[ 1 ] ) {\n\t\tfor ( conv in s.converters ) {\n\t\t\tconverters[ conv.toLowerCase() ] = s.converters[ conv ];\n\t\t}\n\t}\n\n\tcurrent = dataTypes.shift();\n\n\t// Convert to each sequential dataType\n\twhile ( current ) {\n\n\t\tif ( s.responseFields[ current ] ) {\n\t\t\tjqXHR[ s.responseFields[ current ] ] = response;\n\t\t}\n\n\t\t// Apply the dataFilter if provided\n\t\tif ( !prev && isSuccess && s.dataFilter ) {\n\t\t\tresponse = s.dataFilter( response, s.dataType );\n\t\t}\n\n\t\tprev = current;\n\t\tcurrent = dataTypes.shift();\n\n\t\tif ( current ) {\n\n\t\t\t// There's only work to do if current dataType is non-auto\n\t\t\tif ( current === \"*\" ) {\n\n\t\t\t\tcurrent = prev;\n\n\t\t\t// Convert response if prev dataType is non-auto and differs from current\n\t\t\t} else if ( prev !== \"*\" && prev !== current ) {\n\n\t\t\t\t// Seek a direct converter\n\t\t\t\tconv = converters[ prev + \" \" + current ] || converters[ \"* \" + current ];\n\n\t\t\t\t// If none found, seek a pair\n\t\t\t\tif ( !conv ) {\n\t\t\t\t\tfor ( conv2 in converters ) {\n\n\t\t\t\t\t\t// If conv2 outputs current\n\t\t\t\t\t\ttmp = conv2.split( \" \" );\n\t\t\t\t\t\tif ( tmp[ 1 ] === current ) {\n\n\t\t\t\t\t\t\t// If prev can be converted to accepted input\n\t\t\t\t\t\t\tconv = converters[ prev + \" \" + tmp[ 0 ] ] ||\n\t\t\t\t\t\t\t\tconverters[ \"* \" + tmp[ 0 ] ];\n\t\t\t\t\t\t\tif ( conv ) {\n\n\t\t\t\t\t\t\t\t// Condense equivalence converters\n\t\t\t\t\t\t\t\tif ( conv === true ) {\n\t\t\t\t\t\t\t\t\tconv = converters[ conv2 ];\n\n\t\t\t\t\t\t\t\t// Otherwise, insert the intermediate dataType\n\t\t\t\t\t\t\t\t} else if ( converters[ conv2 ] !== true ) {\n\t\t\t\t\t\t\t\t\tcurrent = tmp[ 0 ];\n\t\t\t\t\t\t\t\t\tdataTypes.unshift( tmp[ 1 ] );\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t// Apply converter (if not an equivalence)\n\t\t\t\tif ( conv !== true ) {\n\n\t\t\t\t\t// Unless errors are allowed to bubble, catch and return them\n\t\t\t\t\tif ( conv && s.throws ) {\n\t\t\t\t\t\tresponse = conv( response );\n\t\t\t\t\t} else {\n\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\tresponse = conv( response );\n\t\t\t\t\t\t} catch ( e ) {\n\t\t\t\t\t\t\treturn {\n\t\t\t\t\t\t\t\tstate: \"parsererror\",\n\t\t\t\t\t\t\t\terror: conv ? e : \"No conversion from \" + prev + \" to \" + current\n\t\t\t\t\t\t\t};\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\treturn { state: \"success\", data: response };\n}\n\njQuery.extend( {\n\n\t// Counter for holding the number of active queries\n\tactive: 0,\n\n\t// Last-Modified header cache for next request\n\tlastModified: {},\n\tetag: {},\n\n\tajaxSettings: {\n\t\turl: location.href,\n\t\ttype: \"GET\",\n\t\tisLocal: rlocalProtocol.test( location.protocol ),\n\t\tglobal: true,\n\t\tprocessData: true,\n\t\tasync: true,\n\t\tcontentType: \"application/x-www-form-urlencoded; charset=UTF-8\",\n\n\t\t/*\n\t\ttimeout: 0,\n\t\tdata: null,\n\t\tdataType: null,\n\t\tusername: null,\n\t\tpassword: null,\n\t\tcache: null,\n\t\tthrows: false,\n\t\ttraditional: false,\n\t\theaders: {},\n\t\t*/\n\n\t\taccepts: {\n\t\t\t\"*\": allTypes,\n\t\t\ttext: \"text/plain\",\n\t\t\thtml: \"text/html\",\n\t\t\txml: \"application/xml, text/xml\",\n\t\t\tjson: \"application/json, text/javascript\"\n\t\t},\n\n\t\tcontents: {\n\t\t\txml: /\\bxml\\b/,\n\t\t\thtml: /\\bhtml/,\n\t\t\tjson: /\\bjson\\b/\n\t\t},\n\n\t\tresponseFields: {\n\t\t\txml: \"responseXML\",\n\t\t\ttext: \"responseText\",\n\t\t\tjson: \"responseJSON\"\n\t\t},\n\n\t\t// Data converters\n\t\t// Keys separate source (or catchall \"*\") and destination types with a single space\n\t\tconverters: {\n\n\t\t\t// Convert anything to text\n\t\t\t\"* text\": String,\n\n\t\t\t// Text to html (true = no transformation)\n\t\t\t\"text html\": true,\n\n\t\t\t// Evaluate text as a json expression\n\t\t\t\"text json\": JSON.parse,\n\n\t\t\t// Parse text as xml\n\t\t\t\"text xml\": jQuery.parseXML\n\t\t},\n\n\t\t// For options that shouldn't be deep extended:\n\t\t// you can add your own custom options here if\n\t\t// and when you create one that shouldn't be\n\t\t// deep extended (see ajaxExtend)\n\t\tflatOptions: {\n\t\t\turl: true,\n\t\t\tcontext: true\n\t\t}\n\t},\n\n\t// Creates a full fledged settings object into target\n\t// with both ajaxSettings and settings fields.\n\t// If target is omitted, writes into ajaxSettings.\n\tajaxSetup: function( target, settings ) {\n\t\treturn settings ?\n\n\t\t\t// Building a settings object\n\t\t\tajaxExtend( ajaxExtend( target, jQuery.ajaxSettings ), settings ) :\n\n\t\t\t// Extending ajaxSettings\n\t\t\tajaxExtend( jQuery.ajaxSettings, target );\n\t},\n\n\tajaxPrefilter: addToPrefiltersOrTransports( prefilters ),\n\tajaxTransport: addToPrefiltersOrTransports( transports ),\n\n\t// Main method\n\tajax: function( url, options ) {\n\n\t\t// If url is an object, simulate pre-1.5 signature\n\t\tif ( typeof url === \"object\" ) {\n\t\t\toptions = url;\n\t\t\turl = undefined;\n\t\t}\n\n\t\t// Force options to be an object\n\t\toptions = options || {};\n\n\t\tvar transport,\n\n\t\t\t// URL without anti-cache param\n\t\t\tcacheURL,\n\n\t\t\t// Response headers\n\t\t\tresponseHeadersString,\n\t\t\tresponseHeaders,\n\n\t\t\t// timeout handle\n\t\t\ttimeoutTimer,\n\n\t\t\t// Url cleanup var\n\t\t\turlAnchor,\n\n\t\t\t// Request state (becomes false upon send and true upon completion)\n\t\t\tcompleted,\n\n\t\t\t// To know if global events are to be dispatched\n\t\t\tfireGlobals,\n\n\t\t\t// Loop variable\n\t\t\ti,\n\n\t\t\t// uncached part of the url\n\t\t\tuncached,\n\n\t\t\t// Create the final options object\n\t\t\ts = jQuery.ajaxSetup( {}, options ),\n\n\t\t\t// Callbacks context\n\t\t\tcallbackContext = s.context || s,\n\n\t\t\t// Context for global events is callbackContext if it is a DOM node or jQuery collection\n\t\t\tglobalEventContext = s.context &&\n\t\t\t\t( callbackContext.nodeType || callbackContext.jquery ) ?\n\t\t\t\t\tjQuery( callbackContext ) :\n\t\t\t\t\tjQuery.event,\n\n\t\t\t// Deferreds\n\t\t\tdeferred = jQuery.Deferred(),\n\t\t\tcompleteDeferred = jQuery.Callbacks( \"once memory\" ),\n\n\t\t\t// Status-dependent callbacks\n\t\t\tstatusCode = s.statusCode || {},\n\n\t\t\t// Headers (they are sent all at once)\n\t\t\trequestHeaders = {},\n\t\t\trequestHeadersNames = {},\n\n\t\t\t// Default abort message\n\t\t\tstrAbort = \"canceled\",\n\n\t\t\t// Fake xhr\n\t\t\tjqXHR = {\n\t\t\t\treadyState: 0,\n\n\t\t\t\t// Builds headers hashtable if needed\n\t\t\t\tgetResponseHeader: function( key ) {\n\t\t\t\t\tvar match;\n\t\t\t\t\tif ( completed ) {\n\t\t\t\t\t\tif ( !responseHeaders ) {\n\t\t\t\t\t\t\tresponseHeaders = {};\n\t\t\t\t\t\t\twhile ( ( match = rheaders.exec( responseHeadersString ) ) ) {\n\t\t\t\t\t\t\t\tresponseHeaders[ match[ 1 ].toLowerCase() ] = match[ 2 ];\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t\tmatch = responseHeaders[ key.toLowerCase() ];\n\t\t\t\t\t}\n\t\t\t\t\treturn match == null ? null : match;\n\t\t\t\t},\n\n\t\t\t\t// Raw string\n\t\t\t\tgetAllResponseHeaders: function() {\n\t\t\t\t\treturn completed ? responseHeadersString : null;\n\t\t\t\t},\n\n\t\t\t\t// Caches the header\n\t\t\t\tsetRequestHeader: function( name, value ) {\n\t\t\t\t\tif ( completed == null ) {\n\t\t\t\t\t\tname = requestHeadersNames[ name.toLowerCase() ] =\n\t\t\t\t\t\t\trequestHeadersNames[ name.toLowerCase() ] || name;\n\t\t\t\t\t\trequestHeaders[ name ] = value;\n\t\t\t\t\t}\n\t\t\t\t\treturn this;\n\t\t\t\t},\n\n\t\t\t\t// Overrides response content-type header\n\t\t\t\toverrideMimeType: function( type ) {\n\t\t\t\t\tif ( completed == null ) {\n\t\t\t\t\t\ts.mimeType = type;\n\t\t\t\t\t}\n\t\t\t\t\treturn this;\n\t\t\t\t},\n\n\t\t\t\t// Status-dependent callbacks\n\t\t\t\tstatusCode: function( map ) {\n\t\t\t\t\tvar code;\n\t\t\t\t\tif ( map ) {\n\t\t\t\t\t\tif ( completed ) {\n\n\t\t\t\t\t\t\t// Execute the appropriate callbacks\n\t\t\t\t\t\t\tjqXHR.always( map[ jqXHR.status ] );\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t// Lazy-add the new callbacks in a way that preserves old ones\n\t\t\t\t\t\t\tfor ( code in map ) {\n\t\t\t\t\t\t\t\tstatusCode[ code ] = [ statusCode[ code ], map[ code ] ];\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\treturn this;\n\t\t\t\t},\n\n\t\t\t\t// Cancel the request\n\t\t\t\tabort: function( statusText ) {\n\t\t\t\t\tvar finalText = statusText || strAbort;\n\t\t\t\t\tif ( transport ) {\n\t\t\t\t\t\ttransport.abort( finalText );\n\t\t\t\t\t}\n\t\t\t\t\tdone( 0, finalText );\n\t\t\t\t\treturn this;\n\t\t\t\t}\n\t\t\t};\n\n\t\t// Attach deferreds\n\t\tdeferred.promise( jqXHR );\n\n\t\t// Add protocol if not provided (prefilters might expect it)\n\t\t// Handle falsy url in the settings object (#10093: consistency with old signature)\n\t\t// We also use the url parameter if available\n\t\ts.url = ( ( url || s.url || location.href ) + \"\" )\n\t\t\t.replace( rprotocol, location.protocol + \"//\" );\n\n\t\t// Alias method option to type as per ticket #12004\n\t\ts.type = options.method || options.type || s.method || s.type;\n\n\t\t// Extract dataTypes list\n\t\ts.dataTypes = ( s.dataType || \"*\" ).toLowerCase().match( rnothtmlwhite ) || [ \"\" ];\n\n\t\t// A cross-domain request is in order when the origin doesn't match the current origin.\n\t\tif ( s.crossDomain == null ) {\n\t\t\turlAnchor = document.createElement( \"a\" );\n\n\t\t\t// Support: IE <=8 - 11, Edge 12 - 13\n\t\t\t// IE throws exception on accessing the href property if url is malformed,\n\t\t\t// e.g. http://example.com:80x/\n\t\t\ttry {\n\t\t\t\turlAnchor.href = s.url;\n\n\t\t\t\t// Support: IE <=8 - 11 only\n\t\t\t\t// Anchor's host property isn't correctly set when s.url is relative\n\t\t\t\turlAnchor.href = urlAnchor.href;\n\t\t\t\ts.crossDomain = originAnchor.protocol + \"//\" + originAnchor.host !==\n\t\t\t\t\turlAnchor.protocol + \"//\" + urlAnchor.host;\n\t\t\t} catch ( e ) {\n\n\t\t\t\t// If there is an error parsing the URL, assume it is crossDomain,\n\t\t\t\t// it can be rejected by the transport if it is invalid\n\t\t\t\ts.crossDomain = true;\n\t\t\t}\n\t\t}\n\n\t\t// Convert data if not already a string\n\t\tif ( s.data && s.processData && typeof s.data !== \"string\" ) {\n\t\t\ts.data = jQuery.param( s.data, s.traditional );\n\t\t}\n\n\t\t// Apply prefilters\n\t\tinspectPrefiltersOrTransports( prefilters, s, options, jqXHR );\n\n\t\t// If request was aborted inside a prefilter, stop there\n\t\tif ( completed ) {\n\t\t\treturn jqXHR;\n\t\t}\n\n\t\t// We can fire global events as of now if asked to\n\t\t// Don't fire events if jQuery.event is undefined in an AMD-usage scenario (#15118)\n\t\tfireGlobals = jQuery.event && s.global;\n\n\t\t// Watch for a new set of requests\n\t\tif ( fireGlobals && jQuery.active++ === 0 ) {\n\t\t\tjQuery.event.trigger( \"ajaxStart\" );\n\t\t}\n\n\t\t// Uppercase the type\n\t\ts.type = s.type.toUpperCase();\n\n\t\t// Determine if request has content\n\t\ts.hasContent = !rnoContent.test( s.type );\n\n\t\t// Save the URL in case we're toying with the If-Modified-Since\n\t\t// and/or If-None-Match header later on\n\t\t// Remove hash to simplify url manipulation\n\t\tcacheURL = s.url.replace( rhash, \"\" );\n\n\t\t// More options handling for requests with no content\n\t\tif ( !s.hasContent ) {\n\n\t\t\t// Remember the hash so we can put it back\n\t\t\tuncached = s.url.slice( cacheURL.length );\n\n\t\t\t// If data is available, append data to url\n\t\t\tif ( s.data ) {\n\t\t\t\tcacheURL += ( rquery.test( cacheURL ) ? \"&\" : \"?\" ) + s.data;\n\n\t\t\t\t// #9682: remove data so that it's not used in an eventual retry\n\t\t\t\tdelete s.data;\n\t\t\t}\n\n\t\t\t// Add or update anti-cache param if needed\n\t\t\tif ( s.cache === false ) {\n\t\t\t\tcacheURL = cacheURL.replace( rantiCache, \"$1\" );\n\t\t\t\tuncached = ( rquery.test( cacheURL ) ? \"&\" : \"?\" ) + \"_=\" + ( nonce++ ) + uncached;\n\t\t\t}\n\n\t\t\t// Put hash and anti-cache on the URL that will be requested (gh-1732)\n\t\t\ts.url = cacheURL + uncached;\n\n\t\t// Change '%20' to '+' if this is encoded form body content (gh-2658)\n\t\t} else if ( s.data && s.processData &&\n\t\t\t( s.contentType || \"\" ).indexOf( \"application/x-www-form-urlencoded\" ) === 0 ) {\n\t\t\ts.data = s.data.replace( r20, \"+\" );\n\t\t}\n\n\t\t// Set the If-Modified-Since and/or If-None-Match header, if in ifModified mode.\n\t\tif ( s.ifModified ) {\n\t\t\tif ( jQuery.lastModified[ cacheURL ] ) {\n\t\t\t\tjqXHR.setRequestHeader( \"If-Modified-Since\", jQuery.lastModified[ cacheURL ] );\n\t\t\t}\n\t\t\tif ( jQuery.etag[ cacheURL ] ) {\n\t\t\t\tjqXHR.setRequestHeader( \"If-None-Match\", jQuery.etag[ cacheURL ] );\n\t\t\t}\n\t\t}\n\n\t\t// Set the correct header, if data is being sent\n\t\tif ( s.data && s.hasContent && s.contentType !== false || options.contentType ) {\n\t\t\tjqXHR.setRequestHeader( \"Content-Type\", s.contentType );\n\t\t}\n\n\t\t// Set the Accepts header for the server, depending on the dataType\n\t\tjqXHR.setRequestHeader(\n\t\t\t\"Accept\",\n\t\t\ts.dataTypes[ 0 ] && s.accepts[ s.dataTypes[ 0 ] ] ?\n\t\t\t\ts.accepts[ s.dataTypes[ 0 ] ] +\n\t\t\t\t\t( s.dataTypes[ 0 ] !== \"*\" ? \", \" + allTypes + \"; q=0.01\" : \"\" ) :\n\t\t\t\ts.accepts[ \"*\" ]\n\t\t);\n\n\t\t// Check for headers option\n\t\tfor ( i in s.headers ) {\n\t\t\tjqXHR.setRequestHeader( i, s.headers[ i ] );\n\t\t}\n\n\t\t// Allow custom headers/mimetypes and early abort\n\t\tif ( s.beforeSend &&\n\t\t\t( s.beforeSend.call( callbackContext, jqXHR, s ) === false || completed ) ) {\n\n\t\t\t// Abort if not done already and return\n\t\t\treturn jqXHR.abort();\n\t\t}\n\n\t\t// Aborting is no longer a cancellation\n\t\tstrAbort = \"abort\";\n\n\t\t// Install callbacks on deferreds\n\t\tcompleteDeferred.add( s.complete );\n\t\tjqXHR.done( s.success );\n\t\tjqXHR.fail( s.error );\n\n\t\t// Get transport\n\t\ttransport = inspectPrefiltersOrTransports( transports, s, options, jqXHR );\n\n\t\t// If no transport, we auto-abort\n\t\tif ( !transport ) {\n\t\t\tdone( -1, \"No Transport\" );\n\t\t} else {\n\t\t\tjqXHR.readyState = 1;\n\n\t\t\t// Send global event\n\t\t\tif ( fireGlobals ) {\n\t\t\t\tglobalEventContext.trigger( \"ajaxSend\", [ jqXHR, s ] );\n\t\t\t}\n\n\t\t\t// If request was aborted inside ajaxSend, stop there\n\t\t\tif ( completed ) {\n\t\t\t\treturn jqXHR;\n\t\t\t}\n\n\t\t\t// Timeout\n\t\t\tif ( s.async && s.timeout > 0 ) {\n\t\t\t\ttimeoutTimer = window.setTimeout( function() {\n\t\t\t\t\tjqXHR.abort( \"timeout\" );\n\t\t\t\t}, s.timeout );\n\t\t\t}\n\n\t\t\ttry {\n\t\t\t\tcompleted = false;\n\t\t\t\ttransport.send( requestHeaders, done );\n\t\t\t} catch ( e ) {\n\n\t\t\t\t// Rethrow post-completion exceptions\n\t\t\t\tif ( completed ) {\n\t\t\t\t\tthrow e;\n\t\t\t\t}\n\n\t\t\t\t// Propagate others as results\n\t\t\t\tdone( -1, e );\n\t\t\t}\n\t\t}\n\n\t\t// Callback for when everything is done\n\t\tfunction done( status, nativeStatusText, responses, headers ) {\n\t\t\tvar isSuccess, success, error, response, modified,\n\t\t\t\tstatusText = nativeStatusText;\n\n\t\t\t// Ignore repeat invocations\n\t\t\tif ( completed ) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tcompleted = true;\n\n\t\t\t// Clear timeout if it exists\n\t\t\tif ( timeoutTimer ) {\n\t\t\t\twindow.clearTimeout( timeoutTimer );\n\t\t\t}\n\n\t\t\t// Dereference transport for early garbage collection\n\t\t\t// (no matter how long the jqXHR object will be used)\n\t\t\ttransport = undefined;\n\n\t\t\t// Cache response headers\n\t\t\tresponseHeadersString = headers || \"\";\n\n\t\t\t// Set readyState\n\t\t\tjqXHR.readyState = status > 0 ? 4 : 0;\n\n\t\t\t// Determine if successful\n\t\t\tisSuccess = status >= 200 && status < 300 || status === 304;\n\n\t\t\t// Get response data\n\t\t\tif ( responses ) {\n\t\t\t\tresponse = ajaxHandleResponses( s, jqXHR, responses );\n\t\t\t}\n\n\t\t\t// Convert no matter what (that way responseXXX fields are always set)\n\t\t\tresponse = ajaxConvert( s, response, jqXHR, isSuccess );\n\n\t\t\t// If successful, handle type chaining\n\t\t\tif ( isSuccess ) {\n\n\t\t\t\t// Set the If-Modified-Since and/or If-None-Match header, if in ifModified mode.\n\t\t\t\tif ( s.ifModified ) {\n\t\t\t\t\tmodified = jqXHR.getResponseHeader( \"Last-Modified\" );\n\t\t\t\t\tif ( modified ) {\n\t\t\t\t\t\tjQuery.lastModified[ cacheURL ] = modified;\n\t\t\t\t\t}\n\t\t\t\t\tmodified = jqXHR.getResponseHeader( \"etag\" );\n\t\t\t\t\tif ( modified ) {\n\t\t\t\t\t\tjQuery.etag[ cacheURL ] = modified;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t// if no content\n\t\t\t\tif ( status === 204 || s.type === \"HEAD\" ) {\n\t\t\t\t\tstatusText = \"nocontent\";\n\n\t\t\t\t// if not modified\n\t\t\t\t} else if ( status === 304 ) {\n\t\t\t\t\tstatusText = \"notmodified\";\n\n\t\t\t\t// If we have data, let's convert it\n\t\t\t\t} else {\n\t\t\t\t\tstatusText = response.state;\n\t\t\t\t\tsuccess = response.data;\n\t\t\t\t\terror = response.error;\n\t\t\t\t\tisSuccess = !error;\n\t\t\t\t}\n\t\t\t} else {\n\n\t\t\t\t// Extract error from statusText and normalize for non-aborts\n\t\t\t\terror = statusText;\n\t\t\t\tif ( status || !statusText ) {\n\t\t\t\t\tstatusText = \"error\";\n\t\t\t\t\tif ( status < 0 ) {\n\t\t\t\t\t\tstatus = 0;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Set data for the fake xhr object\n\t\t\tjqXHR.status = status;\n\t\t\tjqXHR.statusText = ( nativeStatusText || statusText ) + \"\";\n\n\t\t\t// Success/Error\n\t\t\tif ( isSuccess ) {\n\t\t\t\tdeferred.resolveWith( callbackContext, [ success, statusText, jqXHR ] );\n\t\t\t} else {\n\t\t\t\tdeferred.rejectWith( callbackContext, [ jqXHR, statusText, error ] );\n\t\t\t}\n\n\t\t\t// Status-dependent callbacks\n\t\t\tjqXHR.statusCode( statusCode );\n\t\t\tstatusCode = undefined;\n\n\t\t\tif ( fireGlobals ) {\n\t\t\t\tglobalEventContext.trigger( isSuccess ? \"ajaxSuccess\" : \"ajaxError\",\n\t\t\t\t\t[ jqXHR, s, isSuccess ? success : error ] );\n\t\t\t}\n\n\t\t\t// Complete\n\t\t\tcompleteDeferred.fireWith( callbackContext, [ jqXHR, statusText ] );\n\n\t\t\tif ( fireGlobals ) {\n\t\t\t\tglobalEventContext.trigger( \"ajaxComplete\", [ jqXHR, s ] );\n\n\t\t\t\t// Handle the global AJAX counter\n\t\t\t\tif ( !( --jQuery.active ) ) {\n\t\t\t\t\tjQuery.event.trigger( \"ajaxStop\" );\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn jqXHR;\n\t},\n\n\tgetJSON: function( url, data, callback ) {\n\t\treturn jQuery.get( url, data, callback, \"json\" );\n\t},\n\n\tgetScript: function( url, callback ) {\n\t\treturn jQuery.get( url, undefined, callback, \"script\" );\n\t}\n} );\n\njQuery.each( [ \"get\", \"post\" ], function( i, method ) {\n\tjQuery[ method ] = function( url, data, callback, type ) {\n\n\t\t// Shift arguments if data argument was omitted\n\t\tif ( jQuery.isFunction( data ) ) {\n\t\t\ttype = type || callback;\n\t\t\tcallback = data;\n\t\t\tdata = undefined;\n\t\t}\n\n\t\t// The url can be an options object (which then must have .url)\n\t\treturn jQuery.ajax( jQuery.extend( {\n\t\t\turl: url,\n\t\t\ttype: method,\n\t\t\tdataType: type,\n\t\t\tdata: data,\n\t\t\tsuccess: callback\n\t\t}, jQuery.isPlainObject( url ) && url ) );\n\t};\n} );\n\n\njQuery._evalUrl = function( url ) {\n\treturn jQuery.ajax( {\n\t\turl: url,\n\n\t\t// Make this explicit, since user can override this through ajaxSetup (#11264)\n\t\ttype: \"GET\",\n\t\tdataType: \"script\",\n\t\tcache: true,\n\t\tasync: false,\n\t\tglobal: false,\n\t\t\"throws\": true\n\t} );\n};\n\n\njQuery.fn.extend( {\n\twrapAll: function( html ) {\n\t\tvar wrap;\n\n\t\tif ( this[ 0 ] ) {\n\t\t\tif ( jQuery.isFunction( html ) ) {\n\t\t\t\thtml = html.call( this[ 0 ] );\n\t\t\t}\n\n\t\t\t// The elements to wrap the target around\n\t\t\twrap = jQuery( html, this[ 0 ].ownerDocument ).eq( 0 ).clone( true );\n\n\t\t\tif ( this[ 0 ].parentNode ) {\n\t\t\t\twrap.insertBefore( this[ 0 ] );\n\t\t\t}\n\n\t\t\twrap.map( function() {\n\t\t\t\tvar elem = this;\n\n\t\t\t\twhile ( elem.firstElementChild ) {\n\t\t\t\t\telem = elem.firstElementChild;\n\t\t\t\t}\n\n\t\t\t\treturn elem;\n\t\t\t} ).append( this );\n\t\t}\n\n\t\treturn this;\n\t},\n\n\twrapInner: function( html ) {\n\t\tif ( jQuery.isFunction( html ) ) {\n\t\t\treturn this.each( function( i ) {\n\t\t\t\tjQuery( this ).wrapInner( html.call( this, i ) );\n\t\t\t} );\n\t\t}\n\n\t\treturn this.each( function() {\n\t\t\tvar self = jQuery( this ),\n\t\t\t\tcontents = self.contents();\n\n\t\t\tif ( contents.length ) {\n\t\t\t\tcontents.wrapAll( html );\n\n\t\t\t} else {\n\t\t\t\tself.append( html );\n\t\t\t}\n\t\t} );\n\t},\n\n\twrap: function( html ) {\n\t\tvar isFunction = jQuery.isFunction( html );\n\n\t\treturn this.each( function( i ) {\n\t\t\tjQuery( this ).wrapAll( isFunction ? html.call( this, i ) : html );\n\t\t} );\n\t},\n\n\tunwrap: function( selector ) {\n\t\tthis.parent( selector ).not( \"body\" ).each( function() {\n\t\t\tjQuery( this ).replaceWith( this.childNodes );\n\t\t} );\n\t\treturn this;\n\t}\n} );\n\n\njQuery.expr.pseudos.hidden = function( elem ) {\n\treturn !jQuery.expr.pseudos.visible( elem );\n};\njQuery.expr.pseudos.visible = function( elem ) {\n\treturn !!( elem.offsetWidth || elem.offsetHeight || elem.getClientRects().length );\n};\n\n\n\n\njQuery.ajaxSettings.xhr = function() {\n\ttry {\n\t\treturn new window.XMLHttpRequest();\n\t} catch ( e ) {}\n};\n\nvar xhrSuccessStatus = {\n\n\t\t// File protocol always yields status code 0, assume 200\n\t\t0: 200,\n\n\t\t// Support: IE <=9 only\n\t\t// #1450: sometimes IE returns 1223 when it should be 204\n\t\t1223: 204\n\t},\n\txhrSupported = jQuery.ajaxSettings.xhr();\n\nsupport.cors = !!xhrSupported && ( \"withCredentials\" in xhrSupported );\nsupport.ajax = xhrSupported = !!xhrSupported;\n\njQuery.ajaxTransport( function( options ) {\n\tvar callback, errorCallback;\n\n\t// Cross domain only allowed if supported through XMLHttpRequest\n\tif ( support.cors || xhrSupported && !options.crossDomain ) {\n\t\treturn {\n\t\t\tsend: function( headers, complete ) {\n\t\t\t\tvar i,\n\t\t\t\t\txhr = options.xhr();\n\n\t\t\t\txhr.open(\n\t\t\t\t\toptions.type,\n\t\t\t\t\toptions.url,\n\t\t\t\t\toptions.async,\n\t\t\t\t\toptions.username,\n\t\t\t\t\toptions.password\n\t\t\t\t);\n\n\t\t\t\t// Apply custom fields if provided\n\t\t\t\tif ( options.xhrFields ) {\n\t\t\t\t\tfor ( i in options.xhrFields ) {\n\t\t\t\t\t\txhr[ i ] = options.xhrFields[ i ];\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t// Override mime type if needed\n\t\t\t\tif ( options.mimeType && xhr.overrideMimeType ) {\n\t\t\t\t\txhr.overrideMimeType( options.mimeType );\n\t\t\t\t}\n\n\t\t\t\t// X-Requested-With header\n\t\t\t\t// For cross-domain requests, seeing as conditions for a preflight are\n\t\t\t\t// akin to a jigsaw puzzle, we simply never set it to be sure.\n\t\t\t\t// (it can always be set on a per-request basis or even using ajaxSetup)\n\t\t\t\t// For same-domain requests, won't change header if already provided.\n\t\t\t\tif ( !options.crossDomain && !headers[ \"X-Requested-With\" ] ) {\n\t\t\t\t\theaders[ \"X-Requested-With\" ] = \"XMLHttpRequest\";\n\t\t\t\t}\n\n\t\t\t\t// Set headers\n\t\t\t\tfor ( i in headers ) {\n\t\t\t\t\txhr.setRequestHeader( i, headers[ i ] );\n\t\t\t\t}\n\n\t\t\t\t// Callback\n\t\t\t\tcallback = function( type ) {\n\t\t\t\t\treturn function() {\n\t\t\t\t\t\tif ( callback ) {\n\t\t\t\t\t\t\tcallback = errorCallback = xhr.onload =\n\t\t\t\t\t\t\t\txhr.onerror = xhr.onabort = xhr.onreadystatechange = null;\n\n\t\t\t\t\t\t\tif ( type === \"abort\" ) {\n\t\t\t\t\t\t\t\txhr.abort();\n\t\t\t\t\t\t\t} else if ( type === \"error\" ) {\n\n\t\t\t\t\t\t\t\t// Support: IE <=9 only\n\t\t\t\t\t\t\t\t// On a manual native abort, IE9 throws\n\t\t\t\t\t\t\t\t// errors on any property access that is not readyState\n\t\t\t\t\t\t\t\tif ( typeof xhr.status !== \"number\" ) {\n\t\t\t\t\t\t\t\t\tcomplete( 0, \"error\" );\n\t\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t\tcomplete(\n\n\t\t\t\t\t\t\t\t\t\t// File: protocol always yields status 0; see #8605, #14207\n\t\t\t\t\t\t\t\t\t\txhr.status,\n\t\t\t\t\t\t\t\t\t\txhr.statusText\n\t\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\tcomplete(\n\t\t\t\t\t\t\t\t\txhrSuccessStatus[ xhr.status ] || xhr.status,\n\t\t\t\t\t\t\t\t\txhr.statusText,\n\n\t\t\t\t\t\t\t\t\t// Support: IE <=9 only\n\t\t\t\t\t\t\t\t\t// IE9 has no XHR2 but throws on binary (trac-11426)\n\t\t\t\t\t\t\t\t\t// For XHR2 non-text, let the caller handle it (gh-2498)\n\t\t\t\t\t\t\t\t\t( xhr.responseType || \"text\" ) !== \"text\"  ||\n\t\t\t\t\t\t\t\t\ttypeof xhr.responseText !== \"string\" ?\n\t\t\t\t\t\t\t\t\t\t{ binary: xhr.response } :\n\t\t\t\t\t\t\t\t\t\t{ text: xhr.responseText },\n\t\t\t\t\t\t\t\t\txhr.getAllResponseHeaders()\n\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t};\n\t\t\t\t};\n\n\t\t\t\t// Listen to events\n\t\t\t\txhr.onload = callback();\n\t\t\t\terrorCallback = xhr.onerror = callback( \"error\" );\n\n\t\t\t\t// Support: IE 9 only\n\t\t\t\t// Use onreadystatechange to replace onabort\n\t\t\t\t// to handle uncaught aborts\n\t\t\t\tif ( xhr.onabort !== undefined ) {\n\t\t\t\t\txhr.onabort = errorCallback;\n\t\t\t\t} else {\n\t\t\t\t\txhr.onreadystatechange = function() {\n\n\t\t\t\t\t\t// Check readyState before timeout as it changes\n\t\t\t\t\t\tif ( xhr.readyState === 4 ) {\n\n\t\t\t\t\t\t\t// Allow onerror to be called first,\n\t\t\t\t\t\t\t// but that will not handle a native abort\n\t\t\t\t\t\t\t// Also, save errorCallback to a variable\n\t\t\t\t\t\t\t// as xhr.onerror cannot be accessed\n\t\t\t\t\t\t\twindow.setTimeout( function() {\n\t\t\t\t\t\t\t\tif ( callback ) {\n\t\t\t\t\t\t\t\t\terrorCallback();\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t} );\n\t\t\t\t\t\t}\n\t\t\t\t\t};\n\t\t\t\t}\n\n\t\t\t\t// Create the abort callback\n\t\t\t\tcallback = callback( \"abort\" );\n\n\t\t\t\ttry {\n\n\t\t\t\t\t// Do send the request (this may raise an exception)\n\t\t\t\t\txhr.send( options.hasContent && options.data || null );\n\t\t\t\t} catch ( e ) {\n\n\t\t\t\t\t// #14683: Only rethrow if this hasn't been notified as an error yet\n\t\t\t\t\tif ( callback ) {\n\t\t\t\t\t\tthrow e;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t},\n\n\t\t\tabort: function() {\n\t\t\t\tif ( callback ) {\n\t\t\t\t\tcallback();\n\t\t\t\t}\n\t\t\t}\n\t\t};\n\t}\n} );\n\n\n\n\n// Prevent auto-execution of scripts when no explicit dataType was provided (See gh-2432)\njQuery.ajaxPrefilter( function( s ) {\n\tif ( s.crossDomain ) {\n\t\ts.contents.script = false;\n\t}\n} );\n\n// Install script dataType\njQuery.ajaxSetup( {\n\taccepts: {\n\t\tscript: \"text/javascript, application/javascript, \" +\n\t\t\t\"application/ecmascript, application/x-ecmascript\"\n\t},\n\tcontents: {\n\t\tscript: /\\b(?:java|ecma)script\\b/\n\t},\n\tconverters: {\n\t\t\"text script\": function( text ) {\n\t\t\tjQuery.globalEval( text );\n\t\t\treturn text;\n\t\t}\n\t}\n} );\n\n// Handle cache's special case and crossDomain\njQuery.ajaxPrefilter( \"script\", function( s ) {\n\tif ( s.cache === undefined ) {\n\t\ts.cache = false;\n\t}\n\tif ( s.crossDomain ) {\n\t\ts.type = \"GET\";\n\t}\n} );\n\n// Bind script tag hack transport\njQuery.ajaxTransport( \"script\", function( s ) {\n\n\t// This transport only deals with cross domain requests\n\tif ( s.crossDomain ) {\n\t\tvar script, callback;\n\t\treturn {\n\t\t\tsend: function( _, complete ) {\n\t\t\t\tscript = jQuery( \"<script>\" ).prop( {\n\t\t\t\t\tcharset: s.scriptCharset,\n\t\t\t\t\tsrc: s.url\n\t\t\t\t} ).on(\n\t\t\t\t\t\"load error\",\n\t\t\t\t\tcallback = function( evt ) {\n\t\t\t\t\t\tscript.remove();\n\t\t\t\t\t\tcallback = null;\n\t\t\t\t\t\tif ( evt ) {\n\t\t\t\t\t\t\tcomplete( evt.type === \"error\" ? 404 : 200, evt.type );\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t);\n\n\t\t\t\t// Use native DOM manipulation to avoid our domManip AJAX trickery\n\t\t\t\tdocument.head.appendChild( script[ 0 ] );\n\t\t\t},\n\t\t\tabort: function() {\n\t\t\t\tif ( callback ) {\n\t\t\t\t\tcallback();\n\t\t\t\t}\n\t\t\t}\n\t\t};\n\t}\n} );\n\n\n\n\nvar oldCallbacks = [],\n\trjsonp = /(=)\\?(?=&|$)|\\?\\?/;\n\n// Default jsonp settings\njQuery.ajaxSetup( {\n\tjsonp: \"callback\",\n\tjsonpCallback: function() {\n\t\tvar callback = oldCallbacks.pop() || ( jQuery.expando + \"_\" + ( nonce++ ) );\n\t\tthis[ callback ] = true;\n\t\treturn callback;\n\t}\n} );\n\n// Detect, normalize options and install callbacks for jsonp requests\njQuery.ajaxPrefilter( \"json jsonp\", function( s, originalSettings, jqXHR ) {\n\n\tvar callbackName, overwritten, responseContainer,\n\t\tjsonProp = s.jsonp !== false && ( rjsonp.test( s.url ) ?\n\t\t\t\"url\" :\n\t\t\ttypeof s.data === \"string\" &&\n\t\t\t\t( s.contentType || \"\" )\n\t\t\t\t\t.indexOf( \"application/x-www-form-urlencoded\" ) === 0 &&\n\t\t\t\trjsonp.test( s.data ) && \"data\"\n\t\t);\n\n\t// Handle iff the expected data type is \"jsonp\" or we have a parameter to set\n\tif ( jsonProp || s.dataTypes[ 0 ] === \"jsonp\" ) {\n\n\t\t// Get callback name, remembering preexisting value associated with it\n\t\tcallbackName = s.jsonpCallback = jQuery.isFunction( s.jsonpCallback ) ?\n\t\t\ts.jsonpCallback() :\n\t\t\ts.jsonpCallback;\n\n\t\t// Insert callback into url or form data\n\t\tif ( jsonProp ) {\n\t\t\ts[ jsonProp ] = s[ jsonProp ].replace( rjsonp, \"$1\" + callbackName );\n\t\t} else if ( s.jsonp !== false ) {\n\t\t\ts.url += ( rquery.test( s.url ) ? \"&\" : \"?\" ) + s.jsonp + \"=\" + callbackName;\n\t\t}\n\n\t\t// Use data converter to retrieve json after script execution\n\t\ts.converters[ \"script json\" ] = function() {\n\t\t\tif ( !responseContainer ) {\n\t\t\t\tjQuery.error( callbackName + \" was not called\" );\n\t\t\t}\n\t\t\treturn responseContainer[ 0 ];\n\t\t};\n\n\t\t// Force json dataType\n\t\ts.dataTypes[ 0 ] = \"json\";\n\n\t\t// Install callback\n\t\toverwritten = window[ callbackName ];\n\t\twindow[ callbackName ] = function() {\n\t\t\tresponseContainer = arguments;\n\t\t};\n\n\t\t// Clean-up function (fires after converters)\n\t\tjqXHR.always( function() {\n\n\t\t\t// If previous value didn't exist - remove it\n\t\t\tif ( overwritten === undefined ) {\n\t\t\t\tjQuery( window ).removeProp( callbackName );\n\n\t\t\t// Otherwise restore preexisting value\n\t\t\t} else {\n\t\t\t\twindow[ callbackName ] = overwritten;\n\t\t\t}\n\n\t\t\t// Save back as free\n\t\t\tif ( s[ callbackName ] ) {\n\n\t\t\t\t// Make sure that re-using the options doesn't screw things around\n\t\t\t\ts.jsonpCallback = originalSettings.jsonpCallback;\n\n\t\t\t\t// Save the callback name for future use\n\t\t\t\toldCallbacks.push( callbackName );\n\t\t\t}\n\n\t\t\t// Call if it was a function and we have a response\n\t\t\tif ( responseContainer && jQuery.isFunction( overwritten ) ) {\n\t\t\t\toverwritten( responseContainer[ 0 ] );\n\t\t\t}\n\n\t\t\tresponseContainer = overwritten = undefined;\n\t\t} );\n\n\t\t// Delegate to script\n\t\treturn \"script\";\n\t}\n} );\n\n\n\n\n// Support: Safari 8 only\n// In Safari 8 documents created via document.implementation.createHTMLDocument\n// collapse sibling forms: the second one becomes a child of the first one.\n// Because of that, this security measure has to be disabled in Safari 8.\n// https://bugs.webkit.org/show_bug.cgi?id=137337\nsupport.createHTMLDocument = ( function() {\n\tvar body = document.implementation.createHTMLDocument( \"\" ).body;\n\tbody.innerHTML = \"<form></form><form></form>\";\n\treturn body.childNodes.length === 2;\n} )();\n\n\n// Argument \"data\" should be string of html\n// context (optional): If specified, the fragment will be created in this context,\n// defaults to document\n// keepScripts (optional): If true, will include scripts passed in the html string\njQuery.parseHTML = function( data, context, keepScripts ) {\n\tif ( typeof data !== \"string\" ) {\n\t\treturn [];\n\t}\n\tif ( typeof context === \"boolean\" ) {\n\t\tkeepScripts = context;\n\t\tcontext = false;\n\t}\n\n\tvar base, parsed, scripts;\n\n\tif ( !context ) {\n\n\t\t// Stop scripts or inline event handlers from being executed immediately\n\t\t// by using document.implementation\n\t\tif ( support.createHTMLDocument ) {\n\t\t\tcontext = document.implementation.createHTMLDocument( \"\" );\n\n\t\t\t// Set the base href for the created document\n\t\t\t// so any parsed elements with URLs\n\t\t\t// are based on the document's URL (gh-2965)\n\t\t\tbase = context.createElement( \"base\" );\n\t\t\tbase.href = document.location.href;\n\t\t\tcontext.head.appendChild( base );\n\t\t} else {\n\t\t\tcontext = document;\n\t\t}\n\t}\n\n\tparsed = rsingleTag.exec( data );\n\tscripts = !keepScripts && [];\n\n\t// Single tag\n\tif ( parsed ) {\n\t\treturn [ context.createElement( parsed[ 1 ] ) ];\n\t}\n\n\tparsed = buildFragment( [ data ], context, scripts );\n\n\tif ( scripts && scripts.length ) {\n\t\tjQuery( scripts ).remove();\n\t}\n\n\treturn jQuery.merge( [], parsed.childNodes );\n};\n\n\n/**\n * Load a url into a page\n */\njQuery.fn.load = function( url, params, callback ) {\n\tvar selector, type, response,\n\t\tself = this,\n\t\toff = url.indexOf( \" \" );\n\n\tif ( off > -1 ) {\n\t\tselector = stripAndCollapse( url.slice( off ) );\n\t\turl = url.slice( 0, off );\n\t}\n\n\t// If it's a function\n\tif ( jQuery.isFunction( params ) ) {\n\n\t\t// We assume that it's the callback\n\t\tcallback = params;\n\t\tparams = undefined;\n\n\t// Otherwise, build a param string\n\t} else if ( params && typeof params === \"object\" ) {\n\t\ttype = \"POST\";\n\t}\n\n\t// If we have elements to modify, make the request\n\tif ( self.length > 0 ) {\n\t\tjQuery.ajax( {\n\t\t\turl: url,\n\n\t\t\t// If \"type\" variable is undefined, then \"GET\" method will be used.\n\t\t\t// Make value of this field explicit since\n\t\t\t// user can override it through ajaxSetup method\n\t\t\ttype: type || \"GET\",\n\t\t\tdataType: \"html\",\n\t\t\tdata: params\n\t\t} ).done( function( responseText ) {\n\n\t\t\t// Save response for use in complete callback\n\t\t\tresponse = arguments;\n\n\t\t\tself.html( selector ?\n\n\t\t\t\t// If a selector was specified, locate the right elements in a dummy div\n\t\t\t\t// Exclude scripts to avoid IE 'Permission Denied' errors\n\t\t\t\tjQuery( \"<div>\" ).append( jQuery.parseHTML( responseText ) ).find( selector ) :\n\n\t\t\t\t// Otherwise use the full result\n\t\t\t\tresponseText );\n\n\t\t// If the request succeeds, this function gets \"data\", \"status\", \"jqXHR\"\n\t\t// but they are ignored because response was set above.\n\t\t// If it fails, this function gets \"jqXHR\", \"status\", \"error\"\n\t\t} ).always( callback && function( jqXHR, status ) {\n\t\t\tself.each( function() {\n\t\t\t\tcallback.apply( this, response || [ jqXHR.responseText, status, jqXHR ] );\n\t\t\t} );\n\t\t} );\n\t}\n\n\treturn this;\n};\n\n\n\n\n// Attach a bunch of functions for handling common AJAX events\njQuery.each( [\n\t\"ajaxStart\",\n\t\"ajaxStop\",\n\t\"ajaxComplete\",\n\t\"ajaxError\",\n\t\"ajaxSuccess\",\n\t\"ajaxSend\"\n], function( i, type ) {\n\tjQuery.fn[ type ] = function( fn ) {\n\t\treturn this.on( type, fn );\n\t};\n} );\n\n\n\n\njQuery.expr.pseudos.animated = function( elem ) {\n\treturn jQuery.grep( jQuery.timers, function( fn ) {\n\t\treturn elem === fn.elem;\n\t} ).length;\n};\n\n\n\n\njQuery.offset = {\n\tsetOffset: function( elem, options, i ) {\n\t\tvar curPosition, curLeft, curCSSTop, curTop, curOffset, curCSSLeft, calculatePosition,\n\t\t\tposition = jQuery.css( elem, \"position\" ),\n\t\t\tcurElem = jQuery( elem ),\n\t\t\tprops = {};\n\n\t\t// Set position first, in-case top/left are set even on static elem\n\t\tif ( position === \"static\" ) {\n\t\t\telem.style.position = \"relative\";\n\t\t}\n\n\t\tcurOffset = curElem.offset();\n\t\tcurCSSTop = jQuery.css( elem, \"top\" );\n\t\tcurCSSLeft = jQuery.css( elem, \"left\" );\n\t\tcalculatePosition = ( position === \"absolute\" || position === \"fixed\" ) &&\n\t\t\t( curCSSTop + curCSSLeft ).indexOf( \"auto\" ) > -1;\n\n\t\t// Need to be able to calculate position if either\n\t\t// top or left is auto and position is either absolute or fixed\n\t\tif ( calculatePosition ) {\n\t\t\tcurPosition = curElem.position();\n\t\t\tcurTop = curPosition.top;\n\t\t\tcurLeft = curPosition.left;\n\n\t\t} else {\n\t\t\tcurTop = parseFloat( curCSSTop ) || 0;\n\t\t\tcurLeft = parseFloat( curCSSLeft ) || 0;\n\t\t}\n\n\t\tif ( jQuery.isFunction( options ) ) {\n\n\t\t\t// Use jQuery.extend here to allow modification of coordinates argument (gh-1848)\n\t\t\toptions = options.call( elem, i, jQuery.extend( {}, curOffset ) );\n\t\t}\n\n\t\tif ( options.top != null ) {\n\t\t\tprops.top = ( options.top - curOffset.top ) + curTop;\n\t\t}\n\t\tif ( options.left != null ) {\n\t\t\tprops.left = ( options.left - curOffset.left ) + curLeft;\n\t\t}\n\n\t\tif ( \"using\" in options ) {\n\t\t\toptions.using.call( elem, props );\n\n\t\t} else {\n\t\t\tcurElem.css( props );\n\t\t}\n\t}\n};\n\njQuery.fn.extend( {\n\toffset: function( options ) {\n\n\t\t// Preserve chaining for setter\n\t\tif ( arguments.length ) {\n\t\t\treturn options === undefined ?\n\t\t\t\tthis :\n\t\t\t\tthis.each( function( i ) {\n\t\t\t\t\tjQuery.offset.setOffset( this, options, i );\n\t\t\t\t} );\n\t\t}\n\n\t\tvar doc, docElem, rect, win,\n\t\t\telem = this[ 0 ];\n\n\t\tif ( !elem ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Return zeros for disconnected and hidden (display: none) elements (gh-2310)\n\t\t// Support: IE <=11 only\n\t\t// Running getBoundingClientRect on a\n\t\t// disconnected node in IE throws an error\n\t\tif ( !elem.getClientRects().length ) {\n\t\t\treturn { top: 0, left: 0 };\n\t\t}\n\n\t\trect = elem.getBoundingClientRect();\n\n\t\tdoc = elem.ownerDocument;\n\t\tdocElem = doc.documentElement;\n\t\twin = doc.defaultView;\n\n\t\treturn {\n\t\t\ttop: rect.top + win.pageYOffset - docElem.clientTop,\n\t\t\tleft: rect.left + win.pageXOffset - docElem.clientLeft\n\t\t};\n\t},\n\n\tposition: function() {\n\t\tif ( !this[ 0 ] ) {\n\t\t\treturn;\n\t\t}\n\n\t\tvar offsetParent, offset,\n\t\t\telem = this[ 0 ],\n\t\t\tparentOffset = { top: 0, left: 0 };\n\n\t\t// Fixed elements are offset from window (parentOffset = {top:0, left: 0},\n\t\t// because it is its only offset parent\n\t\tif ( jQuery.css( elem, \"position\" ) === \"fixed\" ) {\n\n\t\t\t// Assume getBoundingClientRect is there when computed position is fixed\n\t\t\toffset = elem.getBoundingClientRect();\n\n\t\t} else {\n\n\t\t\t// Get *real* offsetParent\n\t\t\toffsetParent = this.offsetParent();\n\n\t\t\t// Get correct offsets\n\t\t\toffset = this.offset();\n\t\t\tif ( !nodeName( offsetParent[ 0 ], \"html\" ) ) {\n\t\t\t\tparentOffset = offsetParent.offset();\n\t\t\t}\n\n\t\t\t// Add offsetParent borders\n\t\t\tparentOffset = {\n\t\t\t\ttop: parentOffset.top + jQuery.css( offsetParent[ 0 ], \"borderTopWidth\", true ),\n\t\t\t\tleft: parentOffset.left + jQuery.css( offsetParent[ 0 ], \"borderLeftWidth\", true )\n\t\t\t};\n\t\t}\n\n\t\t// Subtract parent offsets and element margins\n\t\treturn {\n\t\t\ttop: offset.top - parentOffset.top - jQuery.css( elem, \"marginTop\", true ),\n\t\t\tleft: offset.left - parentOffset.left - jQuery.css( elem, \"marginLeft\", true )\n\t\t};\n\t},\n\n\t// This method will return documentElement in the following cases:\n\t// 1) For the element inside the iframe without offsetParent, this method will return\n\t//    documentElement of the parent window\n\t// 2) For the hidden or detached element\n\t// 3) For body or html element, i.e. in case of the html node - it will return itself\n\t//\n\t// but those exceptions were never presented as a real life use-cases\n\t// and might be considered as more preferable results.\n\t//\n\t// This logic, however, is not guaranteed and can change at any point in the future\n\toffsetParent: function() {\n\t\treturn this.map( function() {\n\t\t\tvar offsetParent = this.offsetParent;\n\n\t\t\twhile ( offsetParent && jQuery.css( offsetParent, \"position\" ) === \"static\" ) {\n\t\t\t\toffsetParent = offsetParent.offsetParent;\n\t\t\t}\n\n\t\t\treturn offsetParent || documentElement;\n\t\t} );\n\t}\n} );\n\n// Create scrollLeft and scrollTop methods\njQuery.each( { scrollLeft: \"pageXOffset\", scrollTop: \"pageYOffset\" }, function( method, prop ) {\n\tvar top = \"pageYOffset\" === prop;\n\n\tjQuery.fn[ method ] = function( val ) {\n\t\treturn access( this, function( elem, method, val ) {\n\n\t\t\t// Coalesce documents and windows\n\t\t\tvar win;\n\t\t\tif ( jQuery.isWindow( elem ) ) {\n\t\t\t\twin = elem;\n\t\t\t} else if ( elem.nodeType === 9 ) {\n\t\t\t\twin = elem.defaultView;\n\t\t\t}\n\n\t\t\tif ( val === undefined ) {\n\t\t\t\treturn win ? win[ prop ] : elem[ method ];\n\t\t\t}\n\n\t\t\tif ( win ) {\n\t\t\t\twin.scrollTo(\n\t\t\t\t\t!top ? val : win.pageXOffset,\n\t\t\t\t\ttop ? val : win.pageYOffset\n\t\t\t\t);\n\n\t\t\t} else {\n\t\t\t\telem[ method ] = val;\n\t\t\t}\n\t\t}, method, val, arguments.length );\n\t};\n} );\n\n// Support: Safari <=7 - 9.1, Chrome <=37 - 49\n// Add the top/left cssHooks using jQuery.fn.position\n// Webkit bug: https://bugs.webkit.org/show_bug.cgi?id=29084\n// Blink bug: https://bugs.chromium.org/p/chromium/issues/detail?id=589347\n// getComputedStyle returns percent when specified for top/left/bottom/right;\n// rather than make the css module depend on the offset module, just check for it here\njQuery.each( [ \"top\", \"left\" ], function( i, prop ) {\n\tjQuery.cssHooks[ prop ] = addGetHookIf( support.pixelPosition,\n\t\tfunction( elem, computed ) {\n\t\t\tif ( computed ) {\n\t\t\t\tcomputed = curCSS( elem, prop );\n\n\t\t\t\t// If curCSS returns percentage, fallback to offset\n\t\t\t\treturn rnumnonpx.test( computed ) ?\n\t\t\t\t\tjQuery( elem ).position()[ prop ] + \"px\" :\n\t\t\t\t\tcomputed;\n\t\t\t}\n\t\t}\n\t);\n} );\n\n\n// Create innerHeight, innerWidth, height, width, outerHeight and outerWidth methods\njQuery.each( { Height: \"height\", Width: \"width\" }, function( name, type ) {\n\tjQuery.each( { padding: \"inner\" + name, content: type, \"\": \"outer\" + name },\n\t\tfunction( defaultExtra, funcName ) {\n\n\t\t// Margin is only for outerHeight, outerWidth\n\t\tjQuery.fn[ funcName ] = function( margin, value ) {\n\t\t\tvar chainable = arguments.length && ( defaultExtra || typeof margin !== \"boolean\" ),\n\t\t\t\textra = defaultExtra || ( margin === true || value === true ? \"margin\" : \"border\" );\n\n\t\t\treturn access( this, function( elem, type, value ) {\n\t\t\t\tvar doc;\n\n\t\t\t\tif ( jQuery.isWindow( elem ) ) {\n\n\t\t\t\t\t// $( window ).outerWidth/Height return w/h including scrollbars (gh-1729)\n\t\t\t\t\treturn funcName.indexOf( \"outer\" ) === 0 ?\n\t\t\t\t\t\telem[ \"inner\" + name ] :\n\t\t\t\t\t\telem.document.documentElement[ \"client\" + name ];\n\t\t\t\t}\n\n\t\t\t\t// Get document width or height\n\t\t\t\tif ( elem.nodeType === 9 ) {\n\t\t\t\t\tdoc = elem.documentElement;\n\n\t\t\t\t\t// Either scroll[Width/Height] or offset[Width/Height] or client[Width/Height],\n\t\t\t\t\t// whichever is greatest\n\t\t\t\t\treturn Math.max(\n\t\t\t\t\t\telem.body[ \"scroll\" + name ], doc[ \"scroll\" + name ],\n\t\t\t\t\t\telem.body[ \"offset\" + name ], doc[ \"offset\" + name ],\n\t\t\t\t\t\tdoc[ \"client\" + name ]\n\t\t\t\t\t);\n\t\t\t\t}\n\n\t\t\t\treturn value === undefined ?\n\n\t\t\t\t\t// Get width or height on the element, requesting but not forcing parseFloat\n\t\t\t\t\tjQuery.css( elem, type, extra ) :\n\n\t\t\t\t\t// Set width or height on the element\n\t\t\t\t\tjQuery.style( elem, type, value, extra );\n\t\t\t}, type, chainable ? margin : undefined, chainable );\n\t\t};\n\t} );\n} );\n\n\njQuery.fn.extend( {\n\n\tbind: function( types, data, fn ) {\n\t\treturn this.on( types, null, data, fn );\n\t},\n\tunbind: function( types, fn ) {\n\t\treturn this.off( types, null, fn );\n\t},\n\n\tdelegate: function( selector, types, data, fn ) {\n\t\treturn this.on( types, selector, data, fn );\n\t},\n\tundelegate: function( selector, types, fn ) {\n\n\t\t// ( namespace ) or ( selector, types [, fn] )\n\t\treturn arguments.length === 1 ?\n\t\t\tthis.off( selector, \"**\" ) :\n\t\t\tthis.off( types, selector || \"**\", fn );\n\t}\n} );\n\njQuery.holdReady = function( hold ) {\n\tif ( hold ) {\n\t\tjQuery.readyWait++;\n\t} else {\n\t\tjQuery.ready( true );\n\t}\n};\njQuery.isArray = Array.isArray;\njQuery.parseJSON = JSON.parse;\njQuery.nodeName = nodeName;\n\n\n\n\n// Register as a named AMD module, since jQuery can be concatenated with other\n// files that may use define, but not via a proper concatenation script that\n// understands anonymous AMD modules. A named AMD is safest and most robust\n// way to register. Lowercase jquery is used because AMD module names are\n// derived from file names, and jQuery is normally delivered in a lowercase\n// file name. Do this after creating the global so that if an AMD module wants\n// to call noConflict to hide this version of jQuery, it will work.\n\n// Note that for maximum portability, libraries that are not jQuery should\n// declare themselves as anonymous modules, and avoid setting a global if an\n// AMD loader is present. jQuery is a special case. For more information, see\n// https://github.com/jrburke/requirejs/wiki/Updating-existing-libraries#wiki-anon\n\nif ( typeof define === \"function\" && define.amd ) {\n\tdefine( \"jquery\", [], function() {\n\t\treturn jQuery;\n\t} );\n}\n\n\n\n\nvar\n\n\t// Map over jQuery in case of overwrite\n\t_jQuery = window.jQuery,\n\n\t// Map over the $ in case of overwrite\n\t_$ = window.$;\n\njQuery.noConflict = function( deep ) {\n\tif ( window.$ === jQuery ) {\n\t\twindow.$ = _$;\n\t}\n\n\tif ( deep && window.jQuery === jQuery ) {\n\t\twindow.jQuery = _jQuery;\n\t}\n\n\treturn jQuery;\n};\n\n// Expose jQuery and $ identifiers, even in AMD\n// (#7102#comment:10, https://github.com/jquery/jquery/pull/557)\n// and CommonJS for browser emulators (#13566)\nif ( !noGlobal ) {\n\twindow.jQuery = window.$ = jQuery;\n}\n\n\n\n\nreturn jQuery;\n} );\n\n},{}],2:[function(require,module,exports){\n\"use strict\";\n\nmodule.exports = tableify;\n\nfunction tableify(obj, columns, parents) {\n    var buf = [];\n    var type = typeof obj;\n    var cols;\n\n    parents = parents || [];\n\n    if (type !== 'object' || obj == null || obj == undefined) {\n    }\n    else if (~parents.indexOf(obj)) {\n        return \"[Circular]\";\n    }\n    else {\n        parents.push(obj);\n    }\n\n    if (Array.isArray(obj)) {\n        if (Array.isArray(obj[0]) && obj.every(Array.isArray)) {\n            buf.push('<table>','<tbody>');\n            cols = [];\n            \n            // 2D array is an array of rows\n            obj.forEach(function (row, ix) {\n                cols.push(ix);\n\n                buf.push('<tr>');\n                \n                row.forEach(function (val) {\n                    buf.push('<td' + getClass(val) + '>', tableify(val, cols, parents), '</td>')\n                });\n                \n                buf.push('</tr>');\n            });\n            \n            buf.push('</tbody>','</table>');\n        }\n        else if (typeof obj[0] === 'object') {\n            buf.push('<table>','<thead>','<tr>');\n\n            //loop through every object and get unique keys\n            var keys = {};\n            obj.forEach(function (o) {\n                if (typeof o === 'object' && !Array.isArray(o)) {\n                    Object.keys(o).forEach(function (k) {\n                        keys[k] = true;\n                    });\n                }\n            });\n\n            cols = Object.keys(keys);\n\n            cols.forEach(function (key) {\n                buf.push('<th' + getClass(obj[0][key]) + '>', key, '</th>');\n            });\n\n            buf.push('</tr>', '</thead>', '<tbody>');\n\n            obj.forEach(function (record) {\n                buf.push('<tr>');\n                buf.push(tableify(record, cols, parents));\n                buf.push('</tr>');\n            });\n\n            buf.push('</tbody></table>');\n        }\n        else {\n            buf.push('<table>','<tbody>');\n            cols = [];\n\n            obj.forEach(function (val, ix) {\n                cols.push(ix);\n                buf.push('<tr>', '<td' + getClass(val) + '>', tableify(val, cols, parents), '</td>', '</tr>');\n            });\n\n            buf.push('</tbody>','</table>');\n        }\n\n    }\n    else if (obj && typeof obj === 'object' && !Array.isArray(obj) && !(obj instanceof Date)) {\n        if (!columns) {\n            buf.push('<table>');\n\n            Object.keys(obj).forEach(function (key) {\n                buf.push('<tr>', '<th' + getClass(obj[key]) + '>', key, '</th>', '<td' + getClass(obj[key]) + '>', tableify(obj[key], false, parents), '</td>', '</tr>');\n            });\n\n            buf.push('</table>');\n        }\n        else {\n            columns.forEach(function (key) {\n                if (typeof obj[key] === 'object' && !Array.isArray(obj[key])) {\n                    buf.push('<td' + getClass(obj[key]) + '>', tableify(obj[key], false, parents), '</td>');\n                }\n                else {\n                    buf.push('<td' + getClass(obj[key]) + '>', tableify(obj[key], columns, parents), '</td>');\n                }\n            });\n        }\n    }\n    else {\n        buf.push(obj);\n    }\n\n    if (type !== 'object' || obj == null || obj == undefined) {\n    }\n    else {\n        parents.pop(obj);\n    }\n\n    return buf.join('');\n}\n\nfunction getClass(obj) {\n    return ' class=\"'\n        + ((obj && obj.constructor && obj.constructor.name)\n            ? obj.constructor.name\n            : typeof obj || ''\n        ).toLowerCase()\n        + ((obj === null)\n            ? ' null'\n            : ''\n        )\n        + '\"'\n        ;\n}\n\n},{}],3:[function(require,module,exports){\n/*! tablesorter (FORK) - updated 07-11-2016 (v2.26.6)*/\n/* Includes widgets ( storage,uitheme,columns,filter,stickyHeaders,resizable,saveSort ) */\n(function(factory) {\n\tif (typeof define === 'function' && define.amd) {\n\t\tdefine(['jquery'], factory);\n\t} else if (typeof module === 'object' && typeof module.exports === 'object') {\n\t\tmodule.exports = factory(require('jquery'));\n\t} else {\n\t\tfactory(jQuery);\n\t}\n}(function($) {\n\n/*! TableSorter (FORK) v2.26.6 *//*\n* Client-side table sorting with ease!\n* @requires jQuery v1.2.6+\n*\n* Copyright (c) 2007 Christian Bach\n* fork maintained by Rob Garrison\n*\n* Examples and docs at: http://tablesorter.com\n* Dual licensed under the MIT and GPL licenses:\n* http://www.opensource.org/licenses/mit-license.php\n* http://www.gnu.org/licenses/gpl.html\n*\n* @type jQuery\n* @name tablesorter (FORK)\n* @cat Plugins/Tablesorter\n* @author Christian Bach - christian.bach@polyester.se\n* @contributor Rob Garrison - https://github.com/Mottie/tablesorter\n*/\n/*jshint browser:true, jquery:true, unused:false, expr: true */\n;( function( $ ) {\n\t'use strict';\n\tvar ts = $.tablesorter = {\n\n\t\tversion : '2.26.6',\n\n\t\tparsers : [],\n\t\twidgets : [],\n\t\tdefaults : {\n\n\t\t\t// *** appearance\n\t\t\ttheme            : 'default',  // adds tablesorter-{theme} to the table for styling\n\t\t\twidthFixed       : false,      // adds colgroup to fix widths of columns\n\t\t\tshowProcessing   : false,      // show an indeterminate timer icon in the header when the table is sorted or filtered.\n\n\t\t\theaderTemplate   : '{content}',// header layout template (HTML ok); {content} = innerHTML, {icon} = <i/> // class from cssIcon\n\t\t\tonRenderTemplate : null,       // function( index, template ){ return template; }, // template is a string\n\t\t\tonRenderHeader   : null,       // function( index ){}, // nothing to return\n\n\t\t\t// *** functionality\n\t\t\tcancelSelection  : true,       // prevent text selection in the header\n\t\t\ttabIndex         : true,       // add tabindex to header for keyboard accessibility\n\t\t\tdateFormat       : 'mmddyyyy', // other options: 'ddmmyyy' or 'yyyymmdd'\n\t\t\tsortMultiSortKey : 'shiftKey', // key used to select additional columns\n\t\t\tsortResetKey     : 'ctrlKey',  // key used to remove sorting on a column\n\t\t\tusNumberFormat   : true,       // false for German '1.234.567,89' or French '1 234 567,89'\n\t\t\tdelayInit        : false,      // if false, the parsed table contents will not update until the first sort\n\t\t\tserverSideSorting: false,      // if true, server-side sorting should be performed because client-side sorting will be disabled, but the ui and events will still be used.\n\t\t\tresort           : true,       // default setting to trigger a resort after an 'update', 'addRows', 'updateCell', etc has completed\n\n\t\t\t// *** sort options\n\t\t\theaders          : {},         // set sorter, string, empty, locked order, sortInitialOrder, filter, etc.\n\t\t\tignoreCase       : true,       // ignore case while sorting\n\t\t\tsortForce        : null,       // column(s) first sorted; always applied\n\t\t\tsortList         : [],         // Initial sort order; applied initially; updated when manually sorted\n\t\t\tsortAppend       : null,       // column(s) sorted last; always applied\n\t\t\tsortStable       : false,      // when sorting two rows with exactly the same content, the original sort order is maintained\n\n\t\t\tsortInitialOrder : 'asc',      // sort direction on first click\n\t\t\tsortLocaleCompare: false,      // replace equivalent character (accented characters)\n\t\t\tsortReset        : false,      // third click on the header will reset column to default - unsorted\n\t\t\tsortRestart      : false,      // restart sort to 'sortInitialOrder' when clicking on previously unsorted columns\n\n\t\t\temptyTo          : 'bottom',   // sort empty cell to bottom, top, none, zero, emptyMax, emptyMin\n\t\t\tstringTo         : 'max',      // sort strings in numerical column as max, min, top, bottom, zero\n\t\t\tduplicateSpan    : true,       // colspan cells in the tbody will have duplicated content in the cache for each spanned column\n\t\t\ttextExtraction   : 'basic',    // text extraction method/function - function( node, table, cellIndex ){}\n\t\t\ttextAttribute    : 'data-text',// data-attribute that contains alternate cell text (used in default textExtraction function)\n\t\t\ttextSorter       : null,       // choose overall or specific column sorter function( a, b, direction, table, columnIndex ) [alt: ts.sortText]\n\t\t\tnumberSorter     : null,       // choose overall numeric sorter function( a, b, direction, maxColumnValue )\n\n\t\t\t// *** widget options\n\t\t\tinitWidgets      : true,       // apply widgets on tablesorter initialization\n\t\t\twidgetClass      : 'widget-{name}', // table class name template to match to include a widget\n\t\t\twidgets          : [],         // method to add widgets, e.g. widgets: ['zebra']\n\t\t\twidgetOptions    : {\n\t\t\t\tzebra : [ 'even', 'odd' ]    // zebra widget alternating row class names\n\t\t\t},\n\n\t\t\t// *** callbacks\n\t\t\tinitialized      : null,       // function( table ){},\n\n\t\t\t// *** extra css class names\n\t\t\ttableClass       : '',\n\t\t\tcssAsc           : '',\n\t\t\tcssDesc          : '',\n\t\t\tcssNone          : '',\n\t\t\tcssHeader        : '',\n\t\t\tcssHeaderRow     : '',\n\t\t\tcssProcessing    : '', // processing icon applied to header during sort/filter\n\n\t\t\tcssChildRow      : 'tablesorter-childRow', // class name indiciating that a row is to be attached to its parent\n\t\t\tcssInfoBlock     : 'tablesorter-infoOnly', // don't sort tbody with this class name (only one class name allowed here!)\n\t\t\tcssNoSort        : 'tablesorter-noSort',      // class name added to element inside header; clicking on it won't cause a sort\n\t\t\tcssIgnoreRow     : 'tablesorter-ignoreRow',   // header row to ignore; cells within this row will not be added to c.$headers\n\n\t\t\tcssIcon          : 'tablesorter-icon', // if this class does not exist, the {icon} will not be added from the headerTemplate\n\t\t\tcssIconNone      : '', // class name added to the icon when there is no column sort\n\t\t\tcssIconAsc       : '', // class name added to the icon when the column has an ascending sort\n\t\t\tcssIconDesc      : '', // class name added to the icon when the column has a descending sort\n\n\t\t\t// *** events\n\t\t\tpointerClick     : 'click',\n\t\t\tpointerDown      : 'mousedown',\n\t\t\tpointerUp        : 'mouseup',\n\n\t\t\t// *** selectors\n\t\t\tselectorHeaders  : '> thead th, > thead td',\n\t\t\tselectorSort     : 'th, td',   // jQuery selector of content within selectorHeaders that is clickable to trigger a sort\n\t\t\tselectorRemove   : '.remove-me',\n\n\t\t\t// *** advanced\n\t\t\tdebug            : false,\n\n\t\t\t// *** Internal variables\n\t\t\theaderList: [],\n\t\t\tempties: {},\n\t\t\tstrings: {},\n\t\t\tparsers: []\n\n\t\t\t// removed: widgetZebra: { css: ['even', 'odd'] }\n\n\t\t},\n\n\t\t// internal css classes - these will ALWAYS be added to\n\t\t// the table and MUST only contain one class name - fixes #381\n\t\tcss : {\n\t\t\ttable      : 'tablesorter',\n\t\t\tcssHasChild: 'tablesorter-hasChildRow',\n\t\t\tchildRow   : 'tablesorter-childRow',\n\t\t\tcolgroup   : 'tablesorter-colgroup',\n\t\t\theader     : 'tablesorter-header',\n\t\t\theaderRow  : 'tablesorter-headerRow',\n\t\t\theaderIn   : 'tablesorter-header-inner',\n\t\t\ticon       : 'tablesorter-icon',\n\t\t\tprocessing : 'tablesorter-processing',\n\t\t\tsortAsc    : 'tablesorter-headerAsc',\n\t\t\tsortDesc   : 'tablesorter-headerDesc',\n\t\t\tsortNone   : 'tablesorter-headerUnSorted'\n\t\t},\n\n\t\t// labels applied to sortable headers for accessibility (aria) support\n\t\tlanguage : {\n\t\t\tsortAsc      : 'Ascending sort applied, ',\n\t\t\tsortDesc     : 'Descending sort applied, ',\n\t\t\tsortNone     : 'No sort applied, ',\n\t\t\tsortDisabled : 'sorting is disabled',\n\t\t\tnextAsc      : 'activate to apply an ascending sort',\n\t\t\tnextDesc     : 'activate to apply a descending sort',\n\t\t\tnextNone     : 'activate to remove the sort'\n\t\t},\n\n\t\tregex : {\n\t\t\ttemplateContent : /\\{content\\}/g,\n\t\t\ttemplateIcon    : /\\{icon\\}/g,\n\t\t\ttemplateName    : /\\{name\\}/i,\n\t\t\tspaces          : /\\s+/g,\n\t\t\tnonWord         : /\\W/g,\n\t\t\tformElements    : /(input|select|button|textarea)/i,\n\n\t\t\t// *** sort functions ***\n\t\t\t// regex used in natural sort\n\t\t\t// chunk/tokenize numbers & letters\n\t\t\tchunk  : /(^([+\\-]?(?:\\d*)(?:\\.\\d*)?(?:[eE][+\\-]?\\d+)?)?$|^0x[0-9a-f]+$|\\d+)/gi,\n\t\t\t// replace chunks @ ends\n\t\t\tchunks : /(^\\\\0|\\\\0$)/,\n\t\t\thex    : /^0x[0-9a-f]+$/i,\n\n\t\t\t// *** formatFloat ***\n\t\t\tcomma                : /,/g,\n\t\t\tdigitNonUS           : /[\\s|\\.]/g,\n\t\t\tdigitNegativeTest    : /^\\s*\\([.\\d]+\\)/,\n\t\t\tdigitNegativeReplace : /^\\s*\\(([.\\d]+)\\)/,\n\n\t\t\t// *** isDigit ***\n\t\t\tdigitTest    : /^[\\-+(]?\\d+[)]?$/,\n\t\t\tdigitReplace : /[,.'\"\\s]/g\n\n\t\t},\n\n\t\t// digit sort, text location\n\t\tstring : {\n\t\t\tmax      : 1,\n\t\t\tmin      : -1,\n\t\t\temptymin : 1,\n\t\t\temptymax : -1,\n\t\t\tzero     : 0,\n\t\t\tnone     : 0,\n\t\t\t'null'   : 0,\n\t\t\ttop      : true,\n\t\t\tbottom   : false\n\t\t},\n\n\t\tkeyCodes : {\n\t\t\tenter : 13\n\t\t},\n\n\t\t// placeholder date parser data (globalize)\n\t\tdates : {},\n\n\t\t// These methods can be applied on table.config instance\n\t\tinstanceMethods : {},\n\n\t\t/*\n\t\t▄█████ ██████ ██████ ██  ██ █████▄\n\t\t▀█▄    ██▄▄     ██   ██  ██ ██▄▄██\n\t\t   ▀█▄ ██▀▀     ██   ██  ██ ██▀▀▀\n\t\t█████▀ ██████   ██   ▀████▀ ██\n\t\t*/\n\n\t\tsetup : function( table, c ) {\n\t\t\t// if no thead or tbody, or tablesorter is already present, quit\n\t\t\tif ( !table || !table.tHead || table.tBodies.length === 0 || table.hasInitialized === true ) {\n\t\t\t\tif ( c.debug ) {\n\t\t\t\t\tif ( table.hasInitialized ) {\n\t\t\t\t\t\tconsole.warn( 'Stopping initialization. Tablesorter has already been initialized' );\n\t\t\t\t\t} else {\n\t\t\t\t\t\tconsole.error( 'Stopping initialization! No table, thead or tbody', table );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tvar tmp = '',\n\t\t\t\t$table = $( table ),\n\t\t\t\tmeta = $.metadata;\n\t\t\t// initialization flag\n\t\t\ttable.hasInitialized = false;\n\t\t\t// table is being processed flag\n\t\t\ttable.isProcessing = true;\n\t\t\t// make sure to store the config object\n\t\t\ttable.config = c;\n\t\t\t// save the settings where they read\n\t\t\t$.data( table, 'tablesorter', c );\n\t\t\tif ( c.debug ) {\n\t\t\t\tconsole[ console.group ? 'group' : 'log' ]( 'Initializing tablesorter' );\n\t\t\t\t$.data( table, 'startoveralltimer', new Date() );\n\t\t\t}\n\n\t\t\t// removing this in version 3 (only supports jQuery 1.7+)\n\t\t\tc.supportsDataObject = ( function( version ) {\n\t\t\t\tversion[ 0 ] = parseInt( version[ 0 ], 10 );\n\t\t\t\treturn ( version[ 0 ] > 1 ) || ( version[ 0 ] === 1 && parseInt( version[ 1 ], 10 ) >= 4 );\n\t\t\t})( $.fn.jquery.split( '.' ) );\n\t\t\t// ensure case insensitivity\n\t\t\tc.emptyTo = c.emptyTo.toLowerCase();\n\t\t\tc.stringTo = c.stringTo.toLowerCase();\n\t\t\tc.last = { sortList : [], clickedIndex : -1 };\n\t\t\t// add table theme class only if there isn't already one there\n\t\t\tif ( !/tablesorter\\-/.test( $table.attr( 'class' ) ) ) {\n\t\t\t\ttmp = ( c.theme !== '' ? ' tablesorter-' + c.theme : '' );\n\t\t\t}\n\t\t\tc.table = table;\n\t\t\tc.$table = $table\n\t\t\t\t.addClass( ts.css.table + ' ' + c.tableClass + tmp )\n\t\t\t\t.attr( 'role', 'grid' );\n\t\t\tc.$headers = $table.find( c.selectorHeaders );\n\n\t\t\t// give the table a unique id, which will be used in namespace binding\n\t\t\tif ( !c.namespace ) {\n\t\t\t\tc.namespace = '.tablesorter' + Math.random().toString( 16 ).slice( 2 );\n\t\t\t} else {\n\t\t\t\t// make sure namespace starts with a period & doesn't have weird characters\n\t\t\t\tc.namespace = '.' + c.namespace.replace( ts.regex.nonWord, '' );\n\t\t\t}\n\n\t\t\tc.$table.children().children( 'tr' ).attr( 'role', 'row' );\n\t\t\tc.$tbodies = $table.children( 'tbody:not(.' + c.cssInfoBlock + ')' ).attr({\n\t\t\t\t'aria-live' : 'polite',\n\t\t\t\t'aria-relevant' : 'all'\n\t\t\t});\n\t\t\tif ( c.$table.children( 'caption' ).length ) {\n\t\t\t\ttmp = c.$table.children( 'caption' )[ 0 ];\n\t\t\t\tif ( !tmp.id ) { tmp.id = c.namespace.slice( 1 ) + 'caption'; }\n\t\t\t\tc.$table.attr( 'aria-labelledby', tmp.id );\n\t\t\t}\n\t\t\tc.widgetInit = {}; // keep a list of initialized widgets\n\t\t\t// change textExtraction via data-attribute\n\t\t\tc.textExtraction = c.$table.attr( 'data-text-extraction' ) || c.textExtraction || 'basic';\n\t\t\t// build headers\n\t\t\tts.buildHeaders( c );\n\t\t\t// fixate columns if the users supplies the fixedWidth option\n\t\t\t// do this after theme has been applied\n\t\t\tts.fixColumnWidth( table );\n\t\t\t// add widgets from class name\n\t\t\tts.addWidgetFromClass( table );\n\t\t\t// add widget options before parsing (e.g. grouping widget has parser settings)\n\t\t\tts.applyWidgetOptions( table );\n\t\t\t// try to auto detect column type, and store in tables config\n\t\t\tts.setupParsers( c );\n\t\t\t// start total row count at zero\n\t\t\tc.totalRows = 0;\n\t\t\t// build the cache for the tbody cells\n\t\t\t// delayInit will delay building the cache until the user starts a sort\n\t\t\tif ( !c.delayInit ) { ts.buildCache( c ); }\n\t\t\t// bind all header events and methods\n\t\t\tts.bindEvents( table, c.$headers, true );\n\t\t\tts.bindMethods( c );\n\t\t\t// get sort list from jQuery data or metadata\n\t\t\t// in jQuery < 1.4, an error occurs when calling $table.data()\n\t\t\tif ( c.supportsDataObject && typeof $table.data().sortlist !== 'undefined' ) {\n\t\t\t\tc.sortList = $table.data().sortlist;\n\t\t\t} else if ( meta && ( $table.metadata() && $table.metadata().sortlist ) ) {\n\t\t\t\tc.sortList = $table.metadata().sortlist;\n\t\t\t}\n\t\t\t// apply widget init code\n\t\t\tts.applyWidget( table, true );\n\t\t\t// if user has supplied a sort list to constructor\n\t\t\tif ( c.sortList.length > 0 ) {\n\t\t\t\tts.sortOn( c, c.sortList, {}, !c.initWidgets );\n\t\t\t} else {\n\t\t\t\tts.setHeadersCss( c );\n\t\t\t\tif ( c.initWidgets ) {\n\t\t\t\t\t// apply widget format\n\t\t\t\t\tts.applyWidget( table, false );\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// show processesing icon\n\t\t\tif ( c.showProcessing ) {\n\t\t\t\t$table\n\t\t\t\t.unbind( 'sortBegin' + c.namespace + ' sortEnd' + c.namespace )\n\t\t\t\t.bind( 'sortBegin' + c.namespace + ' sortEnd' + c.namespace, function( e ) {\n\t\t\t\t\tclearTimeout( c.timerProcessing );\n\t\t\t\t\tts.isProcessing( table );\n\t\t\t\t\tif ( e.type === 'sortBegin' ) {\n\t\t\t\t\t\tc.timerProcessing = setTimeout( function() {\n\t\t\t\t\t\t\tts.isProcessing( table, true );\n\t\t\t\t\t\t}, 500 );\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t}\n\n\t\t\t// initialized\n\t\t\ttable.hasInitialized = true;\n\t\t\ttable.isProcessing = false;\n\t\t\tif ( c.debug ) {\n\t\t\t\tconsole.log( 'Overall initialization time: ' + ts.benchmark( $.data( table, 'startoveralltimer' ) ) );\n\t\t\t\tif ( c.debug && console.groupEnd ) { console.groupEnd(); }\n\t\t\t}\n\t\t\t$table.triggerHandler( 'tablesorter-initialized', table );\n\t\t\tif ( typeof c.initialized === 'function' ) {\n\t\t\t\tc.initialized( table );\n\t\t\t}\n\t\t},\n\n\t\tbindMethods : function( c ) {\n\t\t\tvar $table = c.$table,\n\t\t\t\tnamespace = c.namespace,\n\t\t\t\tevents = ( 'sortReset update updateRows updateAll updateHeaders addRows updateCell updateComplete ' +\n\t\t\t\t\t'sorton appendCache updateCache applyWidgetId applyWidgets refreshWidgets destroy mouseup ' +\n\t\t\t\t\t'mouseleave ' ).split( ' ' )\n\t\t\t\t\t.join( namespace + ' ' );\n\t\t\t// apply easy methods that trigger bound events\n\t\t\t$table\n\t\t\t.unbind( events.replace( ts.regex.spaces, ' ' ) )\n\t\t\t.bind( 'sortReset' + namespace, function( e, callback ) {\n\t\t\t\te.stopPropagation();\n\t\t\t\t// using this.config to ensure functions are getting a non-cached version of the config\n\t\t\t\tts.sortReset( this.config, callback );\n\t\t\t})\n\t\t\t.bind( 'updateAll' + namespace, function( e, resort, callback ) {\n\t\t\t\te.stopPropagation();\n\t\t\t\tts.updateAll( this.config, resort, callback );\n\t\t\t})\n\t\t\t.bind( 'update' + namespace + ' updateRows' + namespace, function( e, resort, callback ) {\n\t\t\t\te.stopPropagation();\n\t\t\t\tts.update( this.config, resort, callback );\n\t\t\t})\n\t\t\t.bind( 'updateHeaders' + namespace, function( e, callback ) {\n\t\t\t\te.stopPropagation();\n\t\t\t\tts.updateHeaders( this.config, callback );\n\t\t\t})\n\t\t\t.bind( 'updateCell' + namespace, function( e, cell, resort, callback ) {\n\t\t\t\te.stopPropagation();\n\t\t\t\tts.updateCell( this.config, cell, resort, callback );\n\t\t\t})\n\t\t\t.bind( 'addRows' + namespace, function( e, $row, resort, callback ) {\n\t\t\t\te.stopPropagation();\n\t\t\t\tts.addRows( this.config, $row, resort, callback );\n\t\t\t})\n\t\t\t.bind( 'updateComplete' + namespace, function() {\n\t\t\t\tthis.isUpdating = false;\n\t\t\t})\n\t\t\t.bind( 'sorton' + namespace, function( e, list, callback, init ) {\n\t\t\t\te.stopPropagation();\n\t\t\t\tts.sortOn( this.config, list, callback, init );\n\t\t\t})\n\t\t\t.bind( 'appendCache' + namespace, function( e, callback, init ) {\n\t\t\t\te.stopPropagation();\n\t\t\t\tts.appendCache( this.config, init );\n\t\t\t\tif ( $.isFunction( callback ) ) {\n\t\t\t\t\tcallback( this );\n\t\t\t\t}\n\t\t\t})\n\t\t\t// $tbodies variable is used by the tbody sorting widget\n\t\t\t.bind( 'updateCache' + namespace, function( e, callback, $tbodies ) {\n\t\t\t\te.stopPropagation();\n\t\t\t\tts.updateCache( this.config, callback, $tbodies );\n\t\t\t})\n\t\t\t.bind( 'applyWidgetId' + namespace, function( e, id ) {\n\t\t\t\te.stopPropagation();\n\t\t\t\tts.applyWidgetId( this, id );\n\t\t\t})\n\t\t\t.bind( 'applyWidgets' + namespace, function( e, init ) {\n\t\t\t\te.stopPropagation();\n\t\t\t\t// apply widgets\n\t\t\t\tts.applyWidget( this, init );\n\t\t\t})\n\t\t\t.bind( 'refreshWidgets' + namespace, function( e, all, dontapply ) {\n\t\t\t\te.stopPropagation();\n\t\t\t\tts.refreshWidgets( this, all, dontapply );\n\t\t\t})\n\t\t\t.bind( 'removeWidget' + namespace, function( e, name, refreshing ) {\n\t\t\t\te.stopPropagation();\n\t\t\t\tts.removeWidget( this, name, refreshing );\n\t\t\t})\n\t\t\t.bind( 'destroy' + namespace, function( e, removeClasses, callback ) {\n\t\t\t\te.stopPropagation();\n\t\t\t\tts.destroy( this, removeClasses, callback );\n\t\t\t})\n\t\t\t.bind( 'resetToLoadState' + namespace, function( e ) {\n\t\t\t\te.stopPropagation();\n\t\t\t\t// remove all widgets\n\t\t\t\tts.removeWidget( this, true, false );\n\t\t\t\t// restore original settings; this clears out current settings, but does not clear\n\t\t\t\t// values saved to storage.\n\t\t\t\tc = $.extend( true, ts.defaults, c.originalSettings );\n\t\t\t\tthis.hasInitialized = false;\n\t\t\t\t// setup the entire table again\n\t\t\t\tts.setup( this, c );\n\t\t\t});\n\t\t},\n\n\t\tbindEvents : function( table, $headers, core ) {\n\t\t\ttable = $( table )[ 0 ];\n\t\t\tvar tmp,\n\t\t\t\tc = table.config,\n\t\t\t\tnamespace = c.namespace,\n\t\t\t\tdownTarget = null;\n\t\t\tif ( core !== true ) {\n\t\t\t\t$headers.addClass( namespace.slice( 1 ) + '_extra_headers' );\n\t\t\t\ttmp = $.fn.closest ? $headers.closest( 'table' )[ 0 ] : $headers.parents( 'table' )[ 0 ];\n\t\t\t\tif ( tmp && tmp.nodeName === 'TABLE' && tmp !== table ) {\n\t\t\t\t\t$( tmp ).addClass( namespace.slice( 1 ) + '_extra_table' );\n\t\t\t\t}\n\t\t\t}\n\t\t\ttmp = ( c.pointerDown + ' ' + c.pointerUp + ' ' + c.pointerClick + ' sort keyup ' )\n\t\t\t\t.replace( ts.regex.spaces, ' ' )\n\t\t\t\t.split( ' ' )\n\t\t\t\t.join( namespace + ' ' );\n\t\t\t// apply event handling to headers and/or additional headers (stickyheaders, scroller, etc)\n\t\t\t$headers\n\t\t\t// http://stackoverflow.com/questions/5312849/jquery-find-self;\n\t\t\t.find( c.selectorSort )\n\t\t\t.add( $headers.filter( c.selectorSort ) )\n\t\t\t.unbind( tmp )\n\t\t\t.bind( tmp, function( e, external ) {\n\t\t\t\tvar $cell, cell, temp,\n\t\t\t\t\t$target = $( e.target ),\n\t\t\t\t\t// wrap event type in spaces, so the match doesn't trigger on inner words\n\t\t\t\t\ttype = ' ' + e.type + ' ';\n\t\t\t\t// only recognize left clicks\n\t\t\t\tif ( ( ( e.which || e.button ) !== 1 && !type.match( ' ' + c.pointerClick + ' | sort | keyup ' ) ) ||\n\t\t\t\t\t// allow pressing enter\n\t\t\t\t\t( type === ' keyup ' && e.which !== ts.keyCodes.enter ) ||\n\t\t\t\t\t// allow triggering a click event (e.which is undefined) & ignore physical clicks\n\t\t\t\t\t( type.match( ' ' + c.pointerClick + ' ' ) && typeof e.which !== 'undefined' ) ) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\t// ignore mouseup if mousedown wasn't on the same target\n\t\t\t\tif ( type.match( ' ' + c.pointerUp + ' ' ) && downTarget !== e.target && external !== true ) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\t// set target on mousedown\n\t\t\t\tif ( type.match( ' ' + c.pointerDown + ' ' ) ) {\n\t\t\t\t\tdownTarget = e.target;\n\t\t\t\t\t// preventDefault needed or jQuery v1.3.2 and older throws an\n\t\t\t\t\t// \"Uncaught TypeError: handler.apply is not a function\" error\n\t\t\t\t\ttemp = $target.jquery.split( '.' );\n\t\t\t\t\tif ( temp[ 0 ] === '1' && temp[ 1 ] < 4 ) { e.preventDefault(); }\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tdownTarget = null;\n\t\t\t\t// prevent sort being triggered on form elements\n\t\t\t\tif ( ts.regex.formElements.test( e.target.nodeName ) ||\n\t\t\t\t\t// nosort class name, or elements within a nosort container\n\t\t\t\t\t$target.hasClass( c.cssNoSort ) || $target.parents( '.' + c.cssNoSort ).length > 0 ||\n\t\t\t\t\t// elements within a button\n\t\t\t\t\t$target.parents( 'button' ).length > 0 ) {\n\t\t\t\t\treturn !c.cancelSelection;\n\t\t\t\t}\n\t\t\t\tif ( c.delayInit && ts.isEmptyObject( c.cache ) ) {\n\t\t\t\t\tts.buildCache( c );\n\t\t\t\t}\n\t\t\t\t// jQuery v1.2.6 doesn't have closest()\n\t\t\t\t$cell = $.fn.closest ? $( this ).closest( 'th, td' ) :\n\t\t\t\t\t/TH|TD/.test( this.nodeName ) ? $( this ) : $( this ).parents( 'th, td' );\n\t\t\t\t// reference original table headers and find the same cell\n\t\t\t\t// don't use $headers or IE8 throws an error - see #987\n\t\t\t\ttemp = $headers.index( $cell );\n\t\t\t\tc.last.clickedIndex = ( temp < 0 ) ? $cell.attr( 'data-column' ) : temp;\n\t\t\t\t// use column index if $headers is undefined\n\t\t\t\tcell = c.$headers[ c.last.clickedIndex ];\n\t\t\t\tif ( cell && !cell.sortDisabled ) {\n\t\t\t\t\tts.initSort( c, cell, e );\n\t\t\t\t}\n\t\t\t});\n\t\t\tif ( c.cancelSelection ) {\n\t\t\t\t// cancel selection\n\t\t\t\t$headers\n\t\t\t\t\t.attr( 'unselectable', 'on' )\n\t\t\t\t\t.bind( 'selectstart', false )\n\t\t\t\t\t.css({\n\t\t\t\t\t\t'user-select' : 'none',\n\t\t\t\t\t\t'MozUserSelect' : 'none' // not needed for jQuery 1.8+\n\t\t\t\t\t});\n\t\t\t}\n\t\t},\n\n\t\tbuildHeaders : function( c ) {\n\t\t\tvar $temp, icon, timer, indx;\n\t\t\tc.headerList = [];\n\t\t\tc.headerContent = [];\n\t\t\tc.sortVars = [];\n\t\t\tif ( c.debug ) {\n\t\t\t\ttimer = new Date();\n\t\t\t}\n\t\t\t// children tr in tfoot - see issue #196 & #547\n\t\t\t// don't pass table.config to computeColumnIndex here - widgets (math) pass it to \"quickly\" index tbody cells\n\t\t\tc.columns = ts.computeColumnIndex( c.$table.children( 'thead, tfoot' ).children( 'tr' ) );\n\t\t\t// add icon if cssIcon option exists\n\t\t\ticon = c.cssIcon ?\n\t\t\t\t'<i class=\"' + ( c.cssIcon === ts.css.icon ? ts.css.icon : c.cssIcon + ' ' + ts.css.icon ) + '\"></i>' :\n\t\t\t\t'';\n\t\t\t// redefine c.$headers here in case of an updateAll that replaces or adds an entire header cell - see #683\n\t\t\tc.$headers = $( $.map( c.$table.find( c.selectorHeaders ), function( elem, index ) {\n\t\t\t\tvar configHeaders, header, column, template, tmp,\n\t\t\t\t\t$elem = $( elem );\n\t\t\t\t// ignore cell (don't add it to c.$headers) if row has ignoreRow class\n\t\t\t\tif ( $elem.parent().hasClass( c.cssIgnoreRow ) ) { return; }\n\t\t\t\t// make sure to get header cell & not column indexed cell\n\t\t\t\tconfigHeaders = ts.getColumnData( c.table, c.headers, index, true );\n\t\t\t\t// save original header content\n\t\t\t\tc.headerContent[ index ] = $elem.html();\n\t\t\t\t// if headerTemplate is empty, don't reformat the header cell\n\t\t\t\tif ( c.headerTemplate !== '' && !$elem.find( '.' + ts.css.headerIn ).length ) {\n\t\t\t\t\t// set up header template\n\t\t\t\t\ttemplate = c.headerTemplate\n\t\t\t\t\t\t.replace( ts.regex.templateContent, $elem.html() )\n\t\t\t\t\t\t.replace( ts.regex.templateIcon, $elem.find( '.' + ts.css.icon ).length ? '' : icon );\n\t\t\t\t\tif ( c.onRenderTemplate ) {\n\t\t\t\t\t\theader = c.onRenderTemplate.apply( $elem, [ index, template ] );\n\t\t\t\t\t\t// only change t if something is returned\n\t\t\t\t\t\tif ( header && typeof header === 'string' ) {\n\t\t\t\t\t\t\ttemplate = header;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\t$elem.html( '<div class=\"' + ts.css.headerIn + '\">' + template + '</div>' ); // faster than wrapInner\n\t\t\t\t}\n\t\t\t\tif ( c.onRenderHeader ) {\n\t\t\t\t\tc.onRenderHeader.apply( $elem, [ index, c, c.$table ] );\n\t\t\t\t}\n\t\t\t\tcolumn = parseInt( $elem.attr( 'data-column' ), 10 );\n\t\t\t\telem.column = column;\n\t\t\t\ttmp = ts.getData( $elem, configHeaders, 'sortInitialOrder' ) || c.sortInitialOrder;\n\t\t\t\t// this may get updated numerous times if there are multiple rows\n\t\t\t\tc.sortVars[ column ] = {\n\t\t\t\t\tcount : -1, // set to -1 because clicking on the header automatically adds one\n\t\t\t\t\torder: ts.getOrder( tmp ) ?\n\t\t\t\t\t\t[ 1, 0, 2 ] : // desc, asc, unsorted\n\t\t\t\t\t\t[ 0, 1, 2 ],  // asc, desc, unsorted\n\t\t\t\t\tlockedOrder : false\n\t\t\t\t};\n\t\t\t\ttmp = ts.getData( $elem, configHeaders, 'lockedOrder' ) || false;\n\t\t\t\tif ( typeof tmp !== 'undefined' && tmp !== false ) {\n\t\t\t\t\tc.sortVars[ column ].lockedOrder = true;\n\t\t\t\t\tc.sortVars[ column ].order = ts.getOrder( tmp ) ? [ 1, 1, 1 ] : [ 0, 0, 0 ];\n\t\t\t\t}\n\t\t\t\t// add cell to headerList\n\t\t\t\tc.headerList[ index ] = elem;\n\t\t\t\t// add to parent in case there are multiple rows\n\t\t\t\t$elem\n\t\t\t\t\t.addClass( ts.css.header + ' ' + c.cssHeader )\n\t\t\t\t\t.parent()\n\t\t\t\t\t.addClass( ts.css.headerRow + ' ' + c.cssHeaderRow )\n\t\t\t\t\t.attr( 'role', 'row' );\n\t\t\t\t// allow keyboard cursor to focus on element\n\t\t\t\tif ( c.tabIndex ) {\n\t\t\t\t\t$elem.attr( 'tabindex', 0 );\n\t\t\t\t}\n\t\t\t\treturn elem;\n\t\t\t}) );\n\t\t\t// cache headers per column\n\t\t\tc.$headerIndexed = [];\n\t\t\tfor ( indx = 0; indx < c.columns; indx++ ) {\n\t\t\t\t// colspan in header making a column undefined\n\t\t\t\tif ( ts.isEmptyObject( c.sortVars[ indx ] ) ) {\n\t\t\t\t\tc.sortVars[ indx ] = {};\n\t\t\t\t}\n\t\t\t\t$temp = c.$headers.filter( '[data-column=\"' + indx + '\"]' );\n\t\t\t\t// target sortable column cells, unless there are none, then use non-sortable cells\n\t\t\t\t// .last() added in jQuery 1.4; use .filter(':last') to maintain compatibility with jQuery v1.2.6\n\t\t\t\tc.$headerIndexed[ indx ] = $temp.length ?\n\t\t\t\t\t$temp.not( '.sorter-false' ).length ?\n\t\t\t\t\t\t$temp.not( '.sorter-false' ).filter( ':last' ) :\n\t\t\t\t\t\t$temp.filter( ':last' ) :\n\t\t\t\t\t$();\n\t\t\t}\n\t\t\tc.$table.find( c.selectorHeaders ).attr({\n\t\t\t\tscope: 'col',\n\t\t\t\trole : 'columnheader'\n\t\t\t});\n\t\t\t// enable/disable sorting\n\t\t\tts.updateHeader( c );\n\t\t\tif ( c.debug ) {\n\t\t\t\tconsole.log( 'Built headers:' + ts.benchmark( timer ) );\n\t\t\t\tconsole.log( c.$headers );\n\t\t\t}\n\t\t},\n\n\t\t// Use it to add a set of methods to table.config which will be available for all tables.\n\t\t// This should be done before table initialization\n\t\taddInstanceMethods : function( methods ) {\n\t\t\t$.extend( ts.instanceMethods, methods );\n\t\t},\n\n\t\t/*\n\t\t█████▄ ▄████▄ █████▄ ▄█████ ██████ █████▄ ▄█████\n\t\t██▄▄██ ██▄▄██ ██▄▄██ ▀█▄    ██▄▄   ██▄▄██ ▀█▄\n\t\t██▀▀▀  ██▀▀██ ██▀██     ▀█▄ ██▀▀   ██▀██     ▀█▄\n\t\t██     ██  ██ ██  ██ █████▀ ██████ ██  ██ █████▀\n\t\t*/\n\t\tsetupParsers : function( c, $tbodies ) {\n\t\t\tvar rows, list, span, max, colIndex, indx, header, configHeaders,\n\t\t\t\tnoParser, parser, extractor, time, tbody, len,\n\t\t\t\ttable = c.table,\n\t\t\t\ttbodyIndex = 0,\n\t\t\t\tdebug = {};\n\t\t\t// update table bodies in case we start with an empty table\n\t\t\tc.$tbodies = c.$table.children( 'tbody:not(.' + c.cssInfoBlock + ')' );\n\t\t\ttbody = typeof $tbodies === 'undefined' ? c.$tbodies : $tbodies;\n\t\t\tlen = tbody.length;\n\t\t\tif ( len === 0 ) {\n\t\t\t\treturn c.debug ? console.warn( 'Warning: *Empty table!* Not building a parser cache' ) : '';\n\t\t\t} else if ( c.debug ) {\n\t\t\t\ttime = new Date();\n\t\t\t\tconsole[ console.group ? 'group' : 'log' ]( 'Detecting parsers for each column' );\n\t\t\t}\n\t\t\tlist = {\n\t\t\t\textractors: [],\n\t\t\t\tparsers: []\n\t\t\t};\n\t\t\twhile ( tbodyIndex < len ) {\n\t\t\t\trows = tbody[ tbodyIndex ].rows;\n\t\t\t\tif ( rows.length ) {\n\t\t\t\t\tcolIndex = 0;\n\t\t\t\t\tmax = c.columns;\n\t\t\t\t\tfor ( indx = 0; indx < max; indx++ ) {\n\t\t\t\t\t\theader = c.$headerIndexed[ colIndex ];\n\t\t\t\t\t\tif ( header && header.length ) {\n\t\t\t\t\t\t\t// get column indexed table cell\n\t\t\t\t\t\t\tconfigHeaders = ts.getColumnData( table, c.headers, colIndex );\n\t\t\t\t\t\t\t// get column parser/extractor\n\t\t\t\t\t\t\textractor = ts.getParserById( ts.getData( header, configHeaders, 'extractor' ) );\n\t\t\t\t\t\t\tparser = ts.getParserById( ts.getData( header, configHeaders, 'sorter' ) );\n\t\t\t\t\t\t\tnoParser = ts.getData( header, configHeaders, 'parser' ) === 'false';\n\t\t\t\t\t\t\t// empty cells behaviour - keeping emptyToBottom for backwards compatibility\n\t\t\t\t\t\t\tc.empties[colIndex] = (\n\t\t\t\t\t\t\t\tts.getData( header, configHeaders, 'empty' ) ||\n\t\t\t\t\t\t\t\tc.emptyTo || ( c.emptyToBottom ? 'bottom' : 'top' ) ).toLowerCase();\n\t\t\t\t\t\t\t// text strings behaviour in numerical sorts\n\t\t\t\t\t\t\tc.strings[colIndex] = (\n\t\t\t\t\t\t\t\tts.getData( header, configHeaders, 'string' ) ||\n\t\t\t\t\t\t\t\tc.stringTo ||\n\t\t\t\t\t\t\t\t'max' ).toLowerCase();\n\t\t\t\t\t\t\tif ( noParser ) {\n\t\t\t\t\t\t\t\tparser = ts.getParserById( 'no-parser' );\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tif ( !extractor ) {\n\t\t\t\t\t\t\t\t// For now, maybe detect someday\n\t\t\t\t\t\t\t\textractor = false;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tif ( !parser ) {\n\t\t\t\t\t\t\t\tparser = ts.detectParserForColumn( c, rows, -1, colIndex );\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tif ( c.debug ) {\n\t\t\t\t\t\t\t\tdebug[ '(' + colIndex + ') ' + header.text() ] = {\n\t\t\t\t\t\t\t\t\tparser : parser.id,\n\t\t\t\t\t\t\t\t\textractor : extractor ? extractor.id : 'none',\n\t\t\t\t\t\t\t\t\tstring : c.strings[ colIndex ],\n\t\t\t\t\t\t\t\t\tempty  : c.empties[ colIndex ]\n\t\t\t\t\t\t\t\t};\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tlist.parsers[ colIndex ] = parser;\n\t\t\t\t\t\t\tlist.extractors[ colIndex ] = extractor;\n\t\t\t\t\t\t\tspan = header[ 0 ].colSpan - 1;\n\t\t\t\t\t\t\tif ( span > 0 ) {\n\t\t\t\t\t\t\t\tcolIndex += span;\n\t\t\t\t\t\t\t\tmax += span;\n\t\t\t\t\t\t\t\twhile ( span + 1 > 0 ) {\n\t\t\t\t\t\t\t\t\t// set colspan columns to use the same parsers & extractors\n\t\t\t\t\t\t\t\t\tlist.parsers[ colIndex - span ] = parser;\n\t\t\t\t\t\t\t\t\tlist.extractors[ colIndex - span ] = extractor;\n\t\t\t\t\t\t\t\t\tspan--;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t\tcolIndex++;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\ttbodyIndex += ( list.parsers.length ) ? len : 1;\n\t\t\t}\n\t\t\tif ( c.debug ) {\n\t\t\t\tif ( !ts.isEmptyObject( debug ) ) {\n\t\t\t\t\tconsole[ console.table ? 'table' : 'log' ]( debug );\n\t\t\t\t} else {\n\t\t\t\t\tconsole.warn( '  No parsers detected!' );\n\t\t\t\t}\n\t\t\t\tconsole.log( 'Completed detecting parsers' + ts.benchmark( time ) );\n\t\t\t\tif ( console.groupEnd ) { console.groupEnd(); }\n\t\t\t}\n\t\t\tc.parsers = list.parsers;\n\t\t\tc.extractors = list.extractors;\n\t\t},\n\n\t\taddParser : function( parser ) {\n\t\t\tvar indx,\n\t\t\t\tlen = ts.parsers.length,\n\t\t\t\tadd = true;\n\t\t\tfor ( indx = 0; indx < len; indx++ ) {\n\t\t\t\tif ( ts.parsers[ indx ].id.toLowerCase() === parser.id.toLowerCase() ) {\n\t\t\t\t\tadd = false;\n\t\t\t\t}\n\t\t\t}\n\t\t\tif ( add ) {\n\t\t\t\tts.parsers[ ts.parsers.length ] = parser;\n\t\t\t}\n\t\t},\n\n\t\tgetParserById : function( name ) {\n\t\t\t/*jshint eqeqeq:false */\n\t\t\tif ( name == 'false' ) { return false; }\n\t\t\tvar indx,\n\t\t\t\tlen = ts.parsers.length;\n\t\t\tfor ( indx = 0; indx < len; indx++ ) {\n\t\t\t\tif ( ts.parsers[ indx ].id.toLowerCase() === ( name.toString() ).toLowerCase() ) {\n\t\t\t\t\treturn ts.parsers[ indx ];\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn false;\n\t\t},\n\n\t\tdetectParserForColumn : function( c, rows, rowIndex, cellIndex ) {\n\t\t\tvar cur, $node, row,\n\t\t\t\tindx = ts.parsers.length,\n\t\t\t\tnode = false,\n\t\t\t\tnodeValue = '',\n\t\t\t\tkeepLooking = true;\n\t\t\twhile ( nodeValue === '' && keepLooking ) {\n\t\t\t\trowIndex++;\n\t\t\t\trow = rows[ rowIndex ];\n\t\t\t\t// stop looking after 50 empty rows\n\t\t\t\tif ( row && rowIndex < 50 ) {\n\t\t\t\t\tif ( row.className.indexOf( ts.cssIgnoreRow ) < 0 ) {\n\t\t\t\t\t\tnode = rows[ rowIndex ].cells[ cellIndex ];\n\t\t\t\t\t\tnodeValue = ts.getElementText( c, node, cellIndex );\n\t\t\t\t\t\t$node = $( node );\n\t\t\t\t\t\tif ( c.debug ) {\n\t\t\t\t\t\t\tconsole.log( 'Checking if value was empty on row ' + rowIndex + ', column: ' +\n\t\t\t\t\t\t\t\tcellIndex + ': \"' + nodeValue + '\"' );\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\tkeepLooking = false;\n\t\t\t\t}\n\t\t\t}\n\t\t\twhile ( --indx >= 0 ) {\n\t\t\t\tcur = ts.parsers[ indx ];\n\t\t\t\t// ignore the default text parser because it will always be true\n\t\t\t\tif ( cur && cur.id !== 'text' && cur.is && cur.is( nodeValue, c.table, node, $node ) ) {\n\t\t\t\t\treturn cur;\n\t\t\t\t}\n\t\t\t}\n\t\t\t// nothing found, return the generic parser (text)\n\t\t\treturn ts.getParserById( 'text' );\n\t\t},\n\n\t\tgetElementText : function( c, node, cellIndex ) {\n\t\t\tif ( !node ) { return ''; }\n\t\t\tvar tmp,\n\t\t\t\textract = c.textExtraction || '',\n\t\t\t\t// node could be a jquery object\n\t\t\t\t// http://jsperf.com/jquery-vs-instanceof-jquery/2\n\t\t\t\t$node = node.jquery ? node : $( node );\n\t\t\tif ( typeof extract === 'string' ) {\n\t\t\t\t// check data-attribute first when set to 'basic'; don't use node.innerText - it's really slow!\n\t\t\t\t// http://www.kellegous.com/j/2013/02/27/innertext-vs-textcontent/\n\t\t\t\tif ( extract === 'basic' && typeof ( tmp = $node.attr( c.textAttribute ) ) !== 'undefined' ) {\n\t\t\t\t\treturn $.trim( tmp );\n\t\t\t\t}\n\t\t\t\treturn $.trim( node.textContent || $node.text() );\n\t\t\t} else {\n\t\t\t\tif ( typeof extract === 'function' ) {\n\t\t\t\t\treturn $.trim( extract( $node[ 0 ], c.table, cellIndex ) );\n\t\t\t\t} else if ( typeof ( tmp = ts.getColumnData( c.table, extract, cellIndex ) ) === 'function' ) {\n\t\t\t\t\treturn $.trim( tmp( $node[ 0 ], c.table, cellIndex ) );\n\t\t\t\t}\n\t\t\t}\n\t\t\t// fallback\n\t\t\treturn $.trim( $node[ 0 ].textContent || $node.text() );\n\t\t},\n\n\t\t// centralized function to extract/parse cell contents\n\t\tgetParsedText : function( c, cell, colIndex, txt ) {\n\t\t\tif ( typeof txt === 'undefined' ) {\n\t\t\t\ttxt = ts.getElementText( c, cell, colIndex );\n\t\t\t}\n\t\t\t// if no parser, make sure to return the txt\n\t\t\tvar val = '' + txt,\n\t\t\t\tparser = c.parsers[ colIndex ],\n\t\t\t\textractor = c.extractors[ colIndex ];\n\t\t\tif ( parser ) {\n\t\t\t\t// do extract before parsing, if there is one\n\t\t\t\tif ( extractor && typeof extractor.format === 'function' ) {\n\t\t\t\t\ttxt = extractor.format( txt, c.table, cell, colIndex );\n\t\t\t\t}\n\t\t\t\t// allow parsing if the string is empty, previously parsing would change it to zero,\n\t\t\t\t// in case the parser needs to extract data from the table cell attributes\n\t\t\t\tval = parser.id === 'no-parser' ? '' :\n\t\t\t\t\t// make sure txt is a string (extractor may have converted it)\n\t\t\t\t\tparser.format( '' + txt, c.table, cell, colIndex );\n\t\t\t\tif ( c.ignoreCase && typeof val === 'string' ) {\n\t\t\t\t\tval = val.toLowerCase();\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn val;\n\t\t},\n\n\t\t/*\n\t\t▄████▄ ▄████▄ ▄████▄ ██  ██ ██████\n\t\t██  ▀▀ ██▄▄██ ██  ▀▀ ██▄▄██ ██▄▄\n\t\t██  ▄▄ ██▀▀██ ██  ▄▄ ██▀▀██ ██▀▀\n\t\t▀████▀ ██  ██ ▀████▀ ██  ██ ██████\n\t\t*/\n\t\tbuildCache : function( c, callback, $tbodies ) {\n\t\t\tvar cache, val, txt, rowIndex, colIndex, tbodyIndex, $tbody, $row,\n\t\t\t\tcols, $cells, cell, cacheTime, totalRows, rowData, prevRowData,\n\t\t\t\tcolMax, span, cacheIndex, hasParser, max, len, index,\n\t\t\t\ttable = c.table,\n\t\t\t\tparsers = c.parsers;\n\t\t\t// update tbody variable\n\t\t\tc.$tbodies = c.$table.children( 'tbody:not(.' + c.cssInfoBlock + ')' );\n\t\t\t$tbody = typeof $tbodies === 'undefined' ? c.$tbodies : $tbodies,\n\t\t\tc.cache = {};\n\t\t\tc.totalRows = 0;\n\t\t\t// if no parsers found, return - it's an empty table.\n\t\t\tif ( !parsers ) {\n\t\t\t\treturn c.debug ? console.warn( 'Warning: *Empty table!* Not building a cache' ) : '';\n\t\t\t}\n\t\t\tif ( c.debug ) {\n\t\t\t\tcacheTime = new Date();\n\t\t\t}\n\t\t\t// processing icon\n\t\t\tif ( c.showProcessing ) {\n\t\t\t\tts.isProcessing( table, true );\n\t\t\t}\n\t\t\tfor ( tbodyIndex = 0; tbodyIndex < $tbody.length; tbodyIndex++ ) {\n\t\t\t\tcolMax = []; // column max value per tbody\n\t\t\t\tcache = c.cache[ tbodyIndex ] = {\n\t\t\t\t\tnormalized: [] // array of normalized row data; last entry contains 'rowData' above\n\t\t\t\t\t// colMax: #   // added at the end\n\t\t\t\t};\n\n\t\t\t\ttotalRows = ( $tbody[ tbodyIndex ] && $tbody[ tbodyIndex ].rows.length ) || 0;\n\t\t\t\tfor ( rowIndex = 0; rowIndex < totalRows; ++rowIndex ) {\n\t\t\t\t\trowData = {\n\t\t\t\t\t\t// order: original row order #\n\t\t\t\t\t\t// $row : jQuery Object[]\n\t\t\t\t\t\tchild: [], // child row text (filter widget)\n\t\t\t\t\t\traw: []    // original row text\n\t\t\t\t\t};\n\t\t\t\t\t/** Add the table data to main data array */\n\t\t\t\t\t$row = $( $tbody[ tbodyIndex ].rows[ rowIndex ] );\n\t\t\t\t\tcols = [];\n\t\t\t\t\t// if this is a child row, add it to the last row's children and continue to the next row\n\t\t\t\t\t// ignore child row class, if it is the first row\n\t\t\t\t\tif ( $row.hasClass( c.cssChildRow ) && rowIndex !== 0 ) {\n\t\t\t\t\t\tlen = cache.normalized.length - 1;\n\t\t\t\t\t\tprevRowData = cache.normalized[ len ][ c.columns ];\n\t\t\t\t\t\tprevRowData.$row = prevRowData.$row.add( $row );\n\t\t\t\t\t\t// add 'hasChild' class name to parent row\n\t\t\t\t\t\tif ( !$row.prev().hasClass( c.cssChildRow ) ) {\n\t\t\t\t\t\t\t$row.prev().addClass( ts.css.cssHasChild );\n\t\t\t\t\t\t}\n\t\t\t\t\t\t// save child row content (un-parsed!)\n\t\t\t\t\t\t$cells = $row.children( 'th, td' );\n\t\t\t\t\t\tlen = prevRowData.child.length;\n\t\t\t\t\t\tprevRowData.child[ len ] = [];\n\t\t\t\t\t\t// child row content does not account for colspans/rowspans; so indexing may be off\n\t\t\t\t\t\tcacheIndex = 0;\n\t\t\t\t\t\tmax = c.columns;\n\t\t\t\t\t\tfor ( colIndex = 0; colIndex < max; colIndex++ ) {\n\t\t\t\t\t\t\tcell = $cells[ colIndex ];\n\t\t\t\t\t\t\tif ( cell ) {\n\t\t\t\t\t\t\t\tprevRowData.child[ len ][ colIndex ] = ts.getParsedText( c, cell, colIndex );\n\t\t\t\t\t\t\t\tspan = $cells[ colIndex ].colSpan - 1;\n\t\t\t\t\t\t\t\tif ( span > 0 ) {\n\t\t\t\t\t\t\t\t\tcacheIndex += span;\n\t\t\t\t\t\t\t\t\tmax += span;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tcacheIndex++;\n\t\t\t\t\t\t}\n\t\t\t\t\t\t// go to the next for loop\n\t\t\t\t\t\tcontinue;\n\t\t\t\t\t}\n\t\t\t\t\trowData.$row = $row;\n\t\t\t\t\trowData.order = rowIndex; // add original row position to rowCache\n\t\t\t\t\tcacheIndex = 0;\n\t\t\t\t\tmax = c.columns;\n\t\t\t\t\tfor ( colIndex = 0; colIndex < max; ++colIndex ) {\n\t\t\t\t\t\tcell = $row[ 0 ].cells[ colIndex ];\n\t\t\t\t\t\tif ( cell && cacheIndex < c.columns ) {\n\t\t\t\t\t\t\thasParser = typeof parsers[ cacheIndex ] !== 'undefined';\n\t\t\t\t\t\t\tif ( !hasParser && c.debug ) {\n\t\t\t\t\t\t\t\tconsole.warn( 'No parser found for row: ' + rowIndex + ', column: ' + colIndex +\n\t\t\t\t\t\t\t\t\t'; cell containing: \"' + $(cell).text() + '\"; does it have a header?' );\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tval = ts.getElementText( c, cell, cacheIndex );\n\t\t\t\t\t\t\trowData.raw[ cacheIndex ] = val; // save original row text\n\t\t\t\t\t\t\t// save raw column text even if there is no parser set\n\t\t\t\t\t\t\ttxt = ts.getParsedText( c, cell, cacheIndex, val );\n\t\t\t\t\t\t\tcols[ cacheIndex ] = txt;\n\t\t\t\t\t\t\tif ( hasParser && ( parsers[ cacheIndex ].type || '' ).toLowerCase() === 'numeric' ) {\n\t\t\t\t\t\t\t\t// determine column max value (ignore sign)\n\t\t\t\t\t\t\t\tcolMax[ cacheIndex ] = Math.max( Math.abs( txt ) || 0, colMax[ cacheIndex ] || 0 );\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t// allow colSpan in tbody\n\t\t\t\t\t\t\tspan = cell.colSpan - 1;\n\t\t\t\t\t\t\tif ( span > 0 ) {\n\t\t\t\t\t\t\t\tindex = 0;\n\t\t\t\t\t\t\t\twhile ( index <= span ) {\n\t\t\t\t\t\t\t\t\t// duplicate text (or not) to spanned columns\n\t\t\t\t\t\t\t\t\t// instead of setting duplicate span to empty string, use textExtraction to try to get a value\n\t\t\t\t\t\t\t\t\t// see http://stackoverflow.com/q/36449711/145346\n\t\t\t\t\t\t\t\t\ttxt = c.duplicateSpan || index === 0 ?\n\t\t\t\t\t\t\t\t\t\tval :\n\t\t\t\t\t\t\t\t\t\ttypeof c.textExtraction !== 'string' ?\n\t\t\t\t\t\t\t\t\t\t\tts.getElementText( c, cell, cacheIndex + index ) || '' :\n\t\t\t\t\t\t\t\t\t\t\t'';\n\t\t\t\t\t\t\t\t\trowData.raw[ cacheIndex + index ] = txt;\n\t\t\t\t\t\t\t\t\tcols[ cacheIndex + index ] = txt;\n\t\t\t\t\t\t\t\t\tindex++;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\tcacheIndex += span;\n\t\t\t\t\t\t\t\tmax += span;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t\tcacheIndex++;\n\t\t\t\t\t}\n\t\t\t\t\t// ensure rowData is always in the same location (after the last column)\n\t\t\t\t\tcols[ c.columns ] = rowData;\n\t\t\t\t\tcache.normalized[ cache.normalized.length ] = cols;\n\t\t\t\t}\n\t\t\t\tcache.colMax = colMax;\n\t\t\t\t// total up rows, not including child rows\n\t\t\t\tc.totalRows += cache.normalized.length;\n\n\t\t\t}\n\t\t\tif ( c.showProcessing ) {\n\t\t\t\tts.isProcessing( table ); // remove processing icon\n\t\t\t}\n\t\t\tif ( c.debug ) {\n\t\t\t\tlen = Math.min( 5, c.cache[ 0 ].normalized.length );\n\t\t\t\tconsole[ console.group ? 'group' : 'log' ]( 'Building cache for ' + c.totalRows +\n\t\t\t\t\t' rows (showing ' + len + ' rows in log)' + ts.benchmark( cacheTime ) );\n\t\t\t\tval = {};\n\t\t\t\tfor ( colIndex = 0; colIndex < c.columns; colIndex++ ) {\n\t\t\t\t\tfor ( cacheIndex = 0; cacheIndex < len; cacheIndex++ ) {\n\t\t\t\t\t\tif ( !val[ 'row: ' + cacheIndex ] ) {\n\t\t\t\t\t\t\tval[ 'row: ' + cacheIndex ] = {};\n\t\t\t\t\t\t}\n\t\t\t\t\t\tval[ 'row: ' + cacheIndex ][ c.$headerIndexed[ colIndex ].text() ] =\n\t\t\t\t\t\t\tc.cache[ 0 ].normalized[ cacheIndex ][ colIndex ];\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tconsole[ console.table ? 'table' : 'log' ]( val );\n\t\t\t\tif ( console.groupEnd ) { console.groupEnd(); }\n\t\t\t}\n\t\t\tif ( $.isFunction( callback ) ) {\n\t\t\t\tcallback( table );\n\t\t\t}\n\t\t},\n\n\t\tgetColumnText : function( table, column, callback, rowFilter ) {\n\t\t\ttable = $( table )[0];\n\t\t\tvar tbodyIndex, rowIndex, cache, row, tbodyLen, rowLen, raw, parsed, $cell, result,\n\t\t\t\thasCallback = typeof callback === 'function',\n\t\t\t\tallColumns = column === 'all',\n\t\t\t\tdata = { raw : [], parsed: [], $cell: [] },\n\t\t\t\tc = table.config;\n\t\t\tif ( ts.isEmptyObject( c ) ) {\n\t\t\t\tif ( c.debug ) {\n\t\t\t\t\tconsole.warn( 'No cache found - aborting getColumnText function!' );\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\ttbodyLen = c.$tbodies.length;\n\t\t\t\tfor ( tbodyIndex = 0; tbodyIndex < tbodyLen; tbodyIndex++ ) {\n\t\t\t\t\tcache = c.cache[ tbodyIndex ].normalized;\n\t\t\t\t\trowLen = cache.length;\n\t\t\t\t\tfor ( rowIndex = 0; rowIndex < rowLen; rowIndex++ ) {\n\t\t\t\t\t\trow = cache[ rowIndex ];\n\t\t\t\t\t\tif ( rowFilter && !row[ c.columns ].$row.is( rowFilter ) ) {\n\t\t\t\t\t\t\tcontinue;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tresult = true;\n\t\t\t\t\t\tparsed = ( allColumns ) ? row.slice( 0, c.columns ) : row[ column ];\n\t\t\t\t\t\trow = row[ c.columns ];\n\t\t\t\t\t\traw = ( allColumns ) ? row.raw : row.raw[ column ];\n\t\t\t\t\t\t$cell = ( allColumns ) ? row.$row.children() : row.$row.children().eq( column );\n\t\t\t\t\t\tif ( hasCallback ) {\n\t\t\t\t\t\t\tresult = callback({\n\t\t\t\t\t\t\t\ttbodyIndex : tbodyIndex,\n\t\t\t\t\t\t\t\trowIndex : rowIndex,\n\t\t\t\t\t\t\t\tparsed : parsed,\n\t\t\t\t\t\t\t\traw : raw,\n\t\t\t\t\t\t\t\t$row : row.$row,\n\t\t\t\t\t\t\t\t$cell : $cell\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif ( result !== false ) {\n\t\t\t\t\t\t\tdata.parsed[ data.parsed.length ] = parsed;\n\t\t\t\t\t\t\tdata.raw[ data.raw.length ] = raw;\n\t\t\t\t\t\t\tdata.$cell[ data.$cell.length ] = $cell;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\t// return everything\n\t\t\t\treturn data;\n\t\t\t}\n\t\t},\n\n\t\t/*\n\t\t██  ██ █████▄ █████▄ ▄████▄ ██████ ██████\n\t\t██  ██ ██▄▄██ ██  ██ ██▄▄██   ██   ██▄▄\n\t\t██  ██ ██▀▀▀  ██  ██ ██▀▀██   ██   ██▀▀\n\t\t▀████▀ ██     █████▀ ██  ██   ██   ██████\n\t\t*/\n\t\tsetHeadersCss : function( c ) {\n\t\t\tvar $sorted, indx, column,\n\t\t\t\tlist = c.sortList,\n\t\t\t\tlen = list.length,\n\t\t\t\tnone = ts.css.sortNone + ' ' + c.cssNone,\n\t\t\t\tcss = [ ts.css.sortAsc + ' ' + c.cssAsc, ts.css.sortDesc + ' ' + c.cssDesc ],\n\t\t\t\tcssIcon = [ c.cssIconAsc, c.cssIconDesc, c.cssIconNone ],\n\t\t\t\taria = [ 'ascending', 'descending' ],\n\t\t\t\t// find the footer\n\t\t\t\t$headers = c.$table\n\t\t\t\t\t.find( 'tfoot tr' )\n\t\t\t\t\t.children( 'td, th' )\n\t\t\t\t\t.add( $( c.namespace + '_extra_headers' ) )\n\t\t\t\t\t.removeClass( css.join( ' ' ) );\n\t\t\t// remove all header information\n\t\t\tc.$headers\n\t\t\t\t.removeClass( css.join( ' ' ) )\n\t\t\t\t.addClass( none )\n\t\t\t\t.attr( 'aria-sort', 'none' )\n\t\t\t\t.find( '.' + ts.css.icon )\n\t\t\t\t.removeClass( cssIcon.join( ' ' ) )\n\t\t\t\t.addClass( cssIcon[ 2 ] );\n\t\t\tfor ( indx = 0; indx < len; indx++ ) {\n\t\t\t\t// direction = 2 means reset!\n\t\t\t\tif ( list[ indx ][ 1 ] !== 2 ) {\n\t\t\t\t\t// multicolumn sorting updating - see #1005\n\t\t\t\t\t// .not(function(){}) needs jQuery 1.4\n\t\t\t\t\t// filter(function(i, el){}) <- el is undefined in jQuery v1.2.6\n\t\t\t\t\t$sorted = c.$headers.filter( function( i ) {\n\t\t\t\t\t\t// only include headers that are in the sortList (this includes colspans)\n\t\t\t\t\t\tvar include = true,\n\t\t\t\t\t\t\t$el = c.$headers.eq( i ),\n\t\t\t\t\t\t\tcol = parseInt( $el.attr( 'data-column' ), 10 ),\n\t\t\t\t\t\t\tend = col + c.$headers[ i ].colSpan;\n\t\t\t\t\t\tfor ( ; col < end; col++ ) {\n\t\t\t\t\t\t\tinclude = include ? include || ts.isValueInArray( col, c.sortList ) > -1 : false;\n\t\t\t\t\t\t}\n\t\t\t\t\t\treturn include;\n\t\t\t\t\t});\n\n\t\t\t\t\t// choose the :last in case there are nested columns\n\t\t\t\t\t$sorted = $sorted\n\t\t\t\t\t\t.not( '.sorter-false' )\n\t\t\t\t\t\t.filter( '[data-column=\"' + list[ indx ][ 0 ] + '\"]' + ( len === 1 ? ':last' : '' ) );\n\t\t\t\t\tif ( $sorted.length ) {\n\t\t\t\t\t\tfor ( column = 0; column < $sorted.length; column++ ) {\n\t\t\t\t\t\t\tif ( !$sorted[ column ].sortDisabled ) {\n\t\t\t\t\t\t\t\t$sorted\n\t\t\t\t\t\t\t\t\t.eq( column )\n\t\t\t\t\t\t\t\t\t.removeClass( none )\n\t\t\t\t\t\t\t\t\t.addClass( css[ list[ indx ][ 1 ] ] )\n\t\t\t\t\t\t\t\t\t.attr( 'aria-sort', aria[ list[ indx ][ 1 ] ] )\n\t\t\t\t\t\t\t\t\t.find( '.' + ts.css.icon )\n\t\t\t\t\t\t\t\t\t.removeClass( cssIcon[ 2 ] )\n\t\t\t\t\t\t\t\t\t.addClass( cssIcon[ list[ indx ][ 1 ] ] );\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t\t// add sorted class to footer & extra headers, if they exist\n\t\t\t\t\t\tif ( $headers.length ) {\n\t\t\t\t\t\t\t$headers\n\t\t\t\t\t\t\t\t.filter( '[data-column=\"' + list[ indx ][ 0 ] + '\"]' )\n\t\t\t\t\t\t\t\t.removeClass( none )\n\t\t\t\t\t\t\t\t.addClass( css[ list[ indx ][ 1 ] ] );\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\t// add verbose aria labels\n\t\t\tlen = c.$headers.length;\n\t\t\tfor ( indx = 0; indx < len; indx++ ) {\n\t\t\t\tts.setColumnAriaLabel( c, c.$headers.eq( indx ) );\n\t\t\t}\n\t\t},\n\n\t\t// nextSort (optional), lets you disable next sort text\n\t\tsetColumnAriaLabel : function( c, $header, nextSort ) {\n\t\t\tif ( $header.length ) {\n\t\t\t\tvar column = parseInt( $header.attr( 'data-column' ), 10 ),\n\t\t\t\t\ttmp = $header.hasClass( ts.css.sortAsc ) ?\n\t\t\t\t\t\t'sortAsc' :\n\t\t\t\t\t\t$header.hasClass( ts.css.sortDesc ) ? 'sortDesc' : 'sortNone',\n\t\t\t\t\ttxt = $.trim( $header.text() ) + ': ' + ts.language[ tmp ];\n\t\t\t\tif ( $header.hasClass( 'sorter-false' ) || nextSort === false ) {\n\t\t\t\t\ttxt += ts.language.sortDisabled;\n\t\t\t\t} else {\n\t\t\t\t\tnextSort = c.sortVars[ column ].order[ ( c.sortVars[ column ].count + 1 ) % ( c.sortReset ? 3 : 2 ) ];\n\t\t\t\t\t// if nextSort\n\t\t\t\t\ttxt += ts.language[ nextSort === 0 ? 'nextAsc' : nextSort === 1 ? 'nextDesc' : 'nextNone' ];\n\t\t\t\t}\n\t\t\t\t$header.attr( 'aria-label', txt );\n\t\t\t}\n\t\t},\n\n\t\tupdateHeader : function( c ) {\n\t\t\tvar index, isDisabled, $header, col,\n\t\t\t\ttable = c.table,\n\t\t\t\tlen = c.$headers.length;\n\t\t\tfor ( index = 0; index < len; index++ ) {\n\t\t\t\t$header = c.$headers.eq( index );\n\t\t\t\tcol = ts.getColumnData( table, c.headers, index, true );\n\t\t\t\t// add 'sorter-false' class if 'parser-false' is set\n\t\t\t\tisDisabled = ts.getData( $header, col, 'sorter' ) === 'false' || ts.getData( $header, col, 'parser' ) === 'false';\n\t\t\t\tts.setColumnSort( c, $header, isDisabled );\n\t\t\t}\n\t\t},\n\n\t\tsetColumnSort : function( c, $header, isDisabled ) {\n\t\t\tvar id = c.table.id;\n\t\t\t$header[ 0 ].sortDisabled = isDisabled;\n\t\t\t$header[ isDisabled ? 'addClass' : 'removeClass' ]( 'sorter-false' )\n\t\t\t\t.attr( 'aria-disabled', '' + isDisabled );\n\t\t\t// disable tab index on disabled cells\n\t\t\tif ( c.tabIndex ) {\n\t\t\t\tif ( isDisabled ) {\n\t\t\t\t\t$header.removeAttr( 'tabindex' );\n\t\t\t\t} else {\n\t\t\t\t\t$header.attr( 'tabindex', '0' );\n\t\t\t\t}\n\t\t\t}\n\t\t\t// aria-controls - requires table ID\n\t\t\tif ( id ) {\n\t\t\t\tif ( isDisabled ) {\n\t\t\t\t\t$header.removeAttr( 'aria-controls' );\n\t\t\t\t} else {\n\t\t\t\t\t$header.attr( 'aria-controls', id );\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\n\t\tupdateHeaderSortCount : function( c, list ) {\n\t\t\tvar col, dir, group, indx, primary, temp, val, order,\n\t\t\t\tsortList = list || c.sortList,\n\t\t\t\tlen = sortList.length;\n\t\t\tc.sortList = [];\n\t\t\tfor ( indx = 0; indx < len; indx++ ) {\n\t\t\t\tval = sortList[ indx ];\n\t\t\t\t// ensure all sortList values are numeric - fixes #127\n\t\t\t\tcol = parseInt( val[ 0 ], 10 );\n\t\t\t\t// prevents error if sorton array is wrong\n\t\t\t\tif ( col < c.columns ) {\n\n\t\t\t\t\t// set order if not already defined - due to colspan header without associated header cell\n\t\t\t\t\t// adding this check prevents a javascript error\n\t\t\t\t\tif ( !c.sortVars[ col ].order ) {\n\t\t\t\t\t\torder = c.sortVars[ col ].order = ts.getOrder( c.sortInitialOrder ) ? [ 1, 0, 2 ] : [ 0, 1, 2 ];\n\t\t\t\t\t\tc.sortVars[ col ].count = 0;\n\t\t\t\t\t}\n\n\t\t\t\t\torder = c.sortVars[ col ].order;\n\t\t\t\t\tdir = ( '' + val[ 1 ] ).match( /^(1|d|s|o|n)/ );\n\t\t\t\t\tdir = dir ? dir[ 0 ] : '';\n\t\t\t\t\t// 0/(a)sc (default), 1/(d)esc, (s)ame, (o)pposite, (n)ext\n\t\t\t\t\tswitch ( dir ) {\n\t\t\t\t\t\tcase '1' : case 'd' : // descending\n\t\t\t\t\t\t\tdir = 1;\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 's' : // same direction (as primary column)\n\t\t\t\t\t\t\t// if primary sort is set to 's', make it ascending\n\t\t\t\t\t\t\tdir = primary || 0;\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 'o' :\n\t\t\t\t\t\t\ttemp = order[ ( primary || 0 ) % ( c.sortReset ? 3 : 2 ) ];\n\t\t\t\t\t\t\t// opposite of primary column; but resets if primary resets\n\t\t\t\t\t\t\tdir = temp === 0 ? 1 : temp === 1 ? 0 : 2;\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 'n' :\n\t\t\t\t\t\t\tdir = order[ ( ++c.sortVars[ col ].count ) % ( c.sortReset ? 3 : 2 ) ];\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tdefault : // ascending\n\t\t\t\t\t\t\tdir = 0;\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t\tprimary = indx === 0 ? dir : primary;\n\t\t\t\t\tgroup = [ col, parseInt( dir, 10 ) || 0 ];\n\t\t\t\t\tc.sortList[ c.sortList.length ] = group;\n\t\t\t\t\tdir = $.inArray( group[ 1 ], order ); // fixes issue #167\n\t\t\t\t\tc.sortVars[ col ].count = dir >= 0 ? dir : group[ 1 ] % ( c.sortReset ? 3 : 2 );\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\n\t\tupdateAll : function( c, resort, callback ) {\n\t\t\tvar table = c.table;\n\t\t\ttable.isUpdating = true;\n\t\t\tts.refreshWidgets( table, true, true );\n\t\t\tts.buildHeaders( c );\n\t\t\tts.bindEvents( table, c.$headers, true );\n\t\t\tts.bindMethods( c );\n\t\t\tts.commonUpdate( c, resort, callback );\n\t\t},\n\n\t\tupdate : function( c, resort, callback ) {\n\t\t\tvar table = c.table;\n\t\t\ttable.isUpdating = true;\n\t\t\t// update sorting (if enabled/disabled)\n\t\t\tts.updateHeader( c );\n\t\t\tts.commonUpdate( c, resort, callback );\n\t\t},\n\n\t\t// simple header update - see #989\n\t\tupdateHeaders : function( c, callback ) {\n\t\t\tc.table.isUpdating = true;\n\t\t\tts.buildHeaders( c );\n\t\t\tts.bindEvents( c.table, c.$headers, true );\n\t\t\tts.resortComplete( c, callback );\n\t\t},\n\n\t\tupdateCell : function( c, cell, resort, callback ) {\n\t\t\tif ( ts.isEmptyObject( c.cache ) ) {\n\t\t\t\t// empty table, do an update instead - fixes #1099\n\t\t\t\tts.updateHeader( c );\n\t\t\t\tts.commonUpdate( c, resort, callback );\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tc.table.isUpdating = true;\n\t\t\tc.$table.find( c.selectorRemove ).remove();\n\t\t\t// get position from the dom\n\t\t\tvar tmp, indx, row, icell, cache, len,\n\t\t\t\t$tbodies = c.$tbodies,\n\t\t\t\t$cell = $( cell ),\n\t\t\t\t// update cache - format: function( s, table, cell, cellIndex )\n\t\t\t\t// no closest in jQuery v1.2.6\n\t\t\t\ttbodyIndex = $tbodies\n\t\t\t\t\t.index( $.fn.closest ? $cell.closest( 'tbody' ) : $cell.parents( 'tbody' ).filter( ':first' ) ),\n\t\t\t\ttbcache = c.cache[ tbodyIndex ],\n\t\t\t\t$row = $.fn.closest ? $cell.closest( 'tr' ) : $cell.parents( 'tr' ).filter( ':first' );\n\t\t\tcell = $cell[ 0 ]; // in case cell is a jQuery object\n\t\t\t// tbody may not exist if update is initialized while tbody is removed for processing\n\t\t\tif ( $tbodies.length && tbodyIndex >= 0 ) {\n\t\t\t\trow = $tbodies.eq( tbodyIndex ).find( 'tr' ).index( $row );\n\t\t\t\tcache = tbcache.normalized[ row ];\n\t\t\t\tlen = $row[ 0 ].cells.length;\n\t\t\t\tif ( len !== c.columns ) {\n\t\t\t\t\t// colspan in here somewhere!\n\t\t\t\t\ticell = 0;\n\t\t\t\t\ttmp = false;\n\t\t\t\t\tfor ( indx = 0; indx < len; indx++ ) {\n\t\t\t\t\t\tif ( !tmp && $row[ 0 ].cells[ indx ] !== cell ) {\n\t\t\t\t\t\t\ticell += $row[ 0 ].cells[ indx ].colSpan;\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\ttmp = true;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\ticell = $cell.index();\n\t\t\t\t}\n\t\t\t\ttmp = ts.getElementText( c, cell, icell ); // raw\n\t\t\t\tcache[ c.columns ].raw[ icell ] = tmp;\n\t\t\t\ttmp = ts.getParsedText( c, cell, icell, tmp );\n\t\t\t\tcache[ icell ] = tmp; // parsed\n\t\t\t\tcache[ c.columns ].$row = $row;\n\t\t\t\tif ( ( c.parsers[ icell ].type || '' ).toLowerCase() === 'numeric' ) {\n\t\t\t\t\t// update column max value (ignore sign)\n\t\t\t\t\ttbcache.colMax[ icell ] = Math.max( Math.abs( tmp ) || 0, tbcache.colMax[ icell ] || 0 );\n\t\t\t\t}\n\t\t\t\ttmp = resort !== 'undefined' ? resort : c.resort;\n\t\t\t\tif ( tmp !== false ) {\n\t\t\t\t\t// widgets will be reapplied\n\t\t\t\t\tts.checkResort( c, tmp, callback );\n\t\t\t\t} else {\n\t\t\t\t\t// don't reapply widgets is resort is false, just in case it causes\n\t\t\t\t\t// problems with element focus\n\t\t\t\t\tts.resortComplete( c, callback );\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tif ( c.debug ) {\n\t\t\t\t\tconsole.error( 'updateCell aborted, tbody missing or not within the indicated table' );\n\t\t\t\t}\n\t\t\t\tc.table.isUpdating = false;\n\t\t\t}\n\t\t},\n\n\t\taddRows : function( c, $row, resort, callback ) {\n\t\t\tvar txt, val, tbodyIndex, rowIndex, rows, cellIndex, len, order,\n\t\t\t\tcacheIndex, rowData, cells, cell, span,\n\t\t\t\t// allow passing a row string if only one non-info tbody exists in the table\n\t\t\t\tvalid = typeof $row === 'string' && c.$tbodies.length === 1 && /<tr/.test( $row || '' ),\n\t\t\t\ttable = c.table;\n\t\t\tif ( valid ) {\n\t\t\t\t$row = $( $row );\n\t\t\t\tc.$tbodies.append( $row );\n\t\t\t} else if ( !$row ||\n\t\t\t\t// row is a jQuery object?\n\t\t\t\t!( $row instanceof jQuery ) ||\n\t\t\t\t// row contained in the table?\n\t\t\t\t( $.fn.closest ? $row.closest( 'table' )[ 0 ] : $row.parents( 'table' )[ 0 ] ) !== c.table ) {\n\t\t\t\tif ( c.debug ) {\n\t\t\t\t\tconsole.error( 'addRows method requires (1) a jQuery selector reference to rows that have already ' +\n\t\t\t\t\t\t'been added to the table, or (2) row HTML string to be added to a table with only one tbody' );\n\t\t\t\t}\n\t\t\t\treturn false;\n\t\t\t}\n\t\t\ttable.isUpdating = true;\n\t\t\tif ( ts.isEmptyObject( c.cache ) ) {\n\t\t\t\t// empty table, do an update instead - fixes #450\n\t\t\t\tts.updateHeader( c );\n\t\t\t\tts.commonUpdate( c, resort, callback );\n\t\t\t} else {\n\t\t\t\trows = $row.filter( 'tr' ).attr( 'role', 'row' ).length;\n\t\t\t\ttbodyIndex = c.$tbodies.index( $row.parents( 'tbody' ).filter( ':first' ) );\n\t\t\t\t// fixes adding rows to an empty table - see issue #179\n\t\t\t\tif ( !( c.parsers && c.parsers.length ) ) {\n\t\t\t\t\tts.setupParsers( c );\n\t\t\t\t}\n\t\t\t\t// add each row\n\t\t\t\tfor ( rowIndex = 0; rowIndex < rows; rowIndex++ ) {\n\t\t\t\t\tcacheIndex = 0;\n\t\t\t\t\tlen = $row[ rowIndex ].cells.length;\n\t\t\t\t\torder = c.cache[ tbodyIndex ].normalized.length;\n\t\t\t\t\tcells = [];\n\t\t\t\t\trowData = {\n\t\t\t\t\t\tchild : [],\n\t\t\t\t\t\traw : [],\n\t\t\t\t\t\t$row : $row.eq( rowIndex ),\n\t\t\t\t\t\torder : order\n\t\t\t\t\t};\n\t\t\t\t\t// add each cell\n\t\t\t\t\tfor ( cellIndex = 0; cellIndex < len; cellIndex++ ) {\n\t\t\t\t\t\tcell = $row[ rowIndex ].cells[ cellIndex ];\n\t\t\t\t\t\ttxt = ts.getElementText( c, cell, cacheIndex );\n\t\t\t\t\t\trowData.raw[ cacheIndex ] = txt;\n\t\t\t\t\t\tval = ts.getParsedText( c, cell, cacheIndex, txt );\n\t\t\t\t\t\tcells[ cacheIndex ] = val;\n\t\t\t\t\t\tif ( ( c.parsers[ cacheIndex ].type || '' ).toLowerCase() === 'numeric' ) {\n\t\t\t\t\t\t\t// update column max value (ignore sign)\n\t\t\t\t\t\t\tc.cache[ tbodyIndex ].colMax[ cacheIndex ] =\n\t\t\t\t\t\t\t\tMath.max( Math.abs( val ) || 0, c.cache[ tbodyIndex ].colMax[ cacheIndex ] || 0 );\n\t\t\t\t\t\t}\n\t\t\t\t\t\tspan = cell.colSpan - 1;\n\t\t\t\t\t\tif ( span > 0 ) {\n\t\t\t\t\t\t\tcacheIndex += span;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tcacheIndex++;\n\t\t\t\t\t}\n\t\t\t\t\t// add the row data to the end\n\t\t\t\t\tcells[ c.columns ] = rowData;\n\t\t\t\t\t// update cache\n\t\t\t\t\tc.cache[ tbodyIndex ].normalized[ order ] = cells;\n\t\t\t\t}\n\t\t\t\t// resort using current settings\n\t\t\t\tts.checkResort( c, resort, callback );\n\t\t\t}\n\t\t},\n\n\t\tupdateCache : function( c, callback, $tbodies ) {\n\t\t\t// rebuild parsers\n\t\t\tif ( !( c.parsers && c.parsers.length ) ) {\n\t\t\t\tts.setupParsers( c, $tbodies );\n\t\t\t}\n\t\t\t// rebuild the cache map\n\t\t\tts.buildCache( c, callback, $tbodies );\n\t\t},\n\n\t\t// init flag (true) used by pager plugin to prevent widget application\n\t\t// renamed from appendToTable\n\t\tappendCache : function( c, init ) {\n\t\t\tvar parsed, totalRows, $tbody, $curTbody, rowIndex, tbodyIndex, appendTime,\n\t\t\t\ttable = c.table,\n\t\t\t\two = c.widgetOptions,\n\t\t\t\t$tbodies = c.$tbodies,\n\t\t\t\trows = [],\n\t\t\t\tcache = c.cache;\n\t\t\t// empty table - fixes #206/#346\n\t\t\tif ( ts.isEmptyObject( cache ) ) {\n\t\t\t\t// run pager appender in case the table was just emptied\n\t\t\t\treturn c.appender ? c.appender( table, rows ) :\n\t\t\t\t\ttable.isUpdating ? c.$table.triggerHandler( 'updateComplete', table ) : ''; // Fixes #532\n\t\t\t}\n\t\t\tif ( c.debug ) {\n\t\t\t\tappendTime = new Date();\n\t\t\t}\n\t\t\tfor ( tbodyIndex = 0; tbodyIndex < $tbodies.length; tbodyIndex++ ) {\n\t\t\t\t$tbody = $tbodies.eq( tbodyIndex );\n\t\t\t\tif ( $tbody.length ) {\n\t\t\t\t\t// detach tbody for manipulation\n\t\t\t\t\t$curTbody = ts.processTbody( table, $tbody, true );\n\t\t\t\t\tparsed = cache[ tbodyIndex ].normalized;\n\t\t\t\t\ttotalRows = parsed.length;\n\t\t\t\t\tfor ( rowIndex = 0; rowIndex < totalRows; rowIndex++ ) {\n\t\t\t\t\t\trows[rows.length] = parsed[ rowIndex ][ c.columns ].$row;\n\t\t\t\t\t\t// removeRows used by the pager plugin; don't render if using ajax - fixes #411\n\t\t\t\t\t\tif ( !c.appender || ( c.pager && ( !c.pager.removeRows || !wo.pager_removeRows ) && !c.pager.ajax ) ) {\n\t\t\t\t\t\t\t$curTbody.append( parsed[ rowIndex ][ c.columns ].$row );\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\t// restore tbody\n\t\t\t\t\tts.processTbody( table, $curTbody, false );\n\t\t\t\t}\n\t\t\t}\n\t\t\tif ( c.appender ) {\n\t\t\t\tc.appender( table, rows );\n\t\t\t}\n\t\t\tif ( c.debug ) {\n\t\t\t\tconsole.log( 'Rebuilt table' + ts.benchmark( appendTime ) );\n\t\t\t}\n\t\t\t// apply table widgets; but not before ajax completes\n\t\t\tif ( !init && !c.appender ) {\n\t\t\t\tts.applyWidget( table );\n\t\t\t}\n\t\t\tif ( table.isUpdating ) {\n\t\t\t\tc.$table.triggerHandler( 'updateComplete', table );\n\t\t\t}\n\t\t},\n\n\t\tcommonUpdate : function( c, resort, callback ) {\n\t\t\t// remove rows/elements before update\n\t\t\tc.$table.find( c.selectorRemove ).remove();\n\t\t\t// rebuild parsers\n\t\t\tts.setupParsers( c );\n\t\t\t// rebuild the cache map\n\t\t\tts.buildCache( c );\n\t\t\tts.checkResort( c, resort, callback );\n\t\t},\n\n\t\t/*\n\t\t▄█████ ▄████▄ █████▄ ██████ ██ █████▄ ▄████▄\n\t\t▀█▄    ██  ██ ██▄▄██   ██   ██ ██  ██ ██ ▄▄▄\n\t\t   ▀█▄ ██  ██ ██▀██    ██   ██ ██  ██ ██ ▀██\n\t\t█████▀ ▀████▀ ██  ██   ██   ██ ██  ██ ▀████▀\n\t\t*/\n\t\tinitSort : function( c, cell, event ) {\n\t\t\tif ( c.table.isUpdating ) {\n\t\t\t\t// let any updates complete before initializing a sort\n\t\t\t\treturn setTimeout( function(){\n\t\t\t\t\tts.initSort( c, cell, event );\n\t\t\t\t}, 50 );\n\t\t\t}\n\n\t\t\tvar arry, indx, headerIndx, dir, temp, tmp, $header,\n\t\t\t\tnotMultiSort = !event[ c.sortMultiSortKey ],\n\t\t\t\ttable = c.table,\n\t\t\t\tlen = c.$headers.length,\n\t\t\t\t// get current column index\n\t\t\t\tcol = parseInt( $( cell ).attr( 'data-column' ), 10 ),\n\t\t\t\torder = c.sortVars[ col ].order;\n\n\t\t\t// Only call sortStart if sorting is enabled\n\t\t\tc.$table.triggerHandler( 'sortStart', table );\n\t\t\t// get current column sort order\n\t\t\tc.sortVars[ col ].count =\n\t\t\t\tevent[ c.sortResetKey ] ? 2 : ( c.sortVars[ col ].count + 1 ) % ( c.sortReset ? 3 : 2 );\n\t\t\t// reset all sorts on non-current column - issue #30\n\t\t\tif ( c.sortRestart ) {\n\t\t\t\tfor ( headerIndx = 0; headerIndx < len; headerIndx++ ) {\n\t\t\t\t\t$header = c.$headers.eq( headerIndx );\n\t\t\t\t\ttmp = parseInt( $header.attr( 'data-column' ), 10 );\n\t\t\t\t\t// only reset counts on columns that weren't just clicked on and if not included in a multisort\n\t\t\t\t\tif ( col !== tmp && ( notMultiSort || $header.hasClass( ts.css.sortNone ) ) ) {\n\t\t\t\t\t\tc.sortVars[ tmp ].count = -1;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\t// user only wants to sort on one column\n\t\t\tif ( notMultiSort ) {\n\t\t\t\t// flush the sort list\n\t\t\t\tc.sortList = [];\n\t\t\t\tc.last.sortList = [];\n\t\t\t\tif ( c.sortForce !== null ) {\n\t\t\t\t\tarry = c.sortForce;\n\t\t\t\t\tfor ( indx = 0; indx < arry.length; indx++ ) {\n\t\t\t\t\t\tif ( arry[ indx ][ 0 ] !== col ) {\n\t\t\t\t\t\t\tc.sortList[ c.sortList.length ] = arry[ indx ];\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\t// add column to sort list\n\t\t\t\tdir = order[ c.sortVars[ col ].count ];\n\t\t\t\tif ( dir < 2 ) {\n\t\t\t\t\tc.sortList[ c.sortList.length ] = [ col, dir ];\n\t\t\t\t\t// add other columns if header spans across multiple\n\t\t\t\t\tif ( cell.colSpan > 1 ) {\n\t\t\t\t\t\tfor ( indx = 1; indx < cell.colSpan; indx++ ) {\n\t\t\t\t\t\t\tc.sortList[ c.sortList.length ] = [ col + indx, dir ];\n\t\t\t\t\t\t\t// update count on columns in colSpan\n\t\t\t\t\t\t\tc.sortVars[ col + indx ].count = $.inArray( dir, order );\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\t// multi column sorting\n\t\t\t} else {\n\t\t\t\t// get rid of the sortAppend before adding more - fixes issue #115 & #523\n\t\t\t\tc.sortList = $.extend( [], c.last.sortList );\n\n\t\t\t\t// the user has clicked on an already sorted column\n\t\t\t\tif ( ts.isValueInArray( col, c.sortList ) >= 0 ) {\n\t\t\t\t\t// reverse the sorting direction\n\t\t\t\t\tfor ( indx = 0; indx < c.sortList.length; indx++ ) {\n\t\t\t\t\t\ttmp = c.sortList[ indx ];\n\t\t\t\t\t\tif ( tmp[ 0 ] === col ) {\n\t\t\t\t\t\t\t// order.count seems to be incorrect when compared to cell.count\n\t\t\t\t\t\t\ttmp[ 1 ] = order[ c.sortVars[ col ].count ];\n\t\t\t\t\t\t\tif ( tmp[1] === 2 ) {\n\t\t\t\t\t\t\t\tc.sortList.splice( indx, 1 );\n\t\t\t\t\t\t\t\tc.sortVars[ col ].count = -1;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\t// add column to sort list array\n\t\t\t\t\tdir = order[ c.sortVars[ col ].count ];\n\t\t\t\t\tif ( dir < 2 ) {\n\t\t\t\t\t\tc.sortList[ c.sortList.length ] = [ col, dir ];\n\t\t\t\t\t\t// add other columns if header spans across multiple\n\t\t\t\t\t\tif ( cell.colSpan > 1 ) {\n\t\t\t\t\t\t\tfor ( indx = 1; indx < cell.colSpan; indx++ ) {\n\t\t\t\t\t\t\t\tc.sortList[ c.sortList.length ] = [ col + indx, dir ];\n\t\t\t\t\t\t\t\t// update count on columns in colSpan\n\t\t\t\t\t\t\t\tc.sortVars[ col + indx ].count = $.inArray( dir, order );\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\t// save sort before applying sortAppend\n\t\t\tc.last.sortList = $.extend( [], c.sortList );\n\t\t\tif ( c.sortList.length && c.sortAppend ) {\n\t\t\t\tarry = $.isArray( c.sortAppend ) ? c.sortAppend : c.sortAppend[ c.sortList[ 0 ][ 0 ] ];\n\t\t\t\tif ( !ts.isEmptyObject( arry ) ) {\n\t\t\t\t\tfor ( indx = 0; indx < arry.length; indx++ ) {\n\t\t\t\t\t\tif ( arry[ indx ][ 0 ] !== col && ts.isValueInArray( arry[ indx ][ 0 ], c.sortList ) < 0 ) {\n\t\t\t\t\t\t\tdir = arry[ indx ][ 1 ];\n\t\t\t\t\t\t\ttemp = ( '' + dir ).match( /^(a|d|s|o|n)/ );\n\t\t\t\t\t\t\tif ( temp ) {\n\t\t\t\t\t\t\t\ttmp = c.sortList[ 0 ][ 1 ];\n\t\t\t\t\t\t\t\tswitch ( temp[ 0 ] ) {\n\t\t\t\t\t\t\t\t\tcase 'd' :\n\t\t\t\t\t\t\t\t\t\tdir = 1;\n\t\t\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t\t\tcase 's' :\n\t\t\t\t\t\t\t\t\t\tdir = tmp;\n\t\t\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t\t\tcase 'o' :\n\t\t\t\t\t\t\t\t\t\tdir = tmp === 0 ? 1 : 0;\n\t\t\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t\t\tcase 'n' :\n\t\t\t\t\t\t\t\t\t\tdir = ( tmp + 1 ) % ( c.sortReset ? 3 : 2 );\n\t\t\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t\t\tdefault:\n\t\t\t\t\t\t\t\t\t\tdir = 0;\n\t\t\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tc.sortList[ c.sortList.length ] = [ arry[ indx ][ 0 ], dir ];\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\t// sortBegin event triggered immediately before the sort\n\t\t\tc.$table.triggerHandler( 'sortBegin', table );\n\t\t\t// setTimeout needed so the processing icon shows up\n\t\t\tsetTimeout( function() {\n\t\t\t\t// set css for headers\n\t\t\t\tts.setHeadersCss( c );\n\t\t\t\tts.multisort( c );\n\t\t\t\tts.appendCache( c );\n\t\t\t\tc.$table.triggerHandler( 'sortBeforeEnd', table );\n\t\t\t\tc.$table.triggerHandler( 'sortEnd', table );\n\t\t\t}, 1 );\n\t\t},\n\n\t\t// sort multiple columns\n\t\tmultisort : function( c ) { /*jshint loopfunc:true */\n\t\t\tvar tbodyIndex, sortTime, colMax, rows,\n\t\t\t\ttable = c.table,\n\t\t\t\tdir = 0,\n\t\t\t\ttextSorter = c.textSorter || '',\n\t\t\t\tsortList = c.sortList,\n\t\t\t\tsortLen = sortList.length,\n\t\t\t\tlen = c.$tbodies.length;\n\t\t\tif ( c.serverSideSorting || ts.isEmptyObject( c.cache ) ) {\n\t\t\t\t// empty table - fixes #206/#346\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif ( c.debug ) { sortTime = new Date(); }\n\t\t\tfor ( tbodyIndex = 0; tbodyIndex < len; tbodyIndex++ ) {\n\t\t\t\tcolMax = c.cache[ tbodyIndex ].colMax;\n\t\t\t\trows = c.cache[ tbodyIndex ].normalized;\n\n\t\t\t\trows.sort( function( a, b ) {\n\t\t\t\t\tvar sortIndex, num, col, order, sort, x, y;\n\t\t\t\t\t// rows is undefined here in IE, so don't use it!\n\t\t\t\t\tfor ( sortIndex = 0; sortIndex < sortLen; sortIndex++ ) {\n\t\t\t\t\t\tcol = sortList[ sortIndex ][ 0 ];\n\t\t\t\t\t\torder = sortList[ sortIndex ][ 1 ];\n\t\t\t\t\t\t// sort direction, true = asc, false = desc\n\t\t\t\t\t\tdir = order === 0;\n\n\t\t\t\t\t\tif ( c.sortStable && a[ col ] === b[ col ] && sortLen === 1 ) {\n\t\t\t\t\t\t\treturn a[ c.columns ].order - b[ c.columns ].order;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// fallback to natural sort since it is more robust\n\t\t\t\t\t\tnum = /n/i.test( ts.getSortType( c.parsers, col ) );\n\t\t\t\t\t\tif ( num && c.strings[ col ] ) {\n\t\t\t\t\t\t\t// sort strings in numerical columns\n\t\t\t\t\t\t\tif ( typeof ( ts.string[ c.strings[ col ] ] ) === 'boolean' ) {\n\t\t\t\t\t\t\t\tnum = ( dir ? 1 : -1 ) * ( ts.string[ c.strings[ col ] ] ? -1 : 1 );\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\tnum = ( c.strings[ col ] ) ? ts.string[ c.strings[ col ] ] || 0 : 0;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t// fall back to built-in numeric sort\n\t\t\t\t\t\t\t// var sort = $.tablesorter['sort' + s]( a[col], b[col], dir, colMax[col], table );\n\t\t\t\t\t\t\tsort = c.numberSorter ? c.numberSorter( a[ col ], b[ col ], dir, colMax[ col ], table ) :\n\t\t\t\t\t\t\t\tts[ 'sortNumeric' + ( dir ? 'Asc' : 'Desc' ) ]( a[ col ], b[ col ], num, colMax[ col ], col, c );\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t// set a & b depending on sort direction\n\t\t\t\t\t\t\tx = dir ? a : b;\n\t\t\t\t\t\t\ty = dir ? b : a;\n\t\t\t\t\t\t\t// text sort function\n\t\t\t\t\t\t\tif ( typeof textSorter === 'function' ) {\n\t\t\t\t\t\t\t\t// custom OVERALL text sorter\n\t\t\t\t\t\t\t\tsort = textSorter( x[ col ], y[ col ], dir, col, table );\n\t\t\t\t\t\t\t} else if ( typeof textSorter === 'object' && textSorter.hasOwnProperty( col ) ) {\n\t\t\t\t\t\t\t\t// custom text sorter for a SPECIFIC COLUMN\n\t\t\t\t\t\t\t\tsort = textSorter[ col ]( x[ col ], y[ col ], dir, col, table );\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t// fall back to natural sort\n\t\t\t\t\t\t\t\tsort = ts[ 'sortNatural' + ( dir ? 'Asc' : 'Desc' ) ]( a[ col ], b[ col ], col, c );\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif ( sort ) { return sort; }\n\t\t\t\t\t}\n\t\t\t\t\treturn a[ c.columns ].order - b[ c.columns ].order;\n\t\t\t\t});\n\t\t\t}\n\t\t\tif ( c.debug ) {\n\t\t\t\tconsole.log( 'Applying sort ' + sortList.toString() + ts.benchmark( sortTime ) );\n\t\t\t}\n\t\t},\n\n\t\tresortComplete : function( c, callback ) {\n\t\t\tif ( c.table.isUpdating ) {\n\t\t\t\tc.$table.triggerHandler( 'updateComplete', c.table );\n\t\t\t}\n\t\t\tif ( $.isFunction( callback ) ) {\n\t\t\t\tcallback( c.table );\n\t\t\t}\n\t\t},\n\n\t\tcheckResort : function( c, resort, callback ) {\n\t\t\tvar sortList = $.isArray( resort ) ? resort : c.sortList,\n\t\t\t\t// if no resort parameter is passed, fallback to config.resort (true by default)\n\t\t\t\tresrt = typeof resort === 'undefined' ? c.resort : resort;\n\t\t\t// don't try to resort if the table is still processing\n\t\t\t// this will catch spamming of the updateCell method\n\t\t\tif ( resrt !== false && !c.serverSideSorting && !c.table.isProcessing ) {\n\t\t\t\tif ( sortList.length ) {\n\t\t\t\t\tts.sortOn( c, sortList, function() {\n\t\t\t\t\t\tts.resortComplete( c, callback );\n\t\t\t\t\t}, true );\n\t\t\t\t} else {\n\t\t\t\t\tts.sortReset( c, function() {\n\t\t\t\t\t\tts.resortComplete( c, callback );\n\t\t\t\t\t\tts.applyWidget( c.table, false );\n\t\t\t\t\t} );\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tts.resortComplete( c, callback );\n\t\t\t\tts.applyWidget( c.table, false );\n\t\t\t}\n\t\t},\n\n\t\tsortOn : function( c, list, callback, init ) {\n\t\t\tvar table = c.table;\n\t\t\tc.$table.triggerHandler( 'sortStart', table );\n\t\t\t// update header count index\n\t\t\tts.updateHeaderSortCount( c, list );\n\t\t\t// set css for headers\n\t\t\tts.setHeadersCss( c );\n\t\t\t// fixes #346\n\t\t\tif ( c.delayInit && ts.isEmptyObject( c.cache ) ) {\n\t\t\t\tts.buildCache( c );\n\t\t\t}\n\t\t\tc.$table.triggerHandler( 'sortBegin', table );\n\t\t\t// sort the table and append it to the dom\n\t\t\tts.multisort( c );\n\t\t\tts.appendCache( c, init );\n\t\t\tc.$table.triggerHandler( 'sortBeforeEnd', table );\n\t\t\tc.$table.triggerHandler( 'sortEnd', table );\n\t\t\tts.applyWidget( table );\n\t\t\tif ( $.isFunction( callback ) ) {\n\t\t\t\tcallback( table );\n\t\t\t}\n\t\t},\n\n\t\tsortReset : function( c, callback ) {\n\t\t\tc.sortList = [];\n\t\t\tts.setHeadersCss( c );\n\t\t\tts.multisort( c );\n\t\t\tts.appendCache( c );\n\t\t\tif ( $.isFunction( callback ) ) {\n\t\t\t\tcallback( c.table );\n\t\t\t}\n\t\t},\n\n\t\tgetSortType : function( parsers, column ) {\n\t\t\treturn ( parsers && parsers[ column ] ) ? parsers[ column ].type || '' : '';\n\t\t},\n\n\t\tgetOrder : function( val ) {\n\t\t\t// look for 'd' in 'desc' order; return true\n\t\t\treturn ( /^d/i.test( val ) || val === 1 );\n\t\t},\n\n\t\t// Natural sort - https://github.com/overset/javascript-natural-sort (date sorting removed)\n\t\t// this function will only accept strings, or you'll see 'TypeError: undefined is not a function'\n\t\t// I could add a = a.toString(); b = b.toString(); but it'll slow down the sort overall\n\t\tsortNatural : function( a, b ) {\n\t\t\tif ( a === b ) { return 0; }\n\t\t\tvar aNum, bNum, aFloat, bFloat, indx, max,\n\t\t\t\tregex = ts.regex;\n\t\t\t// first try and sort Hex codes\n\t\t\tif ( regex.hex.test( b ) ) {\n\t\t\t\taNum = parseInt( ( a || '' ).match( regex.hex ), 16 );\n\t\t\t\tbNum = parseInt( ( b || '' ).match( regex.hex ), 16 );\n\t\t\t\tif ( aNum < bNum ) { return -1; }\n\t\t\t\tif ( aNum > bNum ) { return 1; }\n\t\t\t}\n\t\t\t// chunk/tokenize\n\t\t\taNum = ( a || '' ).replace( regex.chunk, '\\\\0$1\\\\0' ).replace( regex.chunks, '' ).split( '\\\\0' );\n\t\t\tbNum = ( b || '' ).replace( regex.chunk, '\\\\0$1\\\\0' ).replace( regex.chunks, '' ).split( '\\\\0' );\n\t\t\tmax = Math.max( aNum.length, bNum.length );\n\t\t\t// natural sorting through split numeric strings and default strings\n\t\t\tfor ( indx = 0; indx < max; indx++ ) {\n\t\t\t\t// find floats not starting with '0', string or 0 if not defined\n\t\t\t\taFloat = isNaN( aNum[ indx ] ) ? aNum[ indx ] || 0 : parseFloat( aNum[ indx ] ) || 0;\n\t\t\t\tbFloat = isNaN( bNum[ indx ] ) ? bNum[ indx ] || 0 : parseFloat( bNum[ indx ] ) || 0;\n\t\t\t\t// handle numeric vs string comparison - number < string - (Kyle Adams)\n\t\t\t\tif ( isNaN( aFloat ) !== isNaN( bFloat ) ) { return isNaN( aFloat ) ? 1 : -1; }\n\t\t\t\t// rely on string comparison if different types - i.e. '02' < 2 != '02' < '2'\n\t\t\t\tif ( typeof aFloat !== typeof bFloat ) {\n\t\t\t\t\taFloat += '';\n\t\t\t\t\tbFloat += '';\n\t\t\t\t}\n\t\t\t\tif ( aFloat < bFloat ) { return -1; }\n\t\t\t\tif ( aFloat > bFloat ) { return 1; }\n\t\t\t}\n\t\t\treturn 0;\n\t\t},\n\n\t\tsortNaturalAsc : function( a, b, col, c ) {\n\t\t\tif ( a === b ) { return 0; }\n\t\t\tvar empty = ts.string[ ( c.empties[ col ] || c.emptyTo ) ];\n\t\t\tif ( a === '' && empty !== 0 ) { return typeof empty === 'boolean' ? ( empty ? -1 : 1 ) : -empty || -1; }\n\t\t\tif ( b === '' && empty !== 0 ) { return typeof empty === 'boolean' ? ( empty ? 1 : -1 ) : empty || 1; }\n\t\t\treturn ts.sortNatural( a, b );\n\t\t},\n\n\t\tsortNaturalDesc : function( a, b, col, c ) {\n\t\t\tif ( a === b ) { return 0; }\n\t\t\tvar empty = ts.string[ ( c.empties[ col ] || c.emptyTo ) ];\n\t\t\tif ( a === '' && empty !== 0 ) { return typeof empty === 'boolean' ? ( empty ? -1 : 1 ) : empty || 1; }\n\t\t\tif ( b === '' && empty !== 0 ) { return typeof empty === 'boolean' ? ( empty ? 1 : -1 ) : -empty || -1; }\n\t\t\treturn ts.sortNatural( b, a );\n\t\t},\n\n\t\t// basic alphabetical sort\n\t\tsortText : function( a, b ) {\n\t\t\treturn a > b ? 1 : ( a < b ? -1 : 0 );\n\t\t},\n\n\t\t// return text string value by adding up ascii value\n\t\t// so the text is somewhat sorted when using a digital sort\n\t\t// this is NOT an alphanumeric sort\n\t\tgetTextValue : function( val, num, max ) {\n\t\t\tif ( max ) {\n\t\t\t\t// make sure the text value is greater than the max numerical value (max)\n\t\t\t\tvar indx,\n\t\t\t\t\tlen = val ? val.length : 0,\n\t\t\t\t\tn = max + num;\n\t\t\t\tfor ( indx = 0; indx < len; indx++ ) {\n\t\t\t\t\tn += val.charCodeAt( indx );\n\t\t\t\t}\n\t\t\t\treturn num * n;\n\t\t\t}\n\t\t\treturn 0;\n\t\t},\n\n\t\tsortNumericAsc : function( a, b, num, max, col, c ) {\n\t\t\tif ( a === b ) { return 0; }\n\t\t\tvar empty = ts.string[ ( c.empties[ col ] || c.emptyTo ) ];\n\t\t\tif ( a === '' && empty !== 0 ) { return typeof empty === 'boolean' ? ( empty ? -1 : 1 ) : -empty || -1; }\n\t\t\tif ( b === '' && empty !== 0 ) { return typeof empty === 'boolean' ? ( empty ? 1 : -1 ) : empty || 1; }\n\t\t\tif ( isNaN( a ) ) { a = ts.getTextValue( a, num, max ); }\n\t\t\tif ( isNaN( b ) ) { b = ts.getTextValue( b, num, max ); }\n\t\t\treturn a - b;\n\t\t},\n\n\t\tsortNumericDesc : function( a, b, num, max, col, c ) {\n\t\t\tif ( a === b ) { return 0; }\n\t\t\tvar empty = ts.string[ ( c.empties[ col ] || c.emptyTo ) ];\n\t\t\tif ( a === '' && empty !== 0 ) { return typeof empty === 'boolean' ? ( empty ? -1 : 1 ) : empty || 1; }\n\t\t\tif ( b === '' && empty !== 0 ) { return typeof empty === 'boolean' ? ( empty ? 1 : -1 ) : -empty || -1; }\n\t\t\tif ( isNaN( a ) ) { a = ts.getTextValue( a, num, max ); }\n\t\t\tif ( isNaN( b ) ) { b = ts.getTextValue( b, num, max ); }\n\t\t\treturn b - a;\n\t\t},\n\n\t\tsortNumeric : function( a, b ) {\n\t\t\treturn a - b;\n\t\t},\n\n\t\t/*\n\t\t██ ██ ██ ██ █████▄ ▄████▄ ██████ ██████ ▄█████\n\t\t██ ██ ██ ██ ██  ██ ██ ▄▄▄ ██▄▄     ██   ▀█▄\n\t\t██ ██ ██ ██ ██  ██ ██ ▀██ ██▀▀     ██      ▀█▄\n\t\t███████▀ ██ █████▀ ▀████▀ ██████   ██   █████▀\n\t\t*/\n\t\taddWidget : function( widget ) {\n\t\t\tif ( widget.id && !ts.isEmptyObject( ts.getWidgetById( widget.id ) ) ) {\n\t\t\t\tconsole.warn( '\"' + widget.id + '\" widget was loaded more than once!' );\n\t\t\t}\n\t\t\tts.widgets[ ts.widgets.length ] = widget;\n\t\t},\n\n\t\thasWidget : function( $table, name ) {\n\t\t\t$table = $( $table );\n\t\t\treturn $table.length && $table[ 0 ].config && $table[ 0 ].config.widgetInit[ name ] || false;\n\t\t},\n\n\t\tgetWidgetById : function( name ) {\n\t\t\tvar indx, widget,\n\t\t\t\tlen = ts.widgets.length;\n\t\t\tfor ( indx = 0; indx < len; indx++ ) {\n\t\t\t\twidget = ts.widgets[ indx ];\n\t\t\t\tif ( widget && widget.id && widget.id.toLowerCase() === name.toLowerCase() ) {\n\t\t\t\t\treturn widget;\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\n\t\tapplyWidgetOptions : function( table ) {\n\t\t\tvar indx, widget,\n\t\t\t\tc = table.config,\n\t\t\t\tlen = c.widgets.length;\n\t\t\tif ( len ) {\n\t\t\t\tfor ( indx = 0; indx < len; indx++ ) {\n\t\t\t\t\twidget = ts.getWidgetById( c.widgets[ indx ] );\n\t\t\t\t\tif ( widget && widget.options ) {\n\t\t\t\t\t\tc.widgetOptions = $.extend( true, {}, widget.options, c.widgetOptions );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\n\t\taddWidgetFromClass : function( table ) {\n\t\t\tvar len, indx,\n\t\t\t\tc = table.config,\n\t\t\t\t// look for widgets to apply from table class\n\t\t\t\t// don't match from 'ui-widget-content'; use \\S instead of \\w to include widgets\n\t\t\t\t// with dashes in the name, e.g. \"widget-test-2\" extracts out \"test-2\"\n\t\t\t\tregex = '^' + c.widgetClass.replace( ts.regex.templateName, '(\\\\S+)+' ) + '$',\n\t\t\t\twidgetClass = new RegExp( regex, 'g' ),\n\t\t\t\t// split up table class (widget id's can include dashes) - stop using match\n\t\t\t\t// otherwise only one widget gets extracted, see #1109\n\t\t\t\twidgets = ( table.className || '' ).split( ts.regex.spaces );\n\t\t\tif ( widgets.length ) {\n\t\t\t\tlen = widgets.length;\n\t\t\t\tfor ( indx = 0; indx < len; indx++ ) {\n\t\t\t\t\tif ( widgets[ indx ].match( widgetClass ) ) {\n\t\t\t\t\t\tc.widgets[ c.widgets.length ] = widgets[ indx ].replace( widgetClass, '$1' );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\n\t\tapplyWidgetId : function( table, id, init ) {\n\t\t\ttable = $(table)[0];\n\t\t\tvar applied, time, name,\n\t\t\t\tc = table.config,\n\t\t\t\two = c.widgetOptions,\n\t\t\t\twidget = ts.getWidgetById( id );\n\t\t\tif ( widget ) {\n\t\t\t\tname = widget.id;\n\t\t\t\tapplied = false;\n\t\t\t\t// add widget name to option list so it gets reapplied after sorting, filtering, etc\n\t\t\t\tif ( $.inArray( name, c.widgets ) < 0 ) {\n\t\t\t\t\tc.widgets[ c.widgets.length ] = name;\n\t\t\t\t}\n\t\t\t\tif ( c.debug ) { time = new Date(); }\n\n\t\t\t\tif ( init || !( c.widgetInit[ name ] ) ) {\n\t\t\t\t\t// set init flag first to prevent calling init more than once (e.g. pager)\n\t\t\t\t\tc.widgetInit[ name ] = true;\n\t\t\t\t\tif ( table.hasInitialized ) {\n\t\t\t\t\t\t// don't reapply widget options on tablesorter init\n\t\t\t\t\t\tts.applyWidgetOptions( table );\n\t\t\t\t\t}\n\t\t\t\t\tif ( typeof widget.init === 'function' ) {\n\t\t\t\t\t\tapplied = true;\n\t\t\t\t\t\tif ( c.debug ) {\n\t\t\t\t\t\t\tconsole[ console.group ? 'group' : 'log' ]( 'Initializing ' + name + ' widget' );\n\t\t\t\t\t\t}\n\t\t\t\t\t\twidget.init( table, widget, c, wo );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tif ( !init && typeof widget.format === 'function' ) {\n\t\t\t\t\tapplied = true;\n\t\t\t\t\tif ( c.debug ) {\n\t\t\t\t\t\tconsole[ console.group ? 'group' : 'log' ]( 'Updating ' + name + ' widget' );\n\t\t\t\t\t}\n\t\t\t\t\twidget.format( table, c, wo, false );\n\t\t\t\t}\n\t\t\t\tif ( c.debug ) {\n\t\t\t\t\tif ( applied ) {\n\t\t\t\t\t\tconsole.log( 'Completed ' + ( init ? 'initializing ' : 'applying ' ) + name + ' widget' + ts.benchmark( time ) );\n\t\t\t\t\t\tif ( console.groupEnd ) { console.groupEnd(); }\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\n\t\tapplyWidget : function( table, init, callback ) {\n\t\t\ttable = $( table )[ 0 ]; // in case this is called externally\n\t\t\tvar indx, len, names, widget, time,\n\t\t\t\tc = table.config,\n\t\t\t\twidgets = [];\n\t\t\t// prevent numerous consecutive widget applications\n\t\t\tif ( init !== false && table.hasInitialized && ( table.isApplyingWidgets || table.isUpdating ) ) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif ( c.debug ) { time = new Date(); }\n\t\t\tts.addWidgetFromClass( table );\n\t\t\t// prevent \"tablesorter-ready\" from firing multiple times in a row\n\t\t\tclearTimeout( c.timerReady );\n\t\t\tif ( c.widgets.length ) {\n\t\t\t\ttable.isApplyingWidgets = true;\n\t\t\t\t// ensure unique widget ids\n\t\t\t\tc.widgets = $.grep( c.widgets, function( val, index ) {\n\t\t\t\t\treturn $.inArray( val, c.widgets ) === index;\n\t\t\t\t});\n\t\t\t\tnames = c.widgets || [];\n\t\t\t\tlen = names.length;\n\t\t\t\t// build widget array & add priority as needed\n\t\t\t\tfor ( indx = 0; indx < len; indx++ ) {\n\t\t\t\t\twidget = ts.getWidgetById( names[ indx ] );\n\t\t\t\t\tif ( widget && widget.id ) {\n\t\t\t\t\t\t// set priority to 10 if not defined\n\t\t\t\t\t\tif ( !widget.priority ) { widget.priority = 10; }\n\t\t\t\t\t\twidgets[ indx ] = widget;\n\t\t\t\t\t} else if ( c.debug ) {\n\t\t\t\t\t\tconsole.warn( '\"' + names[ indx ] + '\" widget code does not exist!' );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\t// sort widgets by priority\n\t\t\t\twidgets.sort( function( a, b ) {\n\t\t\t\t\treturn a.priority < b.priority ? -1 : a.priority === b.priority ? 0 : 1;\n\t\t\t\t});\n\t\t\t\t// add/update selected widgets\n\t\t\t\tlen = widgets.length;\n\t\t\t\tif ( c.debug ) {\n\t\t\t\t\tconsole[ console.group ? 'group' : 'log' ]( 'Start ' + ( init ? 'initializing' : 'applying' ) + ' widgets' );\n\t\t\t\t}\n\t\t\t\tfor ( indx = 0; indx < len; indx++ ) {\n\t\t\t\t\twidget = widgets[ indx ];\n\t\t\t\t\tif ( widget && widget.id ) {\n\t\t\t\t\t\tts.applyWidgetId( table, widget.id, init );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tif ( c.debug && console.groupEnd ) { console.groupEnd(); }\n\t\t\t\t// callback executed on init only\n\t\t\t\tif ( !init && typeof callback === 'function' ) {\n\t\t\t\t\tcallback( table );\n\t\t\t\t}\n\t\t\t}\n\t\t\tc.timerReady = setTimeout( function() {\n\t\t\t\ttable.isApplyingWidgets = false;\n\t\t\t\t$.data( table, 'lastWidgetApplication', new Date() );\n\t\t\t\tc.$table.triggerHandler( 'tablesorter-ready' );\n\t\t\t}, 10 );\n\t\t\tif ( c.debug ) {\n\t\t\t\twidget = c.widgets.length;\n\t\t\t\tconsole.log( 'Completed ' +\n\t\t\t\t\t( init === true ? 'initializing ' : 'applying ' ) + widget +\n\t\t\t\t\t' widget' + ( widget !== 1 ? 's' : '' ) + ts.benchmark( time ) );\n\t\t\t}\n\t\t},\n\n\t\tremoveWidget : function( table, name, refreshing ) {\n\t\t\ttable = $( table )[ 0 ];\n\t\t\tvar index, widget, indx, len,\n\t\t\t\tc = table.config;\n\t\t\t// if name === true, add all widgets from $.tablesorter.widgets\n\t\t\tif ( name === true ) {\n\t\t\t\tname = [];\n\t\t\t\tlen = ts.widgets.length;\n\t\t\t\tfor ( indx = 0; indx < len; indx++ ) {\n\t\t\t\t\twidget = ts.widgets[ indx ];\n\t\t\t\t\tif ( widget && widget.id ) {\n\t\t\t\t\t\tname[ name.length ] = widget.id;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\t// name can be either an array of widgets names,\n\t\t\t\t// or a space/comma separated list of widget names\n\t\t\t\tname = ( $.isArray( name ) ? name.join( ',' ) : name || '' ).toLowerCase().split( /[\\s,]+/ );\n\t\t\t}\n\t\t\tlen = name.length;\n\t\t\tfor ( index = 0; index < len; index++ ) {\n\t\t\t\twidget = ts.getWidgetById( name[ index ] );\n\t\t\t\tindx = $.inArray( name[ index ], c.widgets );\n\t\t\t\t// don't remove the widget from config.widget if refreshing\n\t\t\t\tif ( indx >= 0 && refreshing !== true ) {\n\t\t\t\t\tc.widgets.splice( indx, 1 );\n\t\t\t\t}\n\t\t\t\tif ( widget && widget.remove ) {\n\t\t\t\t\tif ( c.debug ) {\n\t\t\t\t\t\tconsole.log( ( refreshing ? 'Refreshing' : 'Removing' ) + ' \"' + name[ index ] + '\" widget' );\n\t\t\t\t\t}\n\t\t\t\t\twidget.remove( table, c, c.widgetOptions, refreshing );\n\t\t\t\t\tc.widgetInit[ name[ index ] ] = false;\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\n\t\trefreshWidgets : function( table, doAll, dontapply ) {\n\t\t\ttable = $( table )[ 0 ]; // see issue #243\n\t\t\tvar indx, widget,\n\t\t\t\tc = table.config,\n\t\t\t\tcurWidgets = c.widgets,\n\t\t\t\twidgets = ts.widgets,\n\t\t\t\tlen = widgets.length,\n\t\t\t\tlist = [],\n\t\t\t\tcallback = function( table ) {\n\t\t\t\t\t$( table ).triggerHandler( 'refreshComplete' );\n\t\t\t\t};\n\t\t\t// remove widgets not defined in config.widgets, unless doAll is true\n\t\t\tfor ( indx = 0; indx < len; indx++ ) {\n\t\t\t\twidget = widgets[ indx ];\n\t\t\t\tif ( widget && widget.id && ( doAll || $.inArray( widget.id, curWidgets ) < 0 ) ) {\n\t\t\t\t\tlist[ list.length ] = widget.id;\n\t\t\t\t}\n\t\t\t}\n\t\t\tts.removeWidget( table, list.join( ',' ), true );\n\t\t\tif ( dontapply !== true ) {\n\t\t\t\t// call widget init if\n\t\t\t\tts.applyWidget( table, doAll || false, callback );\n\t\t\t\tif ( doAll ) {\n\t\t\t\t\t// apply widget format\n\t\t\t\t\tts.applyWidget( table, false, callback );\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tcallback( table );\n\t\t\t}\n\t\t},\n\n\t\t/*\n\t\t██  ██ ██████ ██ ██     ██ ██████ ██ ██████ ▄█████\n\t\t██  ██   ██   ██ ██     ██   ██   ██ ██▄▄   ▀█▄\n\t\t██  ██   ██   ██ ██     ██   ██   ██ ██▀▀      ▀█▄\n\t\t▀████▀   ██   ██ ██████ ██   ██   ██ ██████ █████▀\n\t\t*/\n\t\tbenchmark : function( diff ) {\n\t\t\treturn ( ' ( ' + ( new Date().getTime() - diff.getTime() ) + 'ms )' );\n\t\t},\n\t\t// deprecated ts.log\n\t\tlog : function() {\n\t\t\tconsole.log( arguments );\n\t\t},\n\n\t\t// $.isEmptyObject from jQuery v1.4\n\t\tisEmptyObject : function( obj ) {\n\t\t\t/*jshint forin: false */\n\t\t\tfor ( var name in obj ) {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t\treturn true;\n\t\t},\n\n\t\tisValueInArray : function( column, arry ) {\n\t\t\tvar indx,\n\t\t\t\tlen = arry && arry.length || 0;\n\t\t\tfor ( indx = 0; indx < len; indx++ ) {\n\t\t\t\tif ( arry[ indx ][ 0 ] === column ) {\n\t\t\t\t\treturn indx;\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn -1;\n\t\t},\n\n\t\tformatFloat : function( str, table ) {\n\t\t\tif ( typeof str !== 'string' || str === '' ) { return str; }\n\t\t\t// allow using formatFloat without a table; defaults to US number format\n\t\t\tvar num,\n\t\t\t\tusFormat = table && table.config ? table.config.usNumberFormat !== false :\n\t\t\t\t\ttypeof table !== 'undefined' ? table : true;\n\t\t\tif ( usFormat ) {\n\t\t\t\t// US Format - 1,234,567.89 -> 1234567.89\n\t\t\t\tstr = str.replace( ts.regex.comma, '' );\n\t\t\t} else {\n\t\t\t\t// German Format = 1.234.567,89 -> 1234567.89\n\t\t\t\t// French Format = 1 234 567,89 -> 1234567.89\n\t\t\t\tstr = str.replace( ts.regex.digitNonUS, '' ).replace( ts.regex.comma, '.' );\n\t\t\t}\n\t\t\tif ( ts.regex.digitNegativeTest.test( str ) ) {\n\t\t\t\t// make (#) into a negative number -> (10) = -10\n\t\t\t\tstr = str.replace( ts.regex.digitNegativeReplace, '-$1' );\n\t\t\t}\n\t\t\tnum = parseFloat( str );\n\t\t\t// return the text instead of zero\n\t\t\treturn isNaN( num ) ? $.trim( str ) : num;\n\t\t},\n\n\t\tisDigit : function( str ) {\n\t\t\t// replace all unwanted chars and match\n\t\t\treturn isNaN( str ) ?\n\t\t\t\tts.regex.digitTest.test( str.toString().replace( ts.regex.digitReplace, '' ) ) :\n\t\t\t\tstr !== '';\n\t\t},\n\n\t\t// computeTableHeaderCellIndexes from:\n\t\t// http://www.javascripttoolbox.com/lib/table/examples.php\n\t\t// http://www.javascripttoolbox.com/temp/table_cellindex.html\n\t\tcomputeColumnIndex : function( $rows, c ) {\n\t\t\tvar i, j, k, l, cell, cells, rowIndex, rowSpan, colSpan, firstAvailCol,\n\t\t\t\t// total columns has been calculated, use it to set the matrixrow\n\t\t\t\tcolumns = c && c.columns || 0,\n\t\t\t\tmatrix = [],\n\t\t\t\tmatrixrow = new Array( columns );\n\t\t\tfor ( i = 0; i < $rows.length; i++ ) {\n\t\t\t\tcells = $rows[ i ].cells;\n\t\t\t\tfor ( j = 0; j < cells.length; j++ ) {\n\t\t\t\t\tcell = cells[ j ];\n\t\t\t\t\trowIndex = cell.parentNode.rowIndex;\n\t\t\t\t\trowSpan = cell.rowSpan || 1;\n\t\t\t\t\tcolSpan = cell.colSpan || 1;\n\t\t\t\t\tif ( typeof matrix[ rowIndex ] === 'undefined' ) {\n\t\t\t\t\t\tmatrix[ rowIndex ] = [];\n\t\t\t\t\t}\n\t\t\t\t\t// Find first available column in the first row\n\t\t\t\t\tfor ( k = 0; k < matrix[ rowIndex ].length + 1; k++ ) {\n\t\t\t\t\t\tif ( typeof matrix[ rowIndex ][ k ] === 'undefined' ) {\n\t\t\t\t\t\t\tfirstAvailCol = k;\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\t// jscs:disable disallowEmptyBlocks\n\t\t\t\t\tif ( columns && cell.cellIndex === firstAvailCol ) {\n\t\t\t\t\t\t// don't to anything\n\t\t\t\t\t} else if ( cell.setAttribute ) {\n\t\t\t\t\t\t// jscs:enable disallowEmptyBlocks\n\t\t\t\t\t\t// add data-column (setAttribute = IE8+)\n\t\t\t\t\t\tcell.setAttribute( 'data-column', firstAvailCol );\n\t\t\t\t\t} else {\n\t\t\t\t\t\t// remove once we drop support for IE7 - 1/12/2016\n\t\t\t\t\t\t$( cell ).attr( 'data-column', firstAvailCol );\n\t\t\t\t\t}\n\t\t\t\t\tfor ( k = rowIndex; k < rowIndex + rowSpan; k++ ) {\n\t\t\t\t\t\tif ( typeof matrix[ k ] === 'undefined' ) {\n\t\t\t\t\t\t\tmatrix[ k ] = [];\n\t\t\t\t\t\t}\n\t\t\t\t\t\tmatrixrow = matrix[ k ];\n\t\t\t\t\t\tfor ( l = firstAvailCol; l < firstAvailCol + colSpan; l++ ) {\n\t\t\t\t\t\t\tmatrixrow[ l ] = 'x';\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn matrixrow.length;\n\t\t},\n\n\t\t// automatically add a colgroup with col elements set to a percentage width\n\t\tfixColumnWidth : function( table ) {\n\t\t\ttable = $( table )[ 0 ];\n\t\t\tvar overallWidth, percent, $tbodies, len, index,\n\t\t\t\tc = table.config,\n\t\t\t\t$colgroup = c.$table.children( 'colgroup' );\n\t\t\t// remove plugin-added colgroup, in case we need to refresh the widths\n\t\t\tif ( $colgroup.length && $colgroup.hasClass( ts.css.colgroup ) ) {\n\t\t\t\t$colgroup.remove();\n\t\t\t}\n\t\t\tif ( c.widthFixed && c.$table.children( 'colgroup' ).length === 0 ) {\n\t\t\t\t$colgroup = $( '<colgroup class=\"' + ts.css.colgroup + '\">' );\n\t\t\t\toverallWidth = c.$table.width();\n\t\t\t\t// only add col for visible columns - fixes #371\n\t\t\t\t$tbodies = c.$tbodies.find( 'tr:first' ).children( ':visible' );\n\t\t\t\tlen = $tbodies.length;\n\t\t\t\tfor ( index = 0; index < len; index++ ) {\n\t\t\t\t\tpercent = parseInt( ( $tbodies.eq( index ).width() / overallWidth ) * 1000, 10 ) / 10 + '%';\n\t\t\t\t\t$colgroup.append( $( '<col>' ).css( 'width', percent ) );\n\t\t\t\t}\n\t\t\t\tc.$table.prepend( $colgroup );\n\t\t\t}\n\t\t},\n\n\t\t// get sorter, string, empty, etc options for each column from\n\t\t// jQuery data, metadata, header option or header class name ('sorter-false')\n\t\t// priority = jQuery data > meta > headers option > header class name\n\t\tgetData : function( header, configHeader, key ) {\n\t\t\tvar meta, cl4ss,\n\t\t\t\tval = '',\n\t\t\t\t$header = $( header );\n\t\t\tif ( !$header.length ) { return ''; }\n\t\t\tmeta = $.metadata ? $header.metadata() : false;\n\t\t\tcl4ss = ' ' + ( $header.attr( 'class' ) || '' );\n\t\t\tif ( typeof $header.data( key ) !== 'undefined' ||\n\t\t\t\ttypeof $header.data( key.toLowerCase() ) !== 'undefined' ) {\n\t\t\t\t// 'data-lockedOrder' is assigned to 'lockedorder'; but 'data-locked-order' is assigned to 'lockedOrder'\n\t\t\t\t// 'data-sort-initial-order' is assigned to 'sortInitialOrder'\n\t\t\t\tval += $header.data( key ) || $header.data( key.toLowerCase() );\n\t\t\t} else if ( meta && typeof meta[ key ] !== 'undefined' ) {\n\t\t\t\tval += meta[ key ];\n\t\t\t} else if ( configHeader && typeof configHeader[ key ] !== 'undefined' ) {\n\t\t\t\tval += configHeader[ key ];\n\t\t\t} else if ( cl4ss !== ' ' && cl4ss.match( ' ' + key + '-' ) ) {\n\t\t\t\t// include sorter class name 'sorter-text', etc; now works with 'sorter-my-custom-parser'\n\t\t\t\tval = cl4ss.match( new RegExp( '\\\\s' + key + '-([\\\\w-]+)' ) )[ 1 ] || '';\n\t\t\t}\n\t\t\treturn $.trim( val );\n\t\t},\n\n\t\tgetColumnData : function( table, obj, indx, getCell, $headers ) {\n\t\t\tif ( typeof obj === 'undefined' || obj === null ) { return; }\n\t\t\ttable = $( table )[ 0 ];\n\t\t\tvar $header, key,\n\t\t\t\tc = table.config,\n\t\t\t\t$cells = ( $headers || c.$headers ),\n\t\t\t\t// c.$headerIndexed is not defined initially\n\t\t\t\t$cell = c.$headerIndexed && c.$headerIndexed[ indx ] ||\n\t\t\t\t\t$cells.filter( '[data-column=\"' + indx + '\"]:last' );\n\t\t\tif ( obj[ indx ] ) {\n\t\t\t\treturn getCell ? obj[ indx ] : obj[ $cells.index( $cell ) ];\n\t\t\t}\n\t\t\tfor ( key in obj ) {\n\t\t\t\tif ( typeof key === 'string' ) {\n\t\t\t\t\t$header = $cell\n\t\t\t\t\t\t// header cell with class/id\n\t\t\t\t\t\t.filter( key )\n\t\t\t\t\t\t// find elements within the header cell with cell/id\n\t\t\t\t\t\t.add( $cell.find( key ) );\n\t\t\t\t\tif ( $header.length ) {\n\t\t\t\t\t\treturn obj[ key ];\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn;\n\t\t},\n\n\t\t// *** Process table ***\n\t\t// add processing indicator\n\t\tisProcessing : function( $table, toggle, $headers ) {\n\t\t\t$table = $( $table );\n\t\t\tvar c = $table[ 0 ].config,\n\t\t\t\t// default to all headers\n\t\t\t\t$header = $headers || $table.find( '.' + ts.css.header );\n\t\t\tif ( toggle ) {\n\t\t\t\t// don't use sortList if custom $headers used\n\t\t\t\tif ( typeof $headers !== 'undefined' && c.sortList.length > 0 ) {\n\t\t\t\t\t// get headers from the sortList\n\t\t\t\t\t$header = $header.filter( function() {\n\t\t\t\t\t\t// get data-column from attr to keep compatibility with jQuery 1.2.6\n\t\t\t\t\t\treturn this.sortDisabled ?\n\t\t\t\t\t\t\tfalse :\n\t\t\t\t\t\t\tts.isValueInArray( parseFloat( $( this ).attr( 'data-column' ) ), c.sortList ) >= 0;\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t\t$table.add( $header ).addClass( ts.css.processing + ' ' + c.cssProcessing );\n\t\t\t} else {\n\t\t\t\t$table.add( $header ).removeClass( ts.css.processing + ' ' + c.cssProcessing );\n\t\t\t}\n\t\t},\n\n\t\t// detach tbody but save the position\n\t\t// don't use tbody because there are portions that look for a tbody index (updateCell)\n\t\tprocessTbody : function( table, $tb, getIt ) {\n\t\t\ttable = $( table )[ 0 ];\n\t\t\tif ( getIt ) {\n\t\t\t\ttable.isProcessing = true;\n\t\t\t\t$tb.before( '<colgroup class=\"tablesorter-savemyplace\"/>' );\n\t\t\t\treturn $.fn.detach ? $tb.detach() : $tb.remove();\n\t\t\t}\n\t\t\tvar holdr = $( table ).find( 'colgroup.tablesorter-savemyplace' );\n\t\t\t$tb.insertAfter( holdr );\n\t\t\tholdr.remove();\n\t\t\ttable.isProcessing = false;\n\t\t},\n\n\t\tclearTableBody : function( table ) {\n\t\t\t$( table )[ 0 ].config.$tbodies.children().detach();\n\t\t},\n\n\t\t// used when replacing accented characters during sorting\n\t\tcharacterEquivalents : {\n\t\t\t'a' : '\\u00e1\\u00e0\\u00e2\\u00e3\\u00e4\\u0105\\u00e5', // áàâãäąå\n\t\t\t'A' : '\\u00c1\\u00c0\\u00c2\\u00c3\\u00c4\\u0104\\u00c5', // ÁÀÂÃÄĄÅ\n\t\t\t'c' : '\\u00e7\\u0107\\u010d', // çćč\n\t\t\t'C' : '\\u00c7\\u0106\\u010c', // ÇĆČ\n\t\t\t'e' : '\\u00e9\\u00e8\\u00ea\\u00eb\\u011b\\u0119', // éèêëěę\n\t\t\t'E' : '\\u00c9\\u00c8\\u00ca\\u00cb\\u011a\\u0118', // ÉÈÊËĚĘ\n\t\t\t'i' : '\\u00ed\\u00ec\\u0130\\u00ee\\u00ef\\u0131', // íìİîïı\n\t\t\t'I' : '\\u00cd\\u00cc\\u0130\\u00ce\\u00cf', // ÍÌİÎÏ\n\t\t\t'o' : '\\u00f3\\u00f2\\u00f4\\u00f5\\u00f6\\u014d', // óòôõöō\n\t\t\t'O' : '\\u00d3\\u00d2\\u00d4\\u00d5\\u00d6\\u014c', // ÓÒÔÕÖŌ\n\t\t\t'ss': '\\u00df', // ß (s sharp)\n\t\t\t'SS': '\\u1e9e', // ẞ (Capital sharp s)\n\t\t\t'u' : '\\u00fa\\u00f9\\u00fb\\u00fc\\u016f', // úùûüů\n\t\t\t'U' : '\\u00da\\u00d9\\u00db\\u00dc\\u016e' // ÚÙÛÜŮ\n\t\t},\n\n\t\treplaceAccents : function( str ) {\n\t\t\tvar chr,\n\t\t\t\tacc = '[',\n\t\t\t\teq = ts.characterEquivalents;\n\t\t\tif ( !ts.characterRegex ) {\n\t\t\t\tts.characterRegexArray = {};\n\t\t\t\tfor ( chr in eq ) {\n\t\t\t\t\tif ( typeof chr === 'string' ) {\n\t\t\t\t\t\tacc += eq[ chr ];\n\t\t\t\t\t\tts.characterRegexArray[ chr ] = new RegExp( '[' + eq[ chr ] + ']', 'g' );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tts.characterRegex = new RegExp( acc + ']' );\n\t\t\t}\n\t\t\tif ( ts.characterRegex.test( str ) ) {\n\t\t\t\tfor ( chr in eq ) {\n\t\t\t\t\tif ( typeof chr === 'string' ) {\n\t\t\t\t\t\tstr = str.replace( ts.characterRegexArray[ chr ], chr );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn str;\n\t\t},\n\n\t\t// restore headers\n\t\trestoreHeaders : function( table ) {\n\t\t\tvar index, $cell,\n\t\t\t\tc = $( table )[ 0 ].config,\n\t\t\t\t$headers = c.$table.find( c.selectorHeaders ),\n\t\t\t\tlen = $headers.length;\n\t\t\t// don't use c.$headers here in case header cells were swapped\n\t\t\tfor ( index = 0; index < len; index++ ) {\n\t\t\t\t$cell = $headers.eq( index );\n\t\t\t\t// only restore header cells if it is wrapped\n\t\t\t\t// because this is also used by the updateAll method\n\t\t\t\tif ( $cell.find( '.' + ts.css.headerIn ).length ) {\n\t\t\t\t\t$cell.html( c.headerContent[ index ] );\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\n\t\tdestroy : function( table, removeClasses, callback ) {\n\t\t\ttable = $( table )[ 0 ];\n\t\t\tif ( !table.hasInitialized ) { return; }\n\t\t\t// remove all widgets\n\t\t\tts.removeWidget( table, true, false );\n\t\t\tvar events,\n\t\t\t\t$t = $( table ),\n\t\t\t\tc = table.config,\n\t\t\t\tdebug = c.debug,\n\t\t\t\t$h = $t.find( 'thead:first' ),\n\t\t\t\t$r = $h.find( 'tr.' + ts.css.headerRow ).removeClass( ts.css.headerRow + ' ' + c.cssHeaderRow ),\n\t\t\t\t$f = $t.find( 'tfoot:first > tr' ).children( 'th, td' );\n\t\t\tif ( removeClasses === false && $.inArray( 'uitheme', c.widgets ) >= 0 ) {\n\t\t\t\t// reapply uitheme classes, in case we want to maintain appearance\n\t\t\t\t$t.triggerHandler( 'applyWidgetId', [ 'uitheme' ] );\n\t\t\t\t$t.triggerHandler( 'applyWidgetId', [ 'zebra' ] );\n\t\t\t}\n\t\t\t// remove widget added rows, just in case\n\t\t\t$h.find( 'tr' ).not( $r ).remove();\n\t\t\t// disable tablesorter - not using .unbind( namespace ) because namespacing was\n\t\t\t// added in jQuery v1.4.3 - see http://api.jquery.com/event.namespace/\n\t\t\tevents = 'sortReset update updateRows updateAll updateHeaders updateCell addRows updateComplete sorton ' +\n\t\t\t\t'appendCache updateCache applyWidgetId applyWidgets refreshWidgets removeWidget destroy mouseup mouseleave ' +\n\t\t\t\t'keypress sortBegin sortEnd resetToLoadState '.split( ' ' )\n\t\t\t\t.join( c.namespace + ' ' );\n\t\t\t$t\n\t\t\t\t.removeData( 'tablesorter' )\n\t\t\t\t.unbind( events.replace( ts.regex.spaces, ' ' ) );\n\t\t\tc.$headers\n\t\t\t\t.add( $f )\n\t\t\t\t.removeClass( [ ts.css.header, c.cssHeader, c.cssAsc, c.cssDesc, ts.css.sortAsc, ts.css.sortDesc, ts.css.sortNone ].join( ' ' ) )\n\t\t\t\t.removeAttr( 'data-column' )\n\t\t\t\t.removeAttr( 'aria-label' )\n\t\t\t\t.attr( 'aria-disabled', 'true' );\n\t\t\t$r\n\t\t\t\t.find( c.selectorSort )\n\t\t\t\t.unbind( ( 'mousedown mouseup keypress '.split( ' ' ).join( c.namespace + ' ' ) ).replace( ts.regex.spaces, ' ' ) );\n\t\t\tts.restoreHeaders( table );\n\t\t\t$t.toggleClass( ts.css.table + ' ' + c.tableClass + ' tablesorter-' + c.theme, removeClasses === false );\n\t\t\t// clear flag in case the plugin is initialized again\n\t\t\ttable.hasInitialized = false;\n\t\t\tdelete table.config.cache;\n\t\t\tif ( typeof callback === 'function' ) {\n\t\t\t\tcallback( table );\n\t\t\t}\n\t\t\tif ( debug ) {\n\t\t\t\tconsole.log( 'tablesorter has been removed' );\n\t\t\t}\n\t\t}\n\n\t};\n\n\t$.fn.tablesorter = function( settings ) {\n\t\treturn this.each( function() {\n\t\t\tvar table = this,\n\t\t\t// merge & extend config options\n\t\t\tc = $.extend( true, {}, ts.defaults, settings, ts.instanceMethods );\n\t\t\t// save initial settings\n\t\t\tc.originalSettings = settings;\n\t\t\t// create a table from data (build table widget)\n\t\t\tif ( !table.hasInitialized && ts.buildTable && this.nodeName !== 'TABLE' ) {\n\t\t\t\t// return the table (in case the original target is the table's container)\n\t\t\t\tts.buildTable( table, c );\n\t\t\t} else {\n\t\t\t\tts.setup( table, c );\n\t\t\t}\n\t\t});\n\t};\n\n\t// set up debug logs\n\tif ( !( window.console && window.console.log ) ) {\n\t\t// access $.tablesorter.logs for browsers that don't have a console...\n\t\tts.logs = [];\n\t\t/*jshint -W020 */\n\t\tconsole = {};\n\t\tconsole.log = console.warn = console.error = console.table = function() {\n\t\t\tvar arg = arguments.length > 1 ? arguments : arguments[0];\n\t\t\tts.logs[ ts.logs.length ] = { date: Date.now(), log: arg };\n\t\t};\n\t}\n\n\t// add default parsers\n\tts.addParser({\n\t\tid : 'no-parser',\n\t\tis : function() {\n\t\t\treturn false;\n\t\t},\n\t\tformat : function() {\n\t\t\treturn '';\n\t\t},\n\t\ttype : 'text'\n\t});\n\n\tts.addParser({\n\t\tid : 'text',\n\t\tis : function() {\n\t\t\treturn true;\n\t\t},\n\t\tformat : function( str, table ) {\n\t\t\tvar c = table.config;\n\t\t\tif ( str ) {\n\t\t\t\tstr = $.trim( c.ignoreCase ? str.toLocaleLowerCase() : str );\n\t\t\t\tstr = c.sortLocaleCompare ? ts.replaceAccents( str ) : str;\n\t\t\t}\n\t\t\treturn str;\n\t\t},\n\t\ttype : 'text'\n\t});\n\n\tts.regex.nondigit = /[^\\w,. \\-()]/g;\n\tts.addParser({\n\t\tid : 'digit',\n\t\tis : function( str ) {\n\t\t\treturn ts.isDigit( str );\n\t\t},\n\t\tformat : function( str, table ) {\n\t\t\tvar num = ts.formatFloat( ( str || '' ).replace( ts.regex.nondigit, '' ), table );\n\t\t\treturn str && typeof num === 'number' ? num :\n\t\t\t\tstr ? $.trim( str && table.config.ignoreCase ? str.toLocaleLowerCase() : str ) : str;\n\t\t},\n\t\ttype : 'numeric'\n\t});\n\n\tts.regex.currencyReplace = /[+\\-,. ]/g;\n\tts.regex.currencyTest = /^\\(?\\d+[\\u00a3$\\u20ac\\u00a4\\u00a5\\u00a2?.]|[\\u00a3$\\u20ac\\u00a4\\u00a5\\u00a2?.]\\d+\\)?$/;\n\tts.addParser({\n\t\tid : 'currency',\n\t\tis : function( str ) {\n\t\t\tstr = ( str || '' ).replace( ts.regex.currencyReplace, '' );\n\t\t\t// test for £$€¤¥¢\n\t\t\treturn ts.regex.currencyTest.test( str );\n\t\t},\n\t\tformat : function( str, table ) {\n\t\t\tvar num = ts.formatFloat( ( str || '' ).replace( ts.regex.nondigit, '' ), table );\n\t\t\treturn str && typeof num === 'number' ? num :\n\t\t\t\tstr ? $.trim( str && table.config.ignoreCase ? str.toLocaleLowerCase() : str ) : str;\n\t\t},\n\t\ttype : 'numeric'\n\t});\n\n\t// too many protocols to add them all https://en.wikipedia.org/wiki/URI_scheme\n\t// now, this regex can be updated before initialization\n\tts.regex.urlProtocolTest =   /^(https?|ftp|file):\\/\\//;\n\tts.regex.urlProtocolReplace = /(https?|ftp|file):\\/\\//;\n\tts.addParser({\n\t\tid : 'url',\n\t\tis : function( str ) {\n\t\t\treturn ts.regex.urlProtocolTest.test( str );\n\t\t},\n\t\tformat : function( str ) {\n\t\t\treturn str ? $.trim( str.replace( ts.regex.urlProtocolReplace, '' ) ) : str;\n\t\t},\n\t\tparsed : true, // filter widget flag\n\t\ttype : 'text'\n\t});\n\n\tts.regex.dash = /-/g;\n\tts.regex.isoDate = /^\\d{4}[\\/\\-]\\d{1,2}[\\/\\-]\\d{1,2}/;\n\tts.addParser({\n\t\tid : 'isoDate',\n\t\tis : function( str ) {\n\t\t\treturn ts.regex.isoDate.test( str );\n\t\t},\n\t\tformat : function( str, table ) {\n\t\t\tvar date = str ? new Date( str.replace( ts.regex.dash, '/' ) ) : str;\n\t\t\treturn date instanceof Date && isFinite( date ) ? date.getTime() : str;\n\t\t},\n\t\ttype : 'numeric'\n\t});\n\n\tts.regex.percent = /%/g;\n\tts.regex.percentTest = /(\\d\\s*?%|%\\s*?\\d)/;\n\tts.addParser({\n\t\tid : 'percent',\n\t\tis : function( str ) {\n\t\t\treturn ts.regex.percentTest.test( str ) && str.length < 15;\n\t\t},\n\t\tformat : function( str, table ) {\n\t\t\treturn str ? ts.formatFloat( str.replace( ts.regex.percent, '' ), table ) : str;\n\t\t},\n\t\ttype : 'numeric'\n\t});\n\n\t// added image parser to core v2.17.9\n\tts.addParser({\n\t\tid : 'image',\n\t\tis : function( str, table, node, $node ) {\n\t\t\treturn $node.find( 'img' ).length > 0;\n\t\t},\n\t\tformat : function( str, table, cell ) {\n\t\t\treturn $( cell ).find( 'img' ).attr( table.config.imgAttr || 'alt' ) || str;\n\t\t},\n\t\tparsed : true, // filter widget flag\n\t\ttype : 'text'\n\t});\n\n\tts.regex.dateReplace = /(\\S)([AP]M)$/i; // used by usLongDate & time parser\n\tts.regex.usLongDateTest1 = /^[A-Z]{3,10}\\.?\\s+\\d{1,2},?\\s+(\\d{4})(\\s+\\d{1,2}:\\d{2}(:\\d{2})?(\\s+[AP]M)?)?$/i;\n\tts.regex.usLongDateTest2 = /^\\d{1,2}\\s+[A-Z]{3,10}\\s+\\d{4}/i;\n\tts.addParser({\n\t\tid : 'usLongDate',\n\t\tis : function( str ) {\n\t\t\t// two digit years are not allowed cross-browser\n\t\t\t// Jan 01, 2013 12:34:56 PM or 01 Jan 2013\n\t\t\treturn ts.regex.usLongDateTest1.test( str ) || ts.regex.usLongDateTest2.test( str );\n\t\t},\n\t\tformat : function( str, table ) {\n\t\t\tvar date = str ? new Date( str.replace( ts.regex.dateReplace, '$1 $2' ) ) : str;\n\t\t\treturn date instanceof Date && isFinite( date ) ? date.getTime() : str;\n\t\t},\n\t\ttype : 'numeric'\n\t});\n\n\t// testing for ##-##-#### or ####-##-##, so it's not perfect; time can be included\n\tts.regex.shortDateTest = /(^\\d{1,2}[\\/\\s]\\d{1,2}[\\/\\s]\\d{4})|(^\\d{4}[\\/\\s]\\d{1,2}[\\/\\s]\\d{1,2})/;\n\t// escaped \"-\" because JSHint in Firefox was showing it as an error\n\tts.regex.shortDateReplace = /[\\-.,]/g;\n\t// XXY covers MDY & DMY formats\n\tts.regex.shortDateXXY = /(\\d{1,2})[\\/\\s](\\d{1,2})[\\/\\s](\\d{4})/;\n\tts.regex.shortDateYMD = /(\\d{4})[\\/\\s](\\d{1,2})[\\/\\s](\\d{1,2})/;\n\tts.convertFormat = function( dateString, format ) {\n\t\tdateString = ( dateString || '' )\n\t\t\t.replace( ts.regex.spaces, ' ' )\n\t\t\t.replace( ts.regex.shortDateReplace, '/' );\n\t\tif ( format === 'mmddyyyy' ) {\n\t\t\tdateString = dateString.replace( ts.regex.shortDateXXY, '$3/$1/$2' );\n\t\t} else if ( format === 'ddmmyyyy' ) {\n\t\t\tdateString = dateString.replace( ts.regex.shortDateXXY, '$3/$2/$1' );\n\t\t} else if ( format === 'yyyymmdd' ) {\n\t\t\tdateString = dateString.replace( ts.regex.shortDateYMD, '$1/$2/$3' );\n\t\t}\n\t\tvar date = new Date( dateString );\n\t\treturn date instanceof Date && isFinite( date ) ? date.getTime() : '';\n\t};\n\n\tts.addParser({\n\t\tid : 'shortDate', // 'mmddyyyy', 'ddmmyyyy' or 'yyyymmdd'\n\t\tis : function( str ) {\n\t\t\tstr = ( str || '' ).replace( ts.regex.spaces, ' ' ).replace( ts.regex.shortDateReplace, '/' );\n\t\t\treturn ts.regex.shortDateTest.test( str );\n\t\t},\n\t\tformat : function( str, table, cell, cellIndex ) {\n\t\t\tif ( str ) {\n\t\t\t\tvar c = table.config,\n\t\t\t\t\t$header = c.$headerIndexed[ cellIndex ],\n\t\t\t\t\tformat = $header.length && $header.data( 'dateFormat' ) ||\n\t\t\t\t\t\tts.getData( $header, ts.getColumnData( table, c.headers, cellIndex ), 'dateFormat' ) ||\n\t\t\t\t\t\tc.dateFormat;\n\t\t\t\t// save format because getData can be slow...\n\t\t\t\tif ( $header.length ) {\n\t\t\t\t\t$header.data( 'dateFormat', format );\n\t\t\t\t}\n\t\t\t\treturn ts.convertFormat( str, format ) || str;\n\t\t\t}\n\t\t\treturn str;\n\t\t},\n\t\ttype : 'numeric'\n\t});\n\n\t// match 24 hour time & 12 hours time + am/pm - see http://regexr.com/3c3tk\n\tts.regex.timeTest = /^([1-9]|1[0-2]):([0-5]\\d)(\\s[AP]M)$|^((?:[01]\\d|[2][0-4]):[0-5]\\d)$/i;\n\tts.regex.timeMatch = /([1-9]|1[0-2]):([0-5]\\d)(\\s[AP]M)|((?:[01]\\d|[2][0-4]):[0-5]\\d)/i;\n\tts.addParser({\n\t\tid : 'time',\n\t\tis : function( str ) {\n\t\t\treturn ts.regex.timeTest.test( str );\n\t\t},\n\t\tformat : function( str, table ) {\n\t\t\t// isolate time... ignore month, day and year\n\t\t\tvar temp,\n\t\t\t\ttimePart = ( str || '' ).match( ts.regex.timeMatch ),\n\t\t\t\torig = new Date( str ),\n\t\t\t\t// no time component? default to 00:00 by leaving it out, but only if str is defined\n\t\t\t\ttime = str && ( timePart !== null ? timePart[ 0 ] : '00:00 AM' ),\n\t\t\t\tdate = time ? new Date( '2000/01/01 ' + time.replace( ts.regex.dateReplace, '$1 $2' ) ) : time;\n\t\t\tif ( date instanceof Date && isFinite( date ) ) {\n\t\t\t\ttemp = orig instanceof Date && isFinite( orig ) ? orig.getTime() : 0;\n\t\t\t\t// if original string was a valid date, add it to the decimal so the column sorts in some kind of order\n\t\t\t\t// luckily new Date() ignores the decimals\n\t\t\t\treturn temp ? parseFloat( date.getTime() + '.' + orig.getTime() ) : date.getTime();\n\t\t\t}\n\t\t\treturn str;\n\t\t},\n\t\ttype : 'numeric'\n\t});\n\n\tts.addParser({\n\t\tid : 'metadata',\n\t\tis : function() {\n\t\t\treturn false;\n\t\t},\n\t\tformat : function( str, table, cell ) {\n\t\t\tvar c = table.config,\n\t\t\tp = ( !c.parserMetadataName ) ? 'sortValue' : c.parserMetadataName;\n\t\t\treturn $( cell ).metadata()[ p ];\n\t\t},\n\t\ttype : 'numeric'\n\t});\n\n\t/*\n\t\t██████ ██████ █████▄ █████▄ ▄████▄\n\t\t  ▄█▀  ██▄▄   ██▄▄██ ██▄▄██ ██▄▄██\n\t\t▄█▀    ██▀▀   ██▀▀██ ██▀▀█  ██▀▀██\n\t\t██████ ██████ █████▀ ██  ██ ██  ██\n\t\t*/\n\t// add default widgets\n\tts.addWidget({\n\t\tid : 'zebra',\n\t\tpriority : 90,\n\t\tformat : function( table, c, wo ) {\n\t\t\tvar $visibleRows, $row, count, isEven, tbodyIndex, rowIndex, len,\n\t\t\t\tchild = new RegExp( c.cssChildRow, 'i' ),\n\t\t\t\t$tbodies = c.$tbodies.add( $( c.namespace + '_extra_table' ).children( 'tbody:not(.' + c.cssInfoBlock + ')' ) );\n\t\t\tfor ( tbodyIndex = 0; tbodyIndex < $tbodies.length; tbodyIndex++ ) {\n\t\t\t\t// loop through the visible rows\n\t\t\t\tcount = 0;\n\t\t\t\t$visibleRows = $tbodies.eq( tbodyIndex ).children( 'tr:visible' ).not( c.selectorRemove );\n\t\t\t\tlen = $visibleRows.length;\n\t\t\t\tfor ( rowIndex = 0; rowIndex < len; rowIndex++ ) {\n\t\t\t\t\t$row = $visibleRows.eq( rowIndex );\n\t\t\t\t\t// style child rows the same way the parent row was styled\n\t\t\t\t\tif ( !child.test( $row[ 0 ].className ) ) { count++; }\n\t\t\t\t\tisEven = ( count % 2 === 0 );\n\t\t\t\t\t$row\n\t\t\t\t\t\t.removeClass( wo.zebra[ isEven ? 1 : 0 ] )\n\t\t\t\t\t\t.addClass( wo.zebra[ isEven ? 0 : 1 ] );\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\t\tremove : function( table, c, wo, refreshing ) {\n\t\t\tif ( refreshing ) { return; }\n\t\t\tvar tbodyIndex, $tbody,\n\t\t\t\t$tbodies = c.$tbodies,\n\t\t\t\ttoRemove = ( wo.zebra || [ 'even', 'odd' ] ).join( ' ' );\n\t\t\tfor ( tbodyIndex = 0; tbodyIndex < $tbodies.length; tbodyIndex++ ){\n\t\t\t\t$tbody = ts.processTbody( table, $tbodies.eq( tbodyIndex ), true ); // remove tbody\n\t\t\t\t$tbody.children().removeClass( toRemove );\n\t\t\t\tts.processTbody( table, $tbody, false ); // restore tbody\n\t\t\t}\n\t\t}\n\t});\n\n})( jQuery );\n\n/*! Widget: storage - updated 3/1/2016 (v2.25.5) */\n/*global JSON:false */\n;(function ($, window, document) {\n\t'use strict';\n\n\tvar ts = $.tablesorter || {};\n\t// *** Store data in local storage, with a cookie fallback ***\n\t/* IE7 needs JSON library for JSON.stringify - (http://caniuse.com/#search=json)\n\t   if you need it, then include https://github.com/douglascrockford/JSON-js\n\n\t   $.parseJSON is not available is jQuery versions older than 1.4.1, using older\n\t   versions will only allow storing information for one page at a time\n\n\t   // *** Save data (JSON format only) ***\n\t   // val must be valid JSON... use http://jsonlint.com/ to ensure it is valid\n\t   var val = { \"mywidget\" : \"data1\" }; // valid JSON uses double quotes\n\t   // $.tablesorter.storage(table, key, val);\n\t   $.tablesorter.storage(table, 'tablesorter-mywidget', val);\n\n\t   // *** Get data: $.tablesorter.storage(table, key); ***\n\t   v = $.tablesorter.storage(table, 'tablesorter-mywidget');\n\t   // val may be empty, so also check for your data\n\t   val = (v && v.hasOwnProperty('mywidget')) ? v.mywidget : '';\n\t   alert(val); // 'data1' if saved, or '' if not\n\t*/\n\tts.storage = function(table, key, value, options) {\n\t\ttable = $(table)[0];\n\t\tvar cookieIndex, cookies, date,\n\t\t\thasStorage = false,\n\t\t\tvalues = {},\n\t\t\tc = table.config,\n\t\t\two = c && c.widgetOptions,\n\t\t\tstorageType = ( options && options.useSessionStorage ) || ( wo && wo.storage_useSessionStorage ) ?\n\t\t\t\t'sessionStorage' : 'localStorage',\n\t\t\t$table = $(table),\n\t\t\t// id from (1) options ID, (2) table 'data-table-group' attribute, (3) widgetOptions.storage_tableId,\n\t\t\t// (4) table ID, then (5) table index\n\t\t\tid = options && options.id ||\n\t\t\t\t$table.attr( options && options.group || wo && wo.storage_group || 'data-table-group') ||\n\t\t\t\two && wo.storage_tableId || table.id || $('.tablesorter').index( $table ),\n\t\t\t// url from (1) options url, (2) table 'data-table-page' attribute, (3) widgetOptions.storage_fixedUrl,\n\t\t\t// (4) table.config.fixedUrl (deprecated), then (5) window location path\n\t\t\turl = options && options.url ||\n\t\t\t\t$table.attr(options && options.page || wo && wo.storage_page || 'data-table-page') ||\n\t\t\t\two && wo.storage_fixedUrl || c && c.fixedUrl || window.location.pathname;\n\t\t// https://gist.github.com/paulirish/5558557\n\t\tif (storageType in window) {\n\t\t\ttry {\n\t\t\t\twindow[storageType].setItem('_tmptest', 'temp');\n\t\t\t\thasStorage = true;\n\t\t\t\twindow[storageType].removeItem('_tmptest');\n\t\t\t} catch (error) {\n\t\t\t\tif (c && c.debug) {\n\t\t\t\t\tconsole.warn( storageType + ' is not supported in this browser' );\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\t// *** get value ***\n\t\tif ($.parseJSON) {\n\t\t\tif (hasStorage) {\n\t\t\t\tvalues = $.parseJSON( window[storageType][key] || 'null' ) || {};\n\t\t\t} else {\n\t\t\t\t// old browser, using cookies\n\t\t\t\tcookies = document.cookie.split(/[;\\s|=]/);\n\t\t\t\t// add one to get from the key to the value\n\t\t\t\tcookieIndex = $.inArray(key, cookies) + 1;\n\t\t\t\tvalues = (cookieIndex !== 0) ? $.parseJSON(cookies[cookieIndex] || 'null') || {} : {};\n\t\t\t}\n\t\t}\n\t\t// allow value to be an empty string too\n\t\tif (typeof value !== 'undefined' && window.JSON && JSON.hasOwnProperty('stringify')) {\n\t\t\t// add unique identifiers = url pathname > table ID/index on page > data\n\t\t\tif (!values[url]) {\n\t\t\t\tvalues[url] = {};\n\t\t\t}\n\t\t\tvalues[url][id] = value;\n\t\t\t// *** set value ***\n\t\t\tif (hasStorage) {\n\t\t\t\twindow[storageType][key] = JSON.stringify(values);\n\t\t\t} else {\n\t\t\t\tdate = new Date();\n\t\t\t\tdate.setTime(date.getTime() + (31536e+6)); // 365 days\n\t\t\t\tdocument.cookie = key + '=' + (JSON.stringify(values)).replace(/\\\"/g, '\\\"') + '; expires=' + date.toGMTString() + '; path=/';\n\t\t\t}\n\t\t} else {\n\t\t\treturn values && values[url] ? values[url][id] : '';\n\t\t}\n\t};\n\n})(jQuery, window, document);\n\n/*! Widget: uitheme - updated 7/11/2016 (v2.26.6) */\n;(function ($) {\n\t'use strict';\n\tvar ts = $.tablesorter || {};\n\n\tts.themes = {\n\t\t'bootstrap' : {\n\t\t\ttable        : 'table table-bordered table-striped',\n\t\t\tcaption      : 'caption',\n\t\t\t// header class names\n\t\t\theader       : 'bootstrap-header', // give the header a gradient background (theme.bootstrap_2.css)\n\t\t\tsortNone     : '',\n\t\t\tsortAsc      : '',\n\t\t\tsortDesc     : '',\n\t\t\tactive       : '', // applied when column is sorted\n\t\t\thover        : '', // custom css required - a defined bootstrap style may not override other classes\n\t\t\t// icon class names\n\t\t\ticons        : '', // add 'icon-white' to make them white; this icon class is added to the <i> in the header\n\t\t\ticonSortNone : 'bootstrap-icon-unsorted', // class name added to icon when column is not sorted\n\t\t\ticonSortAsc  : 'icon-chevron-up glyphicon glyphicon-chevron-up', // class name added to icon when column has ascending sort\n\t\t\ticonSortDesc : 'icon-chevron-down glyphicon glyphicon-chevron-down', // class name added to icon when column has descending sort\n\t\t\tfilterRow    : '', // filter row class\n\t\t\tfooterRow    : '',\n\t\t\tfooterCells  : '',\n\t\t\teven         : '', // even row zebra striping\n\t\t\todd          : ''  // odd row zebra striping\n\t\t},\n\t\t'jui' : {\n\t\t\ttable        : 'ui-widget ui-widget-content ui-corner-all', // table classes\n\t\t\tcaption      : 'ui-widget-content',\n\t\t\t// header class names\n\t\t\theader       : 'ui-widget-header ui-corner-all ui-state-default', // header classes\n\t\t\tsortNone     : '',\n\t\t\tsortAsc      : '',\n\t\t\tsortDesc     : '',\n\t\t\tactive       : 'ui-state-active', // applied when column is sorted\n\t\t\thover        : 'ui-state-hover',  // hover class\n\t\t\t// icon class names\n\t\t\ticons        : 'ui-icon', // icon class added to the <i> in the header\n\t\t\ticonSortNone : 'ui-icon-carat-2-n-s', // class name added to icon when column is not sorted\n\t\t\ticonSortAsc  : 'ui-icon-carat-1-n', // class name added to icon when column has ascending sort\n\t\t\ticonSortDesc : 'ui-icon-carat-1-s', // class name added to icon when column has descending sort\n\t\t\tfilterRow    : '',\n\t\t\tfooterRow    : '',\n\t\t\tfooterCells  : '',\n\t\t\teven         : 'ui-widget-content', // even row zebra striping\n\t\t\todd          : 'ui-state-default'   // odd row zebra striping\n\t\t}\n\t};\n\n\t$.extend(ts.css, {\n\t\twrapper : 'tablesorter-wrapper' // ui theme & resizable\n\t});\n\n\tts.addWidget({\n\t\tid: 'uitheme',\n\t\tpriority: 10,\n\t\tformat: function(table, c, wo) {\n\t\t\tvar i, tmp, hdr, icon, time, $header, $icon, $tfoot, $h, oldtheme, oldremove, oldIconRmv, hasOldTheme,\n\t\t\t\tthemesAll = ts.themes,\n\t\t\t\t$table = c.$table.add( $( c.namespace + '_extra_table' ) ),\n\t\t\t\t$headers = c.$headers.add( $( c.namespace + '_extra_headers' ) ),\n\t\t\t\ttheme = c.theme || 'jui',\n\t\t\t\tthemes = themesAll[theme] || {},\n\t\t\t\tremove = $.trim( [ themes.sortNone, themes.sortDesc, themes.sortAsc, themes.active ].join( ' ' ) ),\n\t\t\t\ticonRmv = $.trim( [ themes.iconSortNone, themes.iconSortDesc, themes.iconSortAsc ].join( ' ' ) );\n\t\t\tif (c.debug) { time = new Date(); }\n\t\t\t// initialization code - run once\n\t\t\tif (!$table.hasClass('tablesorter-' + theme) || c.theme !== c.appliedTheme || !wo.uitheme_applied) {\n\t\t\t\two.uitheme_applied = true;\n\t\t\t\toldtheme = themesAll[c.appliedTheme] || {};\n\t\t\t\thasOldTheme = !$.isEmptyObject(oldtheme);\n\t\t\t\toldremove =  hasOldTheme ? [ oldtheme.sortNone, oldtheme.sortDesc, oldtheme.sortAsc, oldtheme.active ].join( ' ' ) : '';\n\t\t\t\toldIconRmv = hasOldTheme ? [ oldtheme.iconSortNone, oldtheme.iconSortDesc, oldtheme.iconSortAsc ].join( ' ' ) : '';\n\t\t\t\tif (hasOldTheme) {\n\t\t\t\t\two.zebra[0] = $.trim( ' ' + wo.zebra[0].replace(' ' + oldtheme.even, '') );\n\t\t\t\t\two.zebra[1] = $.trim( ' ' + wo.zebra[1].replace(' ' + oldtheme.odd, '') );\n\t\t\t\t\tc.$tbodies.children().removeClass( [ oldtheme.even, oldtheme.odd ].join(' ') );\n\t\t\t\t}\n\t\t\t\t// update zebra stripes\n\t\t\t\tif (themes.even) { wo.zebra[0] += ' ' + themes.even; }\n\t\t\t\tif (themes.odd) { wo.zebra[1] += ' ' + themes.odd; }\n\t\t\t\t// add caption style\n\t\t\t\t$table.children('caption')\n\t\t\t\t\t.removeClass(oldtheme.caption || '')\n\t\t\t\t\t.addClass(themes.caption);\n\t\t\t\t// add table/footer class names\n\t\t\t\t$tfoot = $table\n\t\t\t\t\t// remove other selected themes\n\t\t\t\t\t.removeClass( (c.appliedTheme ? 'tablesorter-' + (c.appliedTheme || '') : '') + ' ' + (oldtheme.table || '') )\n\t\t\t\t\t.addClass('tablesorter-' + theme + ' ' + (themes.table || '')) // add theme widget class name\n\t\t\t\t\t.children('tfoot');\n\t\t\t\tc.appliedTheme = c.theme;\n\n\t\t\t\tif ($tfoot.length) {\n\t\t\t\t\t$tfoot\n\t\t\t\t\t\t// if oldtheme.footerRow or oldtheme.footerCells are undefined, all class names are removed\n\t\t\t\t\t\t.children('tr').removeClass(oldtheme.footerRow || '').addClass(themes.footerRow)\n\t\t\t\t\t\t.children('th, td').removeClass(oldtheme.footerCells || '').addClass(themes.footerCells);\n\t\t\t\t}\n\t\t\t\t// update header classes\n\t\t\t\t$headers\n\t\t\t\t\t.removeClass( (hasOldTheme ? [ oldtheme.header, oldtheme.hover, oldremove ].join(' ') : '') || '' )\n\t\t\t\t\t.addClass(themes.header)\n\t\t\t\t\t.not('.sorter-false')\n\t\t\t\t\t.unbind('mouseenter.tsuitheme mouseleave.tsuitheme')\n\t\t\t\t\t.bind('mouseenter.tsuitheme mouseleave.tsuitheme', function(event) {\n\t\t\t\t\t\t// toggleClass with switch added in jQuery 1.3\n\t\t\t\t\t\t$(this)[ event.type === 'mouseenter' ? 'addClass' : 'removeClass' ](themes.hover || '');\n\t\t\t\t\t});\n\n\t\t\t\t$headers.each(function(){\n\t\t\t\t\tvar $this = $(this);\n\t\t\t\t\tif (!$this.find('.' + ts.css.wrapper).length) {\n\t\t\t\t\t\t// Firefox needs this inner div to position the icon & resizer correctly\n\t\t\t\t\t\t$this.wrapInner('<div class=\"' + ts.css.wrapper + '\" style=\"position:relative;height:100%;width:100%\"></div>');\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t\tif (c.cssIcon) {\n\t\t\t\t\t// if c.cssIcon is '', then no <i> is added to the header\n\t\t\t\t\t$headers\n\t\t\t\t\t\t.find('.' + ts.css.icon)\n\t\t\t\t\t\t.removeClass(hasOldTheme ? [ oldtheme.icons, oldIconRmv ].join(' ') : '')\n\t\t\t\t\t\t.addClass(themes.icons || '');\n\t\t\t\t}\n\t\t\t\t// filter widget initializes after uitheme\n\t\t\t\tif (c.widgets.indexOf('filter') > -1) {\n\t\t\t\t\ttmp = function() {\n\t\t\t\t\t\t$table.children('thead').children('.' + ts.css.filterRow)\n\t\t\t\t\t\t\t.removeClass(hasOldTheme ? oldtheme.filterRow || '' : '')\n\t\t\t\t\t\t\t.addClass(themes.filterRow || '');\n\t\t\t\t\t};\n\t\t\t\t\tif (wo.filter_initialized) {\n\t\t\t\t\t\ttmp();\n\t\t\t\t\t} else {\n\t\t\t\t\t\t$table.one('filterInit', function() {\n\t\t\t\t\t\t\ttmp();\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\tfor (i = 0; i < c.columns; i++) {\n\t\t\t\t$header = c.$headers\n\t\t\t\t\t.add($(c.namespace + '_extra_headers'))\n\t\t\t\t\t.not('.sorter-false')\n\t\t\t\t\t.filter('[data-column=\"' + i + '\"]');\n\t\t\t\t$icon = (ts.css.icon) ? $header.find('.' + ts.css.icon) : $();\n\t\t\t\t$h = $headers.not('.sorter-false').filter('[data-column=\"' + i + '\"]:last');\n\t\t\t\tif ($h.length) {\n\t\t\t\t\t$header.removeClass(remove);\n\t\t\t\t\t$icon.removeClass(iconRmv);\n\t\t\t\t\tif ($h[0].sortDisabled) {\n\t\t\t\t\t\t// no sort arrows for disabled columns!\n\t\t\t\t\t\t$icon.removeClass(themes.icons || '');\n\t\t\t\t\t} else {\n\t\t\t\t\t\thdr = themes.sortNone;\n\t\t\t\t\t\ticon = themes.iconSortNone;\n\t\t\t\t\t\tif ($h.hasClass(ts.css.sortAsc)) {\n\t\t\t\t\t\t\thdr = [ themes.sortAsc, themes.active ].join(' ');\n\t\t\t\t\t\t\ticon = themes.iconSortAsc;\n\t\t\t\t\t\t} else if ($h.hasClass(ts.css.sortDesc)) {\n\t\t\t\t\t\t\thdr = [ themes.sortDesc, themes.active ].join(' ');\n\t\t\t\t\t\t\ticon = themes.iconSortDesc;\n\t\t\t\t\t\t}\n\t\t\t\t\t\t$header.addClass(hdr);\n\t\t\t\t\t\t$icon.addClass(icon || '');\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (c.debug) {\n\t\t\t\tconsole.log('Applying ' + theme + ' theme' + ts.benchmark(time));\n\t\t\t}\n\t\t},\n\t\tremove: function(table, c, wo, refreshing) {\n\t\t\tif (!wo.uitheme_applied) { return; }\n\t\t\tvar $table = c.$table,\n\t\t\t\ttheme = c.appliedTheme || 'jui',\n\t\t\t\tthemes = ts.themes[ theme ] || ts.themes.jui,\n\t\t\t\t$headers = $table.children('thead').children(),\n\t\t\t\tremove = themes.sortNone + ' ' + themes.sortDesc + ' ' + themes.sortAsc,\n\t\t\t\ticonRmv = themes.iconSortNone + ' ' + themes.iconSortDesc + ' ' + themes.iconSortAsc;\n\t\t\t$table.removeClass('tablesorter-' + theme + ' ' + themes.table);\n\t\t\two.uitheme_applied = false;\n\t\t\tif (refreshing) { return; }\n\t\t\t$table.find(ts.css.header).removeClass(themes.header);\n\t\t\t$headers\n\t\t\t\t.unbind('mouseenter.tsuitheme mouseleave.tsuitheme') // remove hover\n\t\t\t\t.removeClass(themes.hover + ' ' + remove + ' ' + themes.active)\n\t\t\t\t.filter('.' + ts.css.filterRow)\n\t\t\t\t.removeClass(themes.filterRow);\n\t\t\t$headers.find('.' + ts.css.icon).removeClass(themes.icons + ' ' + iconRmv);\n\t\t}\n\t});\n\n})(jQuery);\n\n/*! Widget: columns */\n;(function ($) {\n\t'use strict';\n\tvar ts = $.tablesorter || {};\n\n\tts.addWidget({\n\t\tid: 'columns',\n\t\tpriority: 30,\n\t\toptions : {\n\t\t\tcolumns : [ 'primary', 'secondary', 'tertiary' ]\n\t\t},\n\t\tformat: function(table, c, wo) {\n\t\t\tvar $tbody, tbodyIndex, $rows, rows, $row, $cells, remove, indx,\n\t\t\t$table = c.$table,\n\t\t\t$tbodies = c.$tbodies,\n\t\t\tsortList = c.sortList,\n\t\t\tlen = sortList.length,\n\t\t\t// removed c.widgetColumns support\n\t\t\tcss = wo && wo.columns || [ 'primary', 'secondary', 'tertiary' ],\n\t\t\tlast = css.length - 1;\n\t\t\tremove = css.join(' ');\n\t\t\t// check if there is a sort (on initialization there may not be one)\n\t\t\tfor (tbodyIndex = 0; tbodyIndex < $tbodies.length; tbodyIndex++ ) {\n\t\t\t\t$tbody = ts.processTbody(table, $tbodies.eq(tbodyIndex), true); // detach tbody\n\t\t\t\t$rows = $tbody.children('tr');\n\t\t\t\t// loop through the visible rows\n\t\t\t\t$rows.each(function() {\n\t\t\t\t\t$row = $(this);\n\t\t\t\t\tif (this.style.display !== 'none') {\n\t\t\t\t\t\t// remove all columns class names\n\t\t\t\t\t\t$cells = $row.children().removeClass(remove);\n\t\t\t\t\t\t// add appropriate column class names\n\t\t\t\t\t\tif (sortList && sortList[0]) {\n\t\t\t\t\t\t\t// primary sort column class\n\t\t\t\t\t\t\t$cells.eq(sortList[0][0]).addClass(css[0]);\n\t\t\t\t\t\t\tif (len > 1) {\n\t\t\t\t\t\t\t\tfor (indx = 1; indx < len; indx++) {\n\t\t\t\t\t\t\t\t\t// secondary, tertiary, etc sort column classes\n\t\t\t\t\t\t\t\t\t$cells.eq(sortList[indx][0]).addClass( css[indx] || css[last] );\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t\tts.processTbody(table, $tbody, false);\n\t\t\t}\n\t\t\t// add classes to thead and tfoot\n\t\t\trows = wo.columns_thead !== false ? [ 'thead tr' ] : [];\n\t\t\tif (wo.columns_tfoot !== false) {\n\t\t\t\trows.push('tfoot tr');\n\t\t\t}\n\t\t\tif (rows.length) {\n\t\t\t\t$rows = $table.find( rows.join(',') ).children().removeClass(remove);\n\t\t\t\tif (len) {\n\t\t\t\t\tfor (indx = 0; indx < len; indx++) {\n\t\t\t\t\t\t// add primary. secondary, tertiary, etc sort column classes\n\t\t\t\t\t\t$rows.filter('[data-column=\"' + sortList[indx][0] + '\"]').addClass(css[indx] || css[last]);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\t\tremove: function(table, c, wo) {\n\t\t\tvar tbodyIndex, $tbody,\n\t\t\t\t$tbodies = c.$tbodies,\n\t\t\t\tremove = (wo.columns || [ 'primary', 'secondary', 'tertiary' ]).join(' ');\n\t\t\tc.$headers.removeClass(remove);\n\t\t\tc.$table.children('tfoot').children('tr').children('th, td').removeClass(remove);\n\t\t\tfor (tbodyIndex = 0; tbodyIndex < $tbodies.length; tbodyIndex++ ) {\n\t\t\t\t$tbody = ts.processTbody(table, $tbodies.eq(tbodyIndex), true); // remove tbody\n\t\t\t\t$tbody.children('tr').each(function() {\n\t\t\t\t\t$(this).children().removeClass(remove);\n\t\t\t\t});\n\t\t\t\tts.processTbody(table, $tbody, false); // restore tbody\n\t\t\t}\n\t\t}\n\t});\n\n})(jQuery);\n\n/*! Widget: filter - updated 7/11/2016 (v2.26.6) *//*\n * Requires tablesorter v2.8+ and jQuery 1.7+\n * by Rob Garrison\n */\n;( function ( $ ) {\n\t'use strict';\n\tvar tsf, tsfRegex,\n\t\tts = $.tablesorter || {},\n\t\ttscss = ts.css,\n\t\ttskeyCodes = ts.keyCodes;\n\n\t$.extend( tscss, {\n\t\tfilterRow      : 'tablesorter-filter-row',\n\t\tfilter         : 'tablesorter-filter',\n\t\tfilterDisabled : 'disabled',\n\t\tfilterRowHide  : 'hideme'\n\t});\n\n\t$.extend( tskeyCodes, {\n\t\tbackSpace : 8,\n\t\tescape : 27,\n\t\tspace : 32,\n\t\tleft : 37,\n\t\tdown : 40\n\t});\n\n\tts.addWidget({\n\t\tid: 'filter',\n\t\tpriority: 50,\n\t\toptions : {\n\t\t\tfilter_cellFilter    : '',    // css class name added to the filter cell ( string or array )\n\t\t\tfilter_childRows     : false, // if true, filter includes child row content in the search\n\t\t\tfilter_childByColumn : false, // ( filter_childRows must be true ) if true = search child rows by column; false = search all child row text grouped\n\t\t\tfilter_childWithSibs : true,  // if true, include matching child row siblings\n\t\t\tfilter_columnAnyMatch: true,  // if true, allows using '#:{query}' in AnyMatch searches ( column:query )\n\t\t\tfilter_columnFilters : true,  // if true, a filter will be added to the top of each table column\n\t\t\tfilter_cssFilter     : '',    // css class name added to the filter row & each input in the row ( tablesorter-filter is ALWAYS added )\n\t\t\tfilter_defaultAttrib : 'data-value', // data attribute in the header cell that contains the default filter value\n\t\t\tfilter_defaultFilter : {},    // add a default column filter type '~{query}' to make fuzzy searches default; '{q1} AND {q2}' to make all searches use a logical AND.\n\t\t\tfilter_excludeFilter : {},    // filters to exclude, per column\n\t\t\tfilter_external      : '',    // jQuery selector string ( or jQuery object ) of external filters\n\t\t\tfilter_filteredRow   : 'filtered', // class added to filtered rows; define in css with \"display:none\" to hide the filtered-out rows\n\t\t\tfilter_formatter     : null,  // add custom filter elements to the filter row\n\t\t\tfilter_functions     : null,  // add custom filter functions using this option\n\t\t\tfilter_hideEmpty     : true,  // hide filter row when table is empty\n\t\t\tfilter_hideFilters   : false, // collapse filter row when mouse leaves the area\n\t\t\tfilter_ignoreCase    : true,  // if true, make all searches case-insensitive\n\t\t\tfilter_liveSearch    : true,  // if true, search column content while the user types ( with a delay )\n\t\t\tfilter_matchType     : { 'input': 'exact', 'select': 'exact' }, // global query settings ('exact' or 'match'); overridden by \"filter-match\" or \"filter-exact\" class\n\t\t\tfilter_onlyAvail     : 'filter-onlyAvail', // a header with a select dropdown & this class name will only show available ( visible ) options within the drop down\n\t\t\tfilter_placeholder   : { search : '', select : '' }, // default placeholder text ( overridden by any header 'data-placeholder' setting )\n\t\t\tfilter_reset         : null,  // jQuery selector string of an element used to reset the filters\n\t\t\tfilter_resetOnEsc    : true,  // Reset filter input when the user presses escape - normalized across browsers\n\t\t\tfilter_saveFilters   : false, // Use the $.tablesorter.storage utility to save the most recent filters\n\t\t\tfilter_searchDelay   : 300,   // typing delay in milliseconds before starting a search\n\t\t\tfilter_searchFiltered: true,  // allow searching through already filtered rows in special circumstances; will speed up searching in large tables if true\n\t\t\tfilter_selectSource  : null,  // include a function to return an array of values to be added to the column filter select\n\t\t\tfilter_selectSourceSeparator : '|', // filter_selectSource array text left of the separator is added to the option value, right into the option text\n\t\t\tfilter_serversideFiltering : false, // if true, must perform server-side filtering b/c client-side filtering is disabled, but the ui and events will still be used.\n\t\t\tfilter_startsWith    : false, // if true, filter start from the beginning of the cell contents\n\t\t\tfilter_useParsedData : false  // filter all data using parsed content\n\t\t},\n\t\tformat: function( table, c, wo ) {\n\t\t\tif ( !c.$table.hasClass( 'hasFilters' ) ) {\n\t\t\t\ttsf.init( table, c, wo );\n\t\t\t}\n\t\t},\n\t\tremove: function( table, c, wo, refreshing ) {\n\t\t\tvar tbodyIndex, $tbody,\n\t\t\t\t$table = c.$table,\n\t\t\t\t$tbodies = c.$tbodies,\n\t\t\t\tevents = 'addRows updateCell update updateRows updateComplete appendCache filterReset filterEnd search '\n\t\t\t\t\t.split( ' ' ).join( c.namespace + 'filter ' );\n\t\t\t$table\n\t\t\t\t.removeClass( 'hasFilters' )\n\t\t\t\t// add filter namespace to all BUT search\n\t\t\t\t.unbind( events.replace( ts.regex.spaces, ' ' ) )\n\t\t\t\t// remove the filter row even if refreshing, because the column might have been moved\n\t\t\t\t.find( '.' + tscss.filterRow ).remove();\n\t\t\two.filter_initialized = false;\n\t\t\tif ( refreshing ) { return; }\n\t\t\tfor ( tbodyIndex = 0; tbodyIndex < $tbodies.length; tbodyIndex++ ) {\n\t\t\t\t$tbody = ts.processTbody( table, $tbodies.eq( tbodyIndex ), true ); // remove tbody\n\t\t\t\t$tbody.children().removeClass( wo.filter_filteredRow ).show();\n\t\t\t\tts.processTbody( table, $tbody, false ); // restore tbody\n\t\t\t}\n\t\t\tif ( wo.filter_reset ) {\n\t\t\t\t$( document ).undelegate( wo.filter_reset, 'click' + c.namespace + 'filter' );\n\t\t\t}\n\t\t}\n\t});\n\n\ttsf = ts.filter = {\n\n\t\t// regex used in filter 'check' functions - not for general use and not documented\n\t\tregex: {\n\t\t\tregex     : /^\\/((?:\\\\\\/|[^\\/])+)\\/([mig]{0,3})?$/, // regex to test for regex\n\t\t\tchild     : /tablesorter-childRow/, // child row class name; this gets updated in the script\n\t\t\tfiltered  : /filtered/, // filtered (hidden) row class name; updated in the script\n\t\t\ttype      : /undefined|number/, // check type\n\t\t\texact     : /(^[\\\"\\'=]+)|([\\\"\\'=]+$)/g, // exact match (allow '==')\n\t\t\toperators : /[<>=]/g, // replace operators\n\t\t\tquery     : '(q|query)', // replace filter queries\n\t\t\twild01    : /\\?/g, // wild card match 0 or 1\n\t\t\twild0More : /\\*/g, // wild care match 0 or more\n\t\t\tquote     : /\\\"/g,\n\t\t\tisNeg1    : /(>=?\\s*-\\d)/,\n\t\t\tisNeg2    : /(<=?\\s*\\d)/\n\t\t},\n\t\t// function( c, data ) { }\n\t\t// c = table.config\n\t\t// data.$row = jQuery object of the row currently being processed\n\t\t// data.$cells = jQuery object of all cells within the current row\n\t\t// data.filters = array of filters for all columns ( some may be undefined )\n\t\t// data.filter = filter for the current column\n\t\t// data.iFilter = same as data.filter, except lowercase ( if wo.filter_ignoreCase is true )\n\t\t// data.exact = table cell text ( or parsed data if column parser enabled; may be a number & not a string )\n\t\t// data.iExact = same as data.exact, except lowercase ( if wo.filter_ignoreCase is true; may be a number & not a string )\n\t\t// data.cache = table cell text from cache, so it has been parsed ( & in all lower case if c.ignoreCase is true )\n\t\t// data.cacheArray = An array of parsed content from each table cell in the row being processed\n\t\t// data.index = column index; table = table element ( DOM )\n\t\t// data.parsed = array ( by column ) of boolean values ( from filter_useParsedData or 'filter-parsed' class )\n\t\ttypes: {\n\t\t\tor : function( c, data, vars ) {\n\t\t\t\t// look for \"|\", but not if it is inside of a regular expression\n\t\t\t\tif ( ( tsfRegex.orTest.test( data.iFilter ) || tsfRegex.orSplit.test( data.filter ) ) &&\n\t\t\t\t\t// this test for regex has potential to slow down the overall search\n\t\t\t\t\t!tsfRegex.regex.test( data.filter ) ) {\n\t\t\t\t\tvar indx, filterMatched, query, regex,\n\t\t\t\t\t\t// duplicate data but split filter\n\t\t\t\t\t\tdata2 = $.extend( {}, data ),\n\t\t\t\t\t\tfilter = data.filter.split( tsfRegex.orSplit ),\n\t\t\t\t\t\tiFilter = data.iFilter.split( tsfRegex.orSplit ),\n\t\t\t\t\t\tlen = filter.length;\n\t\t\t\t\tfor ( indx = 0; indx < len; indx++ ) {\n\t\t\t\t\t\tdata2.nestedFilters = true;\n\t\t\t\t\t\tdata2.filter = '' + ( tsf.parseFilter( c, filter[ indx ], data ) || '' );\n\t\t\t\t\t\tdata2.iFilter = '' + ( tsf.parseFilter( c, iFilter[ indx ], data ) || '' );\n\t\t\t\t\t\tquery = '(' + ( tsf.parseFilter( c, data2.filter, data ) || '' ) + ')';\n\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\t// use try/catch, because query may not be a valid regex if \"|\" is contained within a partial regex search,\n\t\t\t\t\t\t\t// e.g \"/(Alex|Aar\" -> Uncaught SyntaxError: Invalid regular expression: /(/(Alex)/: Unterminated group\n\t\t\t\t\t\t\tregex = new RegExp( data.isMatch ? query : '^' + query + '$', c.widgetOptions.filter_ignoreCase ? 'i' : '' );\n\t\t\t\t\t\t\t// filterMatched = data2.filter === '' && indx > 0 ? true\n\t\t\t\t\t\t\t// look for an exact match with the 'or' unless the 'filter-match' class is found\n\t\t\t\t\t\t\tfilterMatched = regex.test( data2.exact ) || tsf.processTypes( c, data2, vars );\n\t\t\t\t\t\t\tif ( filterMatched ) {\n\t\t\t\t\t\t\t\treturn filterMatched;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t} catch ( error ) {\n\t\t\t\t\t\t\treturn null;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\t// may be null from processing types\n\t\t\t\t\treturn filterMatched || false;\n\t\t\t\t}\n\t\t\t\treturn null;\n\t\t\t},\n\t\t\t// Look for an AND or && operator ( logical and )\n\t\t\tand : function( c, data, vars ) {\n\t\t\t\tif ( tsfRegex.andTest.test( data.filter ) ) {\n\t\t\t\t\tvar indx, filterMatched, result, query, regex,\n\t\t\t\t\t\t// duplicate data but split filter\n\t\t\t\t\t\tdata2 = $.extend( {}, data ),\n\t\t\t\t\t\tfilter = data.filter.split( tsfRegex.andSplit ),\n\t\t\t\t\t\tiFilter = data.iFilter.split( tsfRegex.andSplit ),\n\t\t\t\t\t\tlen = filter.length;\n\t\t\t\t\tfor ( indx = 0; indx < len; indx++ ) {\n\t\t\t\t\t\tdata2.nestedFilters = true;\n\t\t\t\t\t\tdata2.filter = '' + ( tsf.parseFilter( c, filter[ indx ], data ) || '' );\n\t\t\t\t\t\tdata2.iFilter = '' + ( tsf.parseFilter( c, iFilter[ indx ], data ) || '' );\n\t\t\t\t\t\tquery = ( '(' + ( tsf.parseFilter( c, data2.filter, data ) || '' ) + ')' )\n\t\t\t\t\t\t\t// replace wild cards since /(a*)/i will match anything\n\t\t\t\t\t\t\t.replace( tsfRegex.wild01, '\\\\S{1}' ).replace( tsfRegex.wild0More, '\\\\S*' );\n\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\t// use try/catch just in case RegExp is invalid\n\t\t\t\t\t\t\tregex = new RegExp( data.isMatch ? query : '^' + query + '$', c.widgetOptions.filter_ignoreCase ? 'i' : '' );\n\t\t\t\t\t\t\t// look for an exact match with the 'and' unless the 'filter-match' class is found\n\t\t\t\t\t\t\tresult = ( regex.test( data2.exact ) || tsf.processTypes( c, data2, vars ) );\n\t\t\t\t\t\t\tif ( indx === 0 ) {\n\t\t\t\t\t\t\t\tfilterMatched = result;\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\tfilterMatched = filterMatched && result;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t} catch ( error ) {\n\t\t\t\t\t\t\treturn null;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\t// may be null from processing types\n\t\t\t\t\treturn filterMatched || false;\n\t\t\t\t}\n\t\t\t\treturn null;\n\t\t\t},\n\t\t\t// Look for regex\n\t\t\tregex: function( c, data ) {\n\t\t\t\tif ( tsfRegex.regex.test( data.filter ) ) {\n\t\t\t\t\tvar matches,\n\t\t\t\t\t\t// cache regex per column for optimal speed\n\t\t\t\t\t\tregex = data.filter_regexCache[ data.index ] || tsfRegex.regex.exec( data.filter ),\n\t\t\t\t\t\tisRegex = regex instanceof RegExp;\n\t\t\t\t\ttry {\n\t\t\t\t\t\tif ( !isRegex ) {\n\t\t\t\t\t\t\t// force case insensitive search if ignoreCase option set?\n\t\t\t\t\t\t\t// if ( c.ignoreCase && !regex[2] ) { regex[2] = 'i'; }\n\t\t\t\t\t\t\tdata.filter_regexCache[ data.index ] = regex = new RegExp( regex[1], regex[2] );\n\t\t\t\t\t\t}\n\t\t\t\t\t\tmatches = regex.test( data.exact );\n\t\t\t\t\t} catch ( error ) {\n\t\t\t\t\t\tmatches = false;\n\t\t\t\t\t}\n\t\t\t\t\treturn matches;\n\t\t\t\t}\n\t\t\t\treturn null;\n\t\t\t},\n\t\t\t// Look for operators >, >=, < or <=\n\t\t\toperators: function( c, data ) {\n\t\t\t\t// ignore empty strings... because '' < 10 is true\n\t\t\t\tif ( tsfRegex.operTest.test( data.iFilter ) && data.iExact !== '' ) {\n\t\t\t\t\tvar cachedValue, result, txt,\n\t\t\t\t\t\ttable = c.table,\n\t\t\t\t\t\tparsed = data.parsed[ data.index ],\n\t\t\t\t\t\tquery = ts.formatFloat( data.iFilter.replace( tsfRegex.operators, '' ), table ),\n\t\t\t\t\t\tparser = c.parsers[ data.index ] || {},\n\t\t\t\t\t\tsavedSearch = query;\n\t\t\t\t\t// parse filter value in case we're comparing numbers ( dates )\n\t\t\t\t\tif ( parsed || parser.type === 'numeric' ) {\n\t\t\t\t\t\ttxt = $.trim( '' + data.iFilter.replace( tsfRegex.operators, '' ) );\n\t\t\t\t\t\tresult = tsf.parseFilter( c, txt, data, true );\n\t\t\t\t\t\tquery = ( typeof result === 'number' && result !== '' && !isNaN( result ) ) ? result : query;\n\t\t\t\t\t}\n\t\t\t\t\t// iExact may be numeric - see issue #149;\n\t\t\t\t\t// check if cached is defined, because sometimes j goes out of range? ( numeric columns )\n\t\t\t\t\tif ( ( parsed || parser.type === 'numeric' ) && !isNaN( query ) &&\n\t\t\t\t\t\ttypeof data.cache !== 'undefined' ) {\n\t\t\t\t\t\tcachedValue = data.cache;\n\t\t\t\t\t} else {\n\t\t\t\t\t\ttxt = isNaN( data.iExact ) ? data.iExact.replace( ts.regex.nondigit, '' ) : data.iExact;\n\t\t\t\t\t\tcachedValue = ts.formatFloat( txt, table );\n\t\t\t\t\t}\n\t\t\t\t\tif ( tsfRegex.gtTest.test( data.iFilter ) ) {\n\t\t\t\t\t\tresult = tsfRegex.gteTest.test( data.iFilter ) ? cachedValue >= query : cachedValue > query;\n\t\t\t\t\t} else if ( tsfRegex.ltTest.test( data.iFilter ) ) {\n\t\t\t\t\t\tresult = tsfRegex.lteTest.test( data.iFilter ) ? cachedValue <= query : cachedValue < query;\n\t\t\t\t\t}\n\t\t\t\t\t// keep showing all rows if nothing follows the operator\n\t\t\t\t\tif ( !result && savedSearch === '' ) {\n\t\t\t\t\t\tresult = true;\n\t\t\t\t\t}\n\t\t\t\t\treturn result;\n\t\t\t\t}\n\t\t\t\treturn null;\n\t\t\t},\n\t\t\t// Look for a not match\n\t\t\tnotMatch: function( c, data ) {\n\t\t\t\tif ( tsfRegex.notTest.test( data.iFilter ) ) {\n\t\t\t\t\tvar indx,\n\t\t\t\t\t\ttxt = data.iFilter.replace( '!', '' ),\n\t\t\t\t\t\tfilter = tsf.parseFilter( c, txt, data ) || '';\n\t\t\t\t\tif ( tsfRegex.exact.test( filter ) ) {\n\t\t\t\t\t\t// look for exact not matches - see #628\n\t\t\t\t\t\tfilter = filter.replace( tsfRegex.exact, '' );\n\t\t\t\t\t\treturn filter === '' ? true : $.trim( filter ) !== data.iExact;\n\t\t\t\t\t} else {\n\t\t\t\t\t\tindx = data.iExact.search( $.trim( filter ) );\n\t\t\t\t\t\treturn filter === '' ? true :\n\t\t\t\t\t\t\t// return true if not found\n\t\t\t\t\t\t\tdata.anyMatch ? indx < 0 :\n\t\t\t\t\t\t\t// return false if found\n\t\t\t\t\t\t\t!( c.widgetOptions.filter_startsWith ? indx === 0 : indx >= 0 );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\treturn null;\n\t\t\t},\n\t\t\t// Look for quotes or equals to get an exact match; ignore type since iExact could be numeric\n\t\t\texact: function( c, data ) {\n\t\t\t\t/*jshint eqeqeq:false */\n\t\t\t\tif ( tsfRegex.exact.test( data.iFilter ) ) {\n\t\t\t\t\tvar txt = data.iFilter.replace( tsfRegex.exact, '' ),\n\t\t\t\t\t\tfilter = tsf.parseFilter( c, txt, data ) || '';\n\t\t\t\t\treturn data.anyMatch ? $.inArray( filter, data.rowArray ) >= 0 : filter == data.iExact;\n\t\t\t\t}\n\t\t\t\treturn null;\n\t\t\t},\n\t\t\t// Look for a range ( using ' to ' or ' - ' ) - see issue #166; thanks matzhu!\n\t\t\trange : function( c, data ) {\n\t\t\t\tif ( tsfRegex.toTest.test( data.iFilter ) ) {\n\t\t\t\t\tvar result, tmp, range1, range2,\n\t\t\t\t\t\ttable = c.table,\n\t\t\t\t\t\tindex = data.index,\n\t\t\t\t\t\tparsed = data.parsed[index],\n\t\t\t\t\t\t// make sure the dash is for a range and not indicating a negative number\n\t\t\t\t\t\tquery = data.iFilter.split( tsfRegex.toSplit );\n\n\t\t\t\t\ttmp = query[0].replace( ts.regex.nondigit, '' ) || '';\n\t\t\t\t\trange1 = ts.formatFloat( tsf.parseFilter( c, tmp, data ), table );\n\t\t\t\t\ttmp = query[1].replace( ts.regex.nondigit, '' ) || '';\n\t\t\t\t\trange2 = ts.formatFloat( tsf.parseFilter( c, tmp, data ), table );\n\t\t\t\t\t// parse filter value in case we're comparing numbers ( dates )\n\t\t\t\t\tif ( parsed || c.parsers[ index ].type === 'numeric' ) {\n\t\t\t\t\t\tresult = c.parsers[ index ].format( '' + query[0], table, c.$headers.eq( index ), index );\n\t\t\t\t\t\trange1 = ( result !== '' && !isNaN( result ) ) ? result : range1;\n\t\t\t\t\t\tresult = c.parsers[ index ].format( '' + query[1], table, c.$headers.eq( index ), index );\n\t\t\t\t\t\trange2 = ( result !== '' && !isNaN( result ) ) ? result : range2;\n\t\t\t\t\t}\n\t\t\t\t\tif ( ( parsed || c.parsers[ index ].type === 'numeric' ) && !isNaN( range1 ) && !isNaN( range2 ) ) {\n\t\t\t\t\t\tresult = data.cache;\n\t\t\t\t\t} else {\n\t\t\t\t\t\ttmp = isNaN( data.iExact ) ? data.iExact.replace( ts.regex.nondigit, '' ) : data.iExact;\n\t\t\t\t\t\tresult = ts.formatFloat( tmp, table );\n\t\t\t\t\t}\n\t\t\t\t\tif ( range1 > range2 ) {\n\t\t\t\t\t\ttmp = range1; range1 = range2; range2 = tmp; // swap\n\t\t\t\t\t}\n\t\t\t\t\treturn ( result >= range1 && result <= range2 ) || ( range1 === '' || range2 === '' );\n\t\t\t\t}\n\t\t\t\treturn null;\n\t\t\t},\n\t\t\t// Look for wild card: ? = single, * = multiple, or | = logical OR\n\t\t\twild : function( c, data ) {\n\t\t\t\tif ( tsfRegex.wildOrTest.test( data.iFilter ) ) {\n\t\t\t\t\tvar query = '' + ( tsf.parseFilter( c, data.iFilter, data ) || '' );\n\t\t\t\t\t// look for an exact match with the 'or' unless the 'filter-match' class is found\n\t\t\t\t\tif ( !tsfRegex.wildTest.test( query ) && data.nestedFilters ) {\n\t\t\t\t\t\tquery = data.isMatch ? query : '^(' + query + ')$';\n\t\t\t\t\t}\n\t\t\t\t\t// parsing the filter may not work properly when using wildcards =/\n\t\t\t\t\ttry {\n\t\t\t\t\t\treturn new RegExp(\n\t\t\t\t\t\t\tquery.replace( tsfRegex.wild01, '\\\\S{1}' ).replace( tsfRegex.wild0More, '\\\\S*' ),\n\t\t\t\t\t\t\tc.widgetOptions.filter_ignoreCase ? 'i' : ''\n\t\t\t\t\t\t)\n\t\t\t\t\t\t.test( data.exact );\n\t\t\t\t\t} catch ( error ) {\n\t\t\t\t\t\treturn null;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\treturn null;\n\t\t\t},\n\t\t\t// fuzzy text search; modified from https://github.com/mattyork/fuzzy ( MIT license )\n\t\t\tfuzzy: function( c, data ) {\n\t\t\t\tif ( tsfRegex.fuzzyTest.test( data.iFilter ) ) {\n\t\t\t\t\tvar indx,\n\t\t\t\t\t\tpatternIndx = 0,\n\t\t\t\t\t\tlen = data.iExact.length,\n\t\t\t\t\t\ttxt = data.iFilter.slice( 1 ),\n\t\t\t\t\t\tpattern = tsf.parseFilter( c, txt, data ) || '';\n\t\t\t\t\tfor ( indx = 0; indx < len; indx++ ) {\n\t\t\t\t\t\tif ( data.iExact[ indx ] === pattern[ patternIndx ] ) {\n\t\t\t\t\t\t\tpatternIndx += 1;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\treturn patternIndx === pattern.length;\n\t\t\t\t}\n\t\t\t\treturn null;\n\t\t\t}\n\t\t},\n\t\tinit: function( table ) {\n\t\t\t// filter language options\n\t\t\tts.language = $.extend( true, {}, {\n\t\t\t\tto  : 'to',\n\t\t\t\tor  : 'or',\n\t\t\t\tand : 'and'\n\t\t\t}, ts.language );\n\n\t\t\tvar options, string, txt, $header, column, val, fxn, noSelect,\n\t\t\t\tc = table.config,\n\t\t\t\two = c.widgetOptions;\n\t\t\tc.$table.addClass( 'hasFilters' );\n\t\t\tc.lastSearch = [];\n\n\t\t\t// define timers so using clearTimeout won't cause an undefined error\n\t\t\two.filter_searchTimer = null;\n\t\t\two.filter_initTimer = null;\n\t\t\two.filter_formatterCount = 0;\n\t\t\two.filter_formatterInit = [];\n\t\t\two.filter_anyColumnSelector = '[data-column=\"all\"],[data-column=\"any\"]';\n\t\t\two.filter_multipleColumnSelector = '[data-column*=\"-\"],[data-column*=\",\"]';\n\n\t\t\tval = '\\\\{' + tsfRegex.query + '\\\\}';\n\t\t\t$.extend( tsfRegex, {\n\t\t\t\tchild : new RegExp( c.cssChildRow ),\n\t\t\t\tfiltered : new RegExp( wo.filter_filteredRow ),\n\t\t\t\talreadyFiltered : new RegExp( '(\\\\s+(' + ts.language.or + '|-|' + ts.language.to + ')\\\\s+)', 'i' ),\n\t\t\t\ttoTest : new RegExp( '\\\\s+(-|' + ts.language.to + ')\\\\s+', 'i' ),\n\t\t\t\ttoSplit : new RegExp( '(?:\\\\s+(?:-|' + ts.language.to + ')\\\\s+)', 'gi' ),\n\t\t\t\tandTest : new RegExp( '\\\\s+(' + ts.language.and + '|&&)\\\\s+', 'i' ),\n\t\t\t\tandSplit : new RegExp( '(?:\\\\s+(?:' + ts.language.and + '|&&)\\\\s+)', 'gi' ),\n\t\t\t\torTest : new RegExp( '(\\\\||\\\\s+' + ts.language.or + '\\\\s+)', 'i' ),\n\t\t\t\torSplit : new RegExp( '(?:\\\\s+(?:' + ts.language.or + ')\\\\s+|\\\\|)', 'gi' ),\n\t\t\t\tiQuery : new RegExp( val, 'i' ),\n\t\t\t\tigQuery : new RegExp( val, 'ig' ),\n\t\t\t\toperTest : /^[<>]=?/,\n\t\t\t\tgtTest  : />/,\n\t\t\t\tgteTest : />=/,\n\t\t\t\tltTest  : /</,\n\t\t\t\tlteTest : /<=/,\n\t\t\t\tnotTest : /^\\!/,\n\t\t\t\twildOrTest : /[\\?\\*\\|]/,\n\t\t\t\twildTest : /\\?\\*/,\n\t\t\t\tfuzzyTest : /^~/,\n\t\t\t\texactTest : /[=\\\"\\|!]/\n\t\t\t});\n\n\t\t\t// don't build filter row if columnFilters is false or all columns are set to 'filter-false'\n\t\t\t// see issue #156\n\t\t\tval = c.$headers.filter( '.filter-false, .parser-false' ).length;\n\t\t\tif ( wo.filter_columnFilters !== false && val !== c.$headers.length ) {\n\t\t\t\t// build filter row\n\t\t\t\ttsf.buildRow( table, c, wo );\n\t\t\t}\n\n\t\t\ttxt = 'addRows updateCell update updateRows updateComplete appendCache filterReset ' +\n\t\t\t\t'filterResetSaved filterEnd search '.split( ' ' ).join( c.namespace + 'filter ' );\n\t\t\tc.$table.bind( txt, function( event, filter ) {\n\t\t\t\tval = wo.filter_hideEmpty &&\n\t\t\t\t\t$.isEmptyObject( c.cache ) &&\n\t\t\t\t\t!( c.delayInit && event.type === 'appendCache' );\n\t\t\t\t// hide filter row using the 'filtered' class name\n\t\t\t\tc.$table.find( '.' + tscss.filterRow ).toggleClass( wo.filter_filteredRow, val ); // fixes #450\n\t\t\t\tif ( !/(search|filter)/.test( event.type ) ) {\n\t\t\t\t\tevent.stopPropagation();\n\t\t\t\t\ttsf.buildDefault( table, true );\n\t\t\t\t}\n\t\t\t\tif ( event.type === 'filterReset' ) {\n\t\t\t\t\tc.$table.find( '.' + tscss.filter ).add( wo.filter_$externalFilters ).val( '' );\n\t\t\t\t\ttsf.searching( table, [] );\n\t\t\t\t} else if ( event.type === 'filterResetSaved' ) {\n\t\t\t\t\tts.storage( table, 'tablesorter-filters', '' );\n\t\t\t\t} else if ( event.type === 'filterEnd' ) {\n\t\t\t\t\ttsf.buildDefault( table, true );\n\t\t\t\t} else {\n\t\t\t\t\t// send false argument to force a new search; otherwise if the filter hasn't changed,\n\t\t\t\t\t// it will return\n\t\t\t\t\tfilter = event.type === 'search' ? filter :\n\t\t\t\t\t\tevent.type === 'updateComplete' ? c.$table.data( 'lastSearch' ) : '';\n\t\t\t\t\tif ( /(update|add)/.test( event.type ) && event.type !== 'updateComplete' ) {\n\t\t\t\t\t\t// force a new search since content has changed\n\t\t\t\t\t\tc.lastCombinedFilter = null;\n\t\t\t\t\t\tc.lastSearch = [];\n\t\t\t\t\t}\n\t\t\t\t\t// pass true ( skipFirst ) to prevent the tablesorter.setFilters function from skipping the first\n\t\t\t\t\t// input ensures all inputs are updated when a search is triggered on the table\n\t\t\t\t\t// $( 'table' ).trigger( 'search', [...] );\n\t\t\t\t\ttsf.searching( table, filter, true );\n\t\t\t\t}\n\t\t\t\treturn false;\n\t\t\t});\n\n\t\t\t// reset button/link\n\t\t\tif ( wo.filter_reset ) {\n\t\t\t\tif ( wo.filter_reset instanceof $ ) {\n\t\t\t\t\t// reset contains a jQuery object, bind to it\n\t\t\t\t\two.filter_reset.click( function() {\n\t\t\t\t\t\tc.$table.triggerHandler( 'filterReset' );\n\t\t\t\t\t});\n\t\t\t\t} else if ( $( wo.filter_reset ).length ) {\n\t\t\t\t\t// reset is a jQuery selector, use event delegation\n\t\t\t\t\t$( document )\n\t\t\t\t\t\t.undelegate( wo.filter_reset, 'click' + c.namespace + 'filter' )\n\t\t\t\t\t\t.delegate( wo.filter_reset, 'click' + c.namespace + 'filter', function() {\n\t\t\t\t\t\t\t// trigger a reset event, so other functions ( filter_formatter ) know when to reset\n\t\t\t\t\t\t\tc.$table.triggerHandler( 'filterReset' );\n\t\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t}\n\t\t\tif ( wo.filter_functions ) {\n\t\t\t\tfor ( column = 0; column < c.columns; column++ ) {\n\t\t\t\t\tfxn = ts.getColumnData( table, wo.filter_functions, column );\n\t\t\t\t\tif ( fxn ) {\n\t\t\t\t\t\t// remove 'filter-select' from header otherwise the options added here are replaced with\n\t\t\t\t\t\t// all options\n\t\t\t\t\t\t$header = c.$headerIndexed[ column ].removeClass( 'filter-select' );\n\t\t\t\t\t\t// don't build select if 'filter-false' or 'parser-false' set\n\t\t\t\t\t\tnoSelect = !( $header.hasClass( 'filter-false' ) || $header.hasClass( 'parser-false' ) );\n\t\t\t\t\t\toptions = '';\n\t\t\t\t\t\tif ( fxn === true && noSelect ) {\n\t\t\t\t\t\t\ttsf.buildSelect( table, column );\n\t\t\t\t\t\t} else if ( typeof fxn === 'object' && noSelect ) {\n\t\t\t\t\t\t\t// add custom drop down list\n\t\t\t\t\t\t\tfor ( string in fxn ) {\n\t\t\t\t\t\t\t\tif ( typeof string === 'string' ) {\n\t\t\t\t\t\t\t\t\toptions += options === '' ?\n\t\t\t\t\t\t\t\t\t\t'<option value=\"\">' +\n\t\t\t\t\t\t\t\t\t\t\t( $header.data( 'placeholder' ) ||\n\t\t\t\t\t\t\t\t\t\t\t\t$header.attr( 'data-placeholder' ) ||\n\t\t\t\t\t\t\t\t\t\t\t\two.filter_placeholder.select ||\n\t\t\t\t\t\t\t\t\t\t\t\t''\n\t\t\t\t\t\t\t\t\t\t\t) +\n\t\t\t\t\t\t\t\t\t\t'</option>' : '';\n\t\t\t\t\t\t\t\t\tval = string;\n\t\t\t\t\t\t\t\t\ttxt = string;\n\t\t\t\t\t\t\t\t\tif ( string.indexOf( wo.filter_selectSourceSeparator ) >= 0 ) {\n\t\t\t\t\t\t\t\t\t\tval = string.split( wo.filter_selectSourceSeparator );\n\t\t\t\t\t\t\t\t\t\ttxt = val[1];\n\t\t\t\t\t\t\t\t\t\tval = val[0];\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\toptions += '<option ' +\n\t\t\t\t\t\t\t\t\t\t( txt === val ? '' : 'data-function-name=\"' + string + '\" ' ) +\n\t\t\t\t\t\t\t\t\t\t'value=\"' + val + '\">' + txt + '</option>';\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tc.$table\n\t\t\t\t\t\t\t\t.find( 'thead' )\n\t\t\t\t\t\t\t\t.find( 'select.' + tscss.filter + '[data-column=\"' + column + '\"]' )\n\t\t\t\t\t\t\t\t.append( options );\n\t\t\t\t\t\t\ttxt = wo.filter_selectSource;\n\t\t\t\t\t\t\tfxn = typeof txt === 'function' ? true : ts.getColumnData( table, txt, column );\n\t\t\t\t\t\t\tif ( fxn ) {\n\t\t\t\t\t\t\t\t// updating so the extra options are appended\n\t\t\t\t\t\t\t\ttsf.buildSelect( c.table, column, '', true, $header.hasClass( wo.filter_onlyAvail ) );\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\t// not really updating, but if the column has both the 'filter-select' class &\n\t\t\t// filter_functions set to true, it would append the same options twice.\n\t\t\ttsf.buildDefault( table, true );\n\n\t\t\ttsf.bindSearch( table, c.$table.find( '.' + tscss.filter ), true );\n\t\t\tif ( wo.filter_external ) {\n\t\t\t\ttsf.bindSearch( table, wo.filter_external );\n\t\t\t}\n\n\t\t\tif ( wo.filter_hideFilters ) {\n\t\t\t\ttsf.hideFilters( c );\n\t\t\t}\n\n\t\t\t// show processing icon\n\t\t\tif ( c.showProcessing ) {\n\t\t\t\ttxt = 'filterStart filterEnd '.split( ' ' ).join( c.namespace + 'filter ' );\n\t\t\t\tc.$table\n\t\t\t\t\t.unbind( txt.replace( ts.regex.spaces, ' ' ) )\n\t\t\t\t\t.bind( txt, function( event, columns ) {\n\t\t\t\t\t// only add processing to certain columns to all columns\n\t\t\t\t\t$header = ( columns ) ?\n\t\t\t\t\t\tc.$table\n\t\t\t\t\t\t\t.find( '.' + tscss.header )\n\t\t\t\t\t\t\t.filter( '[data-column]' )\n\t\t\t\t\t\t\t.filter( function() {\n\t\t\t\t\t\t\t\treturn columns[ $( this ).data( 'column' ) ] !== '';\n\t\t\t\t\t\t\t}) : '';\n\t\t\t\t\tts.isProcessing( table, event.type === 'filterStart', columns ? $header : '' );\n\t\t\t\t});\n\t\t\t}\n\n\t\t\t// set filtered rows count ( intially unfiltered )\n\t\t\tc.filteredRows = c.totalRows;\n\n\t\t\t// add default values\n\t\t\ttxt = 'tablesorter-initialized pagerBeforeInitialized '.split( ' ' ).join( c.namespace + 'filter ' );\n\t\t\tc.$table\n\t\t\t.unbind( txt.replace( ts.regex.spaces, ' ' ) )\n\t\t\t.bind( txt, function() {\n\t\t\t\ttsf.completeInit( this );\n\t\t\t});\n\t\t\t// if filter widget is added after pager has initialized; then set filter init flag\n\t\t\tif ( c.pager && c.pager.initialized && !wo.filter_initialized ) {\n\t\t\t\tc.$table.triggerHandler( 'filterFomatterUpdate' );\n\t\t\t\tsetTimeout( function() {\n\t\t\t\t\ttsf.filterInitComplete( c );\n\t\t\t\t}, 100 );\n\t\t\t} else if ( !wo.filter_initialized ) {\n\t\t\t\ttsf.completeInit( table );\n\t\t\t}\n\t\t},\n\t\tcompleteInit: function( table ) {\n\t\t\t// redefine 'c' & 'wo' so they update properly inside this callback\n\t\t\tvar c = table.config,\n\t\t\t\two = c.widgetOptions,\n\t\t\t\tfilters = tsf.setDefaults( table, c, wo ) || [];\n\t\t\tif ( filters.length ) {\n\t\t\t\t// prevent delayInit from triggering a cache build if filters are empty\n\t\t\t\tif ( !( c.delayInit && filters.join( '' ) === '' ) ) {\n\t\t\t\t\tts.setFilters( table, filters, true );\n\t\t\t\t}\n\t\t\t}\n\t\t\tc.$table.triggerHandler( 'filterFomatterUpdate' );\n\t\t\t// trigger init after setTimeout to prevent multiple filterStart/End/Init triggers\n\t\t\tsetTimeout( function() {\n\t\t\t\tif ( !wo.filter_initialized ) {\n\t\t\t\t\ttsf.filterInitComplete( c );\n\t\t\t\t}\n\t\t\t}, 100 );\n\t\t},\n\n\t\t// $cell parameter, but not the config, is passed to the filter_formatters,\n\t\t// so we have to work with it instead\n\t\tformatterUpdated: function( $cell, column ) {\n\t\t\t// prevent error if $cell is undefined - see #1056\n\t\t\tvar wo = $cell && $cell.closest( 'table' )[0].config.widgetOptions;\n\t\t\tif ( wo && !wo.filter_initialized ) {\n\t\t\t\t// add updates by column since this function\n\t\t\t\t// may be called numerous times before initialization\n\t\t\t\two.filter_formatterInit[ column ] = 1;\n\t\t\t}\n\t\t},\n\t\tfilterInitComplete: function( c ) {\n\t\t\tvar indx, len,\n\t\t\t\two = c.widgetOptions,\n\t\t\t\tcount = 0,\n\t\t\t\tcompleted = function() {\n\t\t\t\t\two.filter_initialized = true;\n\t\t\t\t\tc.$table.triggerHandler( 'filterInit', c );\n\t\t\t\t\ttsf.findRows( c.table, c.$table.data( 'lastSearch' ) || [] );\n\t\t\t\t};\n\t\t\tif ( $.isEmptyObject( wo.filter_formatter ) ) {\n\t\t\t\tcompleted();\n\t\t\t} else {\n\t\t\t\tlen = wo.filter_formatterInit.length;\n\t\t\t\tfor ( indx = 0; indx < len; indx++ ) {\n\t\t\t\t\tif ( wo.filter_formatterInit[ indx ] === 1 ) {\n\t\t\t\t\t\tcount++;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tclearTimeout( wo.filter_initTimer );\n\t\t\t\tif ( !wo.filter_initialized && count === wo.filter_formatterCount ) {\n\t\t\t\t\t// filter widget initialized\n\t\t\t\t\tcompleted();\n\t\t\t\t} else if ( !wo.filter_initialized ) {\n\t\t\t\t\t// fall back in case a filter_formatter doesn't call\n\t\t\t\t\t// $.tablesorter.filter.formatterUpdated( $cell, column ), and the count is off\n\t\t\t\t\two.filter_initTimer = setTimeout( function() {\n\t\t\t\t\t\tcompleted();\n\t\t\t\t\t}, 500 );\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\t\t// encode or decode filters for storage; see #1026\n\t\tprocessFilters: function( filters, encode ) {\n\t\t\tvar indx,\n\t\t\t\t// fixes #1237; previously returning an encoded \"filters\" value\n\t\t\t\tresult = [],\n\t\t\t\tmode = encode ? encodeURIComponent : decodeURIComponent,\n\t\t\t\tlen = filters.length;\n\t\t\tfor ( indx = 0; indx < len; indx++ ) {\n\t\t\t\tif ( filters[ indx ] ) {\n\t\t\t\t\tresult[ indx ] = mode( filters[ indx ] );\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn result;\n\t\t},\n\t\tsetDefaults: function( table, c, wo ) {\n\t\t\tvar isArray, saved, indx, col, $filters,\n\t\t\t\t// get current ( default ) filters\n\t\t\t\tfilters = ts.getFilters( table ) || [];\n\t\t\tif ( wo.filter_saveFilters && ts.storage ) {\n\t\t\t\tsaved = ts.storage( table, 'tablesorter-filters' ) || [];\n\t\t\t\tisArray = $.isArray( saved );\n\t\t\t\t// make sure we're not just getting an empty array\n\t\t\t\tif ( !( isArray && saved.join( '' ) === '' || !isArray ) ) {\n\t\t\t\t\tfilters = tsf.processFilters( saved );\n\t\t\t\t}\n\t\t\t}\n\t\t\t// if no filters saved, then check default settings\n\t\t\tif ( filters.join( '' ) === '' ) {\n\t\t\t\t// allow adding default setting to external filters\n\t\t\t\t$filters = c.$headers.add( wo.filter_$externalFilters )\n\t\t\t\t\t.filter( '[' + wo.filter_defaultAttrib + ']' );\n\t\t\t\tfor ( indx = 0; indx <= c.columns; indx++ ) {\n\t\t\t\t\t// include data-column='all' external filters\n\t\t\t\t\tcol = indx === c.columns ? 'all' : indx;\n\t\t\t\t\tfilters[ indx ] = $filters\n\t\t\t\t\t\t.filter( '[data-column=\"' + col + '\"]' )\n\t\t\t\t\t\t.attr( wo.filter_defaultAttrib ) || filters[indx] || '';\n\t\t\t\t}\n\t\t\t}\n\t\t\tc.$table.data( 'lastSearch', filters );\n\t\t\treturn filters;\n\t\t},\n\t\tparseFilter: function( c, filter, data, parsed ) {\n\t\t\treturn parsed || data.parsed[ data.index ] ?\n\t\t\t\tc.parsers[ data.index ].format( filter, c.table, [], data.index ) :\n\t\t\t\tfilter;\n\t\t},\n\t\tbuildRow: function( table, c, wo ) {\n\t\t\tvar $filter, col, column, $header, makeSelect, disabled, name, ffxn, tmp,\n\t\t\t\t// c.columns defined in computeThIndexes()\n\t\t\t\tcellFilter = wo.filter_cellFilter,\n\t\t\t\tcolumns = c.columns,\n\t\t\t\tarry = $.isArray( cellFilter ),\n\t\t\t\tbuildFilter = '<tr role=\"row\" class=\"' + tscss.filterRow + ' ' + c.cssIgnoreRow + '\">';\n\t\t\tfor ( column = 0; column < columns; column++ ) {\n\t\t\t\tif ( c.$headerIndexed[ column ].length ) {\n\t\t\t\t\t// account for entire column set with colspan. See #1047\n\t\t\t\t\ttmp = c.$headerIndexed[ column ] && c.$headerIndexed[ column ][0].colSpan || 0;\n\t\t\t\t\tif ( tmp > 1 ) {\n\t\t\t\t\t\tbuildFilter += '<td data-column=\"' + column + '-' + ( column + tmp - 1 ) + '\" colspan=\"' + tmp + '\"';\n\t\t\t\t\t} else {\n\t\t\t\t\t\tbuildFilter += '<td data-column=\"' + column + '\"';\n\t\t\t\t\t}\n\t\t\t\t\tif ( arry ) {\n\t\t\t\t\t\tbuildFilter += ( cellFilter[ column ] ? ' class=\"' + cellFilter[ column ] + '\"' : '' );\n\t\t\t\t\t} else {\n\t\t\t\t\t\tbuildFilter += ( cellFilter !== '' ? ' class=\"' + cellFilter + '\"' : '' );\n\t\t\t\t\t}\n\t\t\t\t\tbuildFilter += '></td>';\n\t\t\t\t}\n\t\t\t}\n\t\t\tc.$filters = $( buildFilter += '</tr>' )\n\t\t\t\t.appendTo( c.$table.children( 'thead' ).eq( 0 ) )\n\t\t\t\t.children( 'td' );\n\t\t\t// build each filter input\n\t\t\tfor ( column = 0; column < columns; column++ ) {\n\t\t\t\tdisabled = false;\n\t\t\t\t// assuming last cell of a column is the main column\n\t\t\t\t$header = c.$headerIndexed[ column ];\n\t\t\t\tif ( $header && $header.length ) {\n\t\t\t\t\t// $filter = c.$filters.filter( '[data-column=\"' + column + '\"]' );\n\t\t\t\t\t$filter = tsf.getColumnElm( c, c.$filters, column );\n\t\t\t\t\tffxn = ts.getColumnData( table, wo.filter_functions, column );\n\t\t\t\t\tmakeSelect = ( wo.filter_functions && ffxn && typeof ffxn !== 'function' ) ||\n\t\t\t\t\t\t$header.hasClass( 'filter-select' );\n\t\t\t\t\t// get data from jQuery data, metadata, headers option or header class name\n\t\t\t\t\tcol = ts.getColumnData( table, c.headers, column );\n\t\t\t\t\tdisabled = ts.getData( $header[0], col, 'filter' ) === 'false' ||\n\t\t\t\t\t\tts.getData( $header[0], col, 'parser' ) === 'false';\n\n\t\t\t\t\tif ( makeSelect ) {\n\t\t\t\t\t\tbuildFilter = $( '<select>' ).appendTo( $filter );\n\t\t\t\t\t} else {\n\t\t\t\t\t\tffxn = ts.getColumnData( table, wo.filter_formatter, column );\n\t\t\t\t\t\tif ( ffxn ) {\n\t\t\t\t\t\t\two.filter_formatterCount++;\n\t\t\t\t\t\t\tbuildFilter = ffxn( $filter, column );\n\t\t\t\t\t\t\t// no element returned, so lets go find it\n\t\t\t\t\t\t\tif ( buildFilter && buildFilter.length === 0 ) {\n\t\t\t\t\t\t\t\tbuildFilter = $filter.children( 'input' );\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t// element not in DOM, so lets attach it\n\t\t\t\t\t\t\tif ( buildFilter && ( buildFilter.parent().length === 0 ||\n\t\t\t\t\t\t\t\t( buildFilter.parent().length && buildFilter.parent()[0] !== $filter[0] ) ) ) {\n\t\t\t\t\t\t\t\t$filter.append( buildFilter );\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tbuildFilter = $( '<input type=\"search\">' ).appendTo( $filter );\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif ( buildFilter ) {\n\t\t\t\t\t\t\ttmp = $header.data( 'placeholder' ) ||\n\t\t\t\t\t\t\t\t$header.attr( 'data-placeholder' ) ||\n\t\t\t\t\t\t\t\two.filter_placeholder.search || '';\n\t\t\t\t\t\t\tbuildFilter.attr( 'placeholder', tmp );\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tif ( buildFilter ) {\n\t\t\t\t\t\t// add filter class name\n\t\t\t\t\t\tname = ( $.isArray( wo.filter_cssFilter ) ?\n\t\t\t\t\t\t\t( typeof wo.filter_cssFilter[column] !== 'undefined' ? wo.filter_cssFilter[column] || '' : '' ) :\n\t\t\t\t\t\t\two.filter_cssFilter ) || '';\n\t\t\t\t\t\t// copy data-column from table cell (it will include colspan)\n\t\t\t\t\t\tbuildFilter.addClass( tscss.filter + ' ' + name ).attr( 'data-column', $filter.attr( 'data-column' ) );\n\t\t\t\t\t\tif ( disabled ) {\n\t\t\t\t\t\t\tbuildFilter.attr( 'placeholder', '' ).addClass( tscss.filterDisabled )[0].disabled = true;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\t\tbindSearch: function( table, $el, internal ) {\n\t\t\ttable = $( table )[0];\n\t\t\t$el = $( $el ); // allow passing a selector string\n\t\t\tif ( !$el.length ) { return; }\n\t\t\tvar tmp,\n\t\t\t\tc = table.config,\n\t\t\t\two = c.widgetOptions,\n\t\t\t\tnamespace = c.namespace + 'filter',\n\t\t\t\t$ext = wo.filter_$externalFilters;\n\t\t\tif ( internal !== true ) {\n\t\t\t\t// save anyMatch element\n\t\t\t\ttmp = wo.filter_anyColumnSelector + ',' + wo.filter_multipleColumnSelector;\n\t\t\t\two.filter_$anyMatch = $el.filter( tmp );\n\t\t\t\tif ( $ext && $ext.length ) {\n\t\t\t\t\two.filter_$externalFilters = wo.filter_$externalFilters.add( $el );\n\t\t\t\t} else {\n\t\t\t\t\two.filter_$externalFilters = $el;\n\t\t\t\t}\n\t\t\t\t// update values ( external filters added after table initialization )\n\t\t\t\tts.setFilters( table, c.$table.data( 'lastSearch' ) || [], internal === false );\n\t\t\t}\n\t\t\t// unbind events\n\t\t\ttmp = ( 'keypress keyup keydown search change input '.split( ' ' ).join( namespace + ' ' ) );\n\t\t\t$el\n\t\t\t// use data attribute instead of jQuery data since the head is cloned without including\n\t\t\t// the data/binding\n\t\t\t.attr( 'data-lastSearchTime', new Date().getTime() )\n\t\t\t.unbind( tmp.replace( ts.regex.spaces, ' ' ) )\n\t\t\t.bind( 'keydown' + namespace, function( event ) {\n\t\t\t\tif ( event.which === tskeyCodes.escape && !table.config.widgetOptions.filter_resetOnEsc ) {\n\t\t\t\t\t// prevent keypress event\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t})\n\t\t\t.bind( 'keyup' + namespace, function( event ) {\n\t\t\t\two = table.config.widgetOptions; // make sure \"wo\" isn't cached\n\t\t\t\tvar column = parseInt( $( this ).attr( 'data-column' ), 10 );\n\t\t\t\t$( this ).attr( 'data-lastSearchTime', new Date().getTime() );\n\t\t\t\t// emulate what webkit does.... escape clears the filter\n\t\t\t\tif ( event.which === tskeyCodes.escape ) {\n\t\t\t\t\t// make sure to restore the last value on escape\n\t\t\t\t\tthis.value = wo.filter_resetOnEsc ? '' : c.lastSearch[column];\n\t\t\t\t// live search\n\t\t\t\t} else if ( wo.filter_liveSearch === false ) {\n\t\t\t\t\treturn;\n\t\t\t\t\t// don't return if the search value is empty ( all rows need to be revealed )\n\t\t\t\t} else if ( this.value !== '' && (\n\t\t\t\t\t// liveSearch can contain a min value length; ignore arrow and meta keys, but allow backspace\n\t\t\t\t\t( typeof wo.filter_liveSearch === 'number' && this.value.length < wo.filter_liveSearch ) ||\n\t\t\t\t\t// let return & backspace continue on, but ignore arrows & non-valid characters\n\t\t\t\t\t( event.which !== tskeyCodes.enter && event.which !== tskeyCodes.backSpace &&\n\t\t\t\t\t\t( event.which < tskeyCodes.space || ( event.which >= tskeyCodes.left && event.which <= tskeyCodes.down ) ) ) ) ) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\t// change event = no delay; last true flag tells getFilters to skip newest timed input\n\t\t\t\ttsf.searching( table, true, true );\n\t\t\t})\n\t\t\t// include change for select - fixes #473\n\t\t\t.bind( 'search change keypress input '.split( ' ' ).join( namespace + ' ' ), function( event ) {\n\t\t\t\t// don't get cached data, in case data-column changes dynamically\n\t\t\t\tvar column = parseInt( $( this ).attr( 'data-column' ), 10 );\n\t\t\t\t// don't allow 'change' event to process if the input value is the same - fixes #685\n\t\t\t\tif ( table.config.widgetOptions.filter_initialized &&\n\t\t\t\t\t( event.which === tskeyCodes.enter || event.type === 'search' ||\n\t\t\t\t\t( event.type === 'change' ) && this.value !== c.lastSearch[column] ) ||\n\t\t\t\t\t// only \"input\" event fires in MS Edge when clicking the \"x\" to clear the search\n\t\t\t\t\t( event.type === 'input' && this.value === '' ) ) {\n\t\t\t\t\tevent.preventDefault();\n\t\t\t\t\t// init search with no delay\n\t\t\t\t\t$( this ).attr( 'data-lastSearchTime', new Date().getTime() );\n\t\t\t\t\ttsf.searching( table, event.type !== 'keypress', true );\n\t\t\t\t}\n\t\t\t});\n\t\t},\n\t\tsearching: function( table, filter, skipFirst ) {\n\t\t\tvar wo = table.config.widgetOptions;\n\t\t\tclearTimeout( wo.filter_searchTimer );\n\t\t\tif ( typeof filter === 'undefined' || filter === true ) {\n\t\t\t\t// delay filtering\n\t\t\t\two.filter_searchTimer = setTimeout( function() {\n\t\t\t\t\ttsf.checkFilters( table, filter, skipFirst );\n\t\t\t\t}, wo.filter_liveSearch ? wo.filter_searchDelay : 10 );\n\t\t\t} else {\n\t\t\t\t// skip delay\n\t\t\t\ttsf.checkFilters( table, filter, skipFirst );\n\t\t\t}\n\t\t},\n\t\tcheckFilters: function( table, filter, skipFirst ) {\n\t\t\tvar c = table.config,\n\t\t\t\two = c.widgetOptions,\n\t\t\t\tfilterArray = $.isArray( filter ),\n\t\t\t\tfilters = ( filterArray ) ? filter : ts.getFilters( table, true ),\n\t\t\t\tcombinedFilters = ( filters || [] ).join( '' ); // combined filter values\n\t\t\t// prevent errors if delay init is set\n\t\t\tif ( $.isEmptyObject( c.cache ) ) {\n\t\t\t\t// update cache if delayInit set & pager has initialized ( after user initiates a search )\n\t\t\t\tif ( c.delayInit && ( !c.pager || c.pager && c.pager.initialized ) ) {\n\t\t\t\t\tts.updateCache( c, function() {\n\t\t\t\t\t\ttsf.checkFilters( table, false, skipFirst );\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t\treturn;\n\t\t\t}\n\t\t\t// add filter array back into inputs\n\t\t\tif ( filterArray ) {\n\t\t\t\tts.setFilters( table, filters, false, skipFirst !== true );\n\t\t\t\tif ( !wo.filter_initialized ) { c.lastCombinedFilter = ''; }\n\t\t\t}\n\t\t\tif ( wo.filter_hideFilters ) {\n\t\t\t\t// show/hide filter row as needed\n\t\t\t\tc.$table\n\t\t\t\t\t.find( '.' + tscss.filterRow )\n\t\t\t\t\t.triggerHandler( tsf.hideFiltersCheck( c ) ? 'mouseleave' : 'mouseenter' );\n\t\t\t}\n\t\t\t// return if the last search is the same; but filter === false when updating the search\n\t\t\t// see example-widget-filter.html filter toggle buttons\n\t\t\tif ( c.lastCombinedFilter === combinedFilters && filter !== false ) {\n\t\t\t\treturn;\n\t\t\t} else if ( filter === false ) {\n\t\t\t\t// force filter refresh\n\t\t\t\tc.lastCombinedFilter = null;\n\t\t\t\tc.lastSearch = [];\n\t\t\t}\n\t\t\t// define filter inside it is false\n\t\t\tfilters = filters || [];\n\t\t\t// convert filters to strings - see #1070\n\t\t\tfilters = Array.prototype.map ?\n\t\t\t\tfilters.map( String ) :\n\t\t\t\t// for IE8 & older browsers - maybe not the best method\n\t\t\t\tfilters.join( '\\ufffd' ).split( '\\ufffd' );\n\n\t\t\tif ( wo.filter_initialized ) {\n\t\t\t\tc.$table.triggerHandler( 'filterStart', [ filters ] );\n\t\t\t}\n\t\t\tif ( c.showProcessing ) {\n\t\t\t\t// give it time for the processing icon to kick in\n\t\t\t\tsetTimeout( function() {\n\t\t\t\t\ttsf.findRows( table, filters, combinedFilters );\n\t\t\t\t\treturn false;\n\t\t\t\t}, 30 );\n\t\t\t} else {\n\t\t\t\ttsf.findRows( table, filters, combinedFilters );\n\t\t\t\treturn false;\n\t\t\t}\n\t\t},\n\t\thideFiltersCheck: function( c ) {\n\t\t\tif (typeof c.widgetOptions.filter_hideFilters === 'function') {\n\t\t\t\tvar val = c.widgetOptions.filter_hideFilters( c );\n\t\t\t\tif (typeof val === 'boolean') {\n\t\t\t\t\treturn val;\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn ts.getFilters( c.$table ).join( '' ) === '';\n\t\t},\n\t\thideFilters: function( c, $table ) {\n\t\t\tvar timer;\n\t\t\t( $table || c.$table )\n\t\t\t\t.find( '.' + tscss.filterRow )\n\t\t\t\t.addClass( tscss.filterRowHide )\n\t\t\t\t.bind( 'mouseenter mouseleave', function( e ) {\n\t\t\t\t\t// save event object - http://bugs.jquery.com/ticket/12140\n\t\t\t\t\tvar event = e,\n\t\t\t\t\t\t$row = $( this );\n\t\t\t\t\tclearTimeout( timer );\n\t\t\t\t\ttimer = setTimeout( function() {\n\t\t\t\t\t\tif ( /enter|over/.test( event.type ) ) {\n\t\t\t\t\t\t\t$row.removeClass( tscss.filterRowHide );\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t// don't hide if input has focus\n\t\t\t\t\t\t\t// $( ':focus' ) needs jQuery 1.6+\n\t\t\t\t\t\t\tif ( $( document.activeElement ).closest( 'tr' )[0] !== $row[0] ) {\n\t\t\t\t\t\t\t\t// don't hide row if any filter has a value\n\t\t\t\t\t\t\t\t$row.toggleClass( tscss.filterRowHide, tsf.hideFiltersCheck( c ) );\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}, 200 );\n\t\t\t\t})\n\t\t\t\t.find( 'input, select' ).bind( 'focus blur', function( e ) {\n\t\t\t\t\tvar event = e,\n\t\t\t\t\t\t$row = $( this ).closest( 'tr' );\n\t\t\t\t\tclearTimeout( timer );\n\t\t\t\t\ttimer = setTimeout( function() {\n\t\t\t\t\t\tclearTimeout( timer );\n\t\t\t\t\t\t// don't hide row if any filter has a value\n\t\t\t\t\t\t$row.toggleClass( tscss.filterRowHide, tsf.hideFiltersCheck( c ) && event.type !== 'focus' );\n\t\t\t\t\t}, 200 );\n\t\t\t\t});\n\t\t},\n\t\tdefaultFilter: function( filter, mask ) {\n\t\t\tif ( filter === '' ) { return filter; }\n\t\t\tvar regex = tsfRegex.iQuery,\n\t\t\t\tmaskLen = mask.match( tsfRegex.igQuery ).length,\n\t\t\t\tquery = maskLen > 1 ? $.trim( filter ).split( /\\s/ ) : [ $.trim( filter ) ],\n\t\t\t\tlen = query.length - 1,\n\t\t\t\tindx = 0,\n\t\t\t\tval = mask;\n\t\t\tif ( len < 1 && maskLen > 1 ) {\n\t\t\t\t// only one 'word' in query but mask has >1 slots\n\t\t\t\tquery[1] = query[0];\n\t\t\t}\n\t\t\t// replace all {query} with query words...\n\t\t\t// if query = 'Bob', then convert mask from '!{query}' to '!Bob'\n\t\t\t// if query = 'Bob Joe Frank', then convert mask '{q} OR {q}' to 'Bob OR Joe OR Frank'\n\t\t\twhile ( regex.test( val ) ) {\n\t\t\t\tval = val.replace( regex, query[indx++] || '' );\n\t\t\t\tif ( regex.test( val ) && indx < len && ( query[indx] || '' ) !== '' ) {\n\t\t\t\t\tval = mask.replace( regex, val );\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn val;\n\t\t},\n\t\tgetLatestSearch: function( $input ) {\n\t\t\tif ( $input ) {\n\t\t\t\treturn $input.sort( function( a, b ) {\n\t\t\t\t\treturn $( b ).attr( 'data-lastSearchTime' ) - $( a ).attr( 'data-lastSearchTime' );\n\t\t\t\t});\n\t\t\t}\n\t\t\treturn $input || $();\n\t\t},\n\t\tfindRange: function( c, val, ignoreRanges ) {\n\t\t\t// look for multiple columns '1-3,4-6,8' in data-column\n\t\t\tvar temp, ranges, range, start, end, singles, i, indx, len,\n\t\t\t\tcolumns = [];\n\t\t\tif ( /^[0-9]+$/.test( val ) ) {\n\t\t\t\t// always return an array\n\t\t\t\treturn [ parseInt( val, 10 ) ];\n\t\t\t}\n\t\t\t// process column range\n\t\t\tif ( !ignoreRanges && /-/.test( val ) ) {\n\t\t\t\tranges = val.match( /(\\d+)\\s*-\\s*(\\d+)/g );\n\t\t\t\tlen = ranges ? ranges.length : 0;\n\t\t\t\tfor ( indx = 0; indx < len; indx++ ) {\n\t\t\t\t\trange = ranges[indx].split( /\\s*-\\s*/ );\n\t\t\t\t\tstart = parseInt( range[0], 10 ) || 0;\n\t\t\t\t\tend = parseInt( range[1], 10 ) || ( c.columns - 1 );\n\t\t\t\t\tif ( start > end ) {\n\t\t\t\t\t\ttemp = start; start = end; end = temp; // swap\n\t\t\t\t\t}\n\t\t\t\t\tif ( end >= c.columns ) {\n\t\t\t\t\t\tend = c.columns - 1;\n\t\t\t\t\t}\n\t\t\t\t\tfor ( ; start <= end; start++ ) {\n\t\t\t\t\t\tcolumns[ columns.length ] = start;\n\t\t\t\t\t}\n\t\t\t\t\t// remove processed range from val\n\t\t\t\t\tval = val.replace( ranges[ indx ], '' );\n\t\t\t\t}\n\t\t\t}\n\t\t\t// process single columns\n\t\t\tif ( !ignoreRanges && /,/.test( val ) ) {\n\t\t\t\tsingles = val.split( /\\s*,\\s*/ );\n\t\t\t\tlen = singles.length;\n\t\t\t\tfor ( i = 0; i < len; i++ ) {\n\t\t\t\t\tif ( singles[ i ] !== '' ) {\n\t\t\t\t\t\tindx = parseInt( singles[ i ], 10 );\n\t\t\t\t\t\tif ( indx < c.columns ) {\n\t\t\t\t\t\t\tcolumns[ columns.length ] = indx;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\t// return all columns\n\t\t\tif ( !columns.length ) {\n\t\t\t\tfor ( indx = 0; indx < c.columns; indx++ ) {\n\t\t\t\t\tcolumns[ columns.length ] = indx;\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn columns;\n\t\t},\n\t\tgetColumnElm: function( c, $elements, column ) {\n\t\t\t// data-column may contain multiple columns '1-3,5-6,8'\n\t\t\t// replaces: c.$filters.filter( '[data-column=\"' + column + '\"]' );\n\t\t\treturn $elements.filter( function() {\n\t\t\t\tvar cols = tsf.findRange( c, $( this ).attr( 'data-column' ) );\n\t\t\t\treturn $.inArray( column, cols ) > -1;\n\t\t\t});\n\t\t},\n\t\tmultipleColumns: function( c, $input ) {\n\t\t\t// look for multiple columns '1-3,4-6,8' in data-column\n\t\t\tvar wo = c.widgetOptions,\n\t\t\t\t// only target 'all' column inputs on initialization\n\t\t\t\t// & don't target 'all' column inputs if they don't exist\n\t\t\t\ttargets = wo.filter_initialized || !$input.filter( wo.filter_anyColumnSelector ).length,\n\t\t\t\tval = $.trim( tsf.getLatestSearch( $input ).attr( 'data-column' ) || '' );\n\t\t\treturn tsf.findRange( c, val, !targets );\n\t\t},\n\t\tprocessTypes: function( c, data, vars ) {\n\t\t\tvar ffxn,\n\t\t\t\tfilterMatched = null,\n\t\t\t\tmatches = null;\n\t\t\tfor ( ffxn in tsf.types ) {\n\t\t\t\tif ( $.inArray( ffxn, vars.excludeMatch ) < 0 && matches === null ) {\n\t\t\t\t\tmatches = tsf.types[ffxn]( c, data, vars );\n\t\t\t\t\tif ( matches !== null ) {\n\t\t\t\t\t\tfilterMatched = matches;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn filterMatched;\n\t\t},\n\t\tmatchType: function( c, columnIndex ) {\n\t\t\tvar isMatch,\n\t\t\t\two = c.widgetOptions,\n\t\t\t\t$el = c.$headerIndexed[ columnIndex ];\n\t\t\t// filter-exact > filter-match > filter_matchType for type\n\t\t\tif ( $el.hasClass( 'filter-exact' ) ) {\n\t\t\t\tisMatch = false;\n\t\t\t} else if ( $el.hasClass( 'filter-match' ) ) {\n\t\t\t\tisMatch = true;\n\t\t\t} else {\n\t\t\t\t// filter-select is not applied when filter_functions are used, so look for a select\n\t\t\t\tif ( wo.filter_columnFilters ) {\n\t\t\t\t\t$el = c.$filters\n\t\t\t\t\t\t.find( '.' + tscss.filter )\n\t\t\t\t\t\t.add( wo.filter_$externalFilters )\n\t\t\t\t\t\t.filter( '[data-column=\"' + columnIndex + '\"]' );\n\t\t\t\t} else if ( wo.filter_$externalFilters ) {\n\t\t\t\t\t$el = wo.filter_$externalFilters.filter( '[data-column=\"' + columnIndex + '\"]' );\n\t\t\t\t}\n\t\t\t\tisMatch = $el.length ?\n\t\t\t\t\tc.widgetOptions.filter_matchType[ ( $el[ 0 ].nodeName || '' ).toLowerCase() ] === 'match' :\n\t\t\t\t\t// default to exact, if no inputs found\n\t\t\t\t\tfalse;\n\t\t\t}\n\t\t\treturn isMatch;\n\t\t},\n\t\tprocessRow: function( c, data, vars ) {\n\t\t\tvar result, filterMatched,\n\t\t\t\tfxn, ffxn, txt,\n\t\t\t\two = c.widgetOptions,\n\t\t\t\tshowRow = true,\n\n\t\t\t\t// if wo.filter_$anyMatch data-column attribute is changed dynamically\n\t\t\t\t// we don't want to do an \"anyMatch\" search on one column using data\n\t\t\t\t// for the entire row - see #998\n\t\t\t\tcolumnIndex = wo.filter_$anyMatch && wo.filter_$anyMatch.length ?\n\t\t\t\t\t// look for multiple columns '1-3,4-6,8'\n\t\t\t\t\ttsf.multipleColumns( c, wo.filter_$anyMatch ) :\n\t\t\t\t\t[];\n\t\t\tdata.$cells = data.$row.children();\n\t\t\tif ( data.anyMatchFlag && columnIndex.length > 1 || data.anyMatchFilter ) {\n\t\t\t\tdata.anyMatch = true;\n\t\t\t\tdata.isMatch = true;\n\t\t\t\tdata.rowArray = data.$cells.map( function( i ) {\n\t\t\t\t\tif ( $.inArray( i, columnIndex ) > -1 || data.anyMatchFilter ) {\n\t\t\t\t\t\tif ( data.parsed[ i ] ) {\n\t\t\t\t\t\t\ttxt = data.cacheArray[ i ];\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\ttxt = data.rawArray[ i ];\n\t\t\t\t\t\t\ttxt = $.trim( wo.filter_ignoreCase ? txt.toLowerCase() : txt );\n\t\t\t\t\t\t\tif ( c.sortLocaleCompare ) {\n\t\t\t\t\t\t\t\ttxt = ts.replaceAccents( txt );\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t\treturn txt;\n\t\t\t\t\t}\n\t\t\t\t}).get();\n\t\t\t\tdata.filter = data.anyMatchFilter;\n\t\t\t\tdata.iFilter = data.iAnyMatchFilter;\n\t\t\t\tdata.exact = data.rowArray.join( ' ' );\n\t\t\t\tdata.iExact = wo.filter_ignoreCase ? data.exact.toLowerCase() : data.exact;\n\t\t\t\tdata.cache = data.cacheArray.slice( 0, -1 ).join( ' ' );\n\t\t\t\tvars.excludeMatch = vars.noAnyMatch;\n\t\t\t\tfilterMatched = tsf.processTypes( c, data, vars );\n\t\t\t\tif ( filterMatched !== null ) {\n\t\t\t\t\tshowRow = filterMatched;\n\t\t\t\t} else {\n\t\t\t\t\tif ( wo.filter_startsWith ) {\n\t\t\t\t\t\tshowRow = false;\n\t\t\t\t\t\t// data.rowArray may not contain all columns\n\t\t\t\t\t\tcolumnIndex = Math.min( c.columns, data.rowArray.length );\n\t\t\t\t\t\twhile ( !showRow && columnIndex > 0 ) {\n\t\t\t\t\t\t\tcolumnIndex--;\n\t\t\t\t\t\t\tshowRow = showRow || data.rowArray[ columnIndex ].indexOf( data.iFilter ) === 0;\n\t\t\t\t\t\t}\n\t\t\t\t\t} else {\n\t\t\t\t\t\tshowRow = ( data.iExact + data.childRowText ).indexOf( data.iFilter ) >= 0;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tdata.anyMatch = false;\n\t\t\t\t// no other filters to process\n\t\t\t\tif ( data.filters.join( '' ) === data.filter ) {\n\t\t\t\t\treturn showRow;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tfor ( columnIndex = 0; columnIndex < c.columns; columnIndex++ ) {\n\t\t\t\tdata.filter = data.filters[ columnIndex ];\n\t\t\t\tdata.index = columnIndex;\n\n\t\t\t\t// filter types to exclude, per column\n\t\t\t\tvars.excludeMatch = vars.excludeFilter[ columnIndex ];\n\n\t\t\t\t// ignore if filter is empty or disabled\n\t\t\t\tif ( data.filter ) {\n\t\t\t\t\tdata.cache = data.cacheArray[ columnIndex ];\n\t\t\t\t\tresult = data.parsed[ columnIndex ] ? data.cache : data.rawArray[ columnIndex ] || '';\n\t\t\t\t\tdata.exact = c.sortLocaleCompare ? ts.replaceAccents( result ) : result; // issue #405\n\t\t\t\t\tdata.iExact = !tsfRegex.type.test( typeof data.exact ) && wo.filter_ignoreCase ?\n\t\t\t\t\t\tdata.exact.toLowerCase() : data.exact;\n\t\t\t\t\tdata.isMatch = tsf.matchType( c, columnIndex );\n\n\t\t\t\t\tresult = showRow; // if showRow is true, show that row\n\n\t\t\t\t\t// in case select filter option has a different value vs text 'a - z|A through Z'\n\t\t\t\t\tffxn = wo.filter_columnFilters ?\n\t\t\t\t\t\tc.$filters.add( wo.filter_$externalFilters )\n\t\t\t\t\t\t\t.filter( '[data-column=\"' + columnIndex + '\"]' )\n\t\t\t\t\t\t\t.find( 'select option:selected' )\n\t\t\t\t\t\t\t.attr( 'data-function-name' ) || '' : '';\n\t\t\t\t\t// replace accents - see #357\n\t\t\t\t\tif ( c.sortLocaleCompare ) {\n\t\t\t\t\t\tdata.filter = ts.replaceAccents( data.filter );\n\t\t\t\t\t}\n\n\t\t\t\t\t// replace column specific default filters - see #1088\n\t\t\t\t\tif ( wo.filter_defaultFilter && tsfRegex.iQuery.test( vars.defaultColFilter[ columnIndex ] ) ) {\n\t\t\t\t\t\tdata.filter = tsf.defaultFilter( data.filter, vars.defaultColFilter[ columnIndex ] );\n\t\t\t\t\t}\n\n\t\t\t\t\t// data.iFilter = case insensitive ( if wo.filter_ignoreCase is true ),\n\t\t\t\t\t// data.filter = case sensitive\n\t\t\t\t\tdata.iFilter = wo.filter_ignoreCase ? ( data.filter || '' ).toLowerCase() : data.filter;\n\t\t\t\t\tfxn = vars.functions[ columnIndex ];\n\t\t\t\t\tfilterMatched = null;\n\t\t\t\t\tif ( fxn ) {\n\t\t\t\t\t\tif ( fxn === true ) {\n\t\t\t\t\t\t\t// default selector uses exact match unless 'filter-match' class is found\n\t\t\t\t\t\t\tfilterMatched = data.isMatch ?\n\t\t\t\t\t\t\t\t// data.iExact may be a number\n\t\t\t\t\t\t\t\t( '' + data.iExact ).search( data.iFilter ) >= 0 :\n\t\t\t\t\t\t\t\tdata.filter === data.exact;\n\t\t\t\t\t\t} else if ( typeof fxn === 'function' ) {\n\t\t\t\t\t\t\t// filter callback( exact cell content, parser normalized content,\n\t\t\t\t\t\t\t// filter input value, column index, jQuery row object )\n\t\t\t\t\t\t\tfilterMatched = fxn( data.exact, data.cache, data.filter, columnIndex, data.$row, c, data );\n\t\t\t\t\t\t} else if ( typeof fxn[ ffxn || data.filter ] === 'function' ) {\n\t\t\t\t\t\t\t// selector option function\n\t\t\t\t\t\t\ttxt = ffxn || data.filter;\n\t\t\t\t\t\t\tfilterMatched =\n\t\t\t\t\t\t\t\tfxn[ txt ]( data.exact, data.cache, data.filter, columnIndex, data.$row, c, data );\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tif ( filterMatched === null ) {\n\t\t\t\t\t\t// cycle through the different filters\n\t\t\t\t\t\t// filters return a boolean or null if nothing matches\n\t\t\t\t\t\tfilterMatched = tsf.processTypes( c, data, vars );\n\t\t\t\t\t\tif ( filterMatched !== null ) {\n\t\t\t\t\t\t\tresult = filterMatched;\n\t\t\t\t\t\t// Look for match, and add child row data for matching\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\ttxt = ( data.iExact + data.childRowText ).indexOf( tsf.parseFilter( c, data.iFilter, data ) );\n\t\t\t\t\t\t\tresult = ( ( !wo.filter_startsWith && txt >= 0 ) || ( wo.filter_startsWith && txt === 0 ) );\n\t\t\t\t\t\t}\n\t\t\t\t\t} else {\n\t\t\t\t\t\tresult = filterMatched;\n\t\t\t\t\t}\n\t\t\t\t\tshowRow = ( result ) ? showRow : false;\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn showRow;\n\t\t},\n\t\tfindRows: function( table, filters, combinedFilters ) {\n\t\t\tif ( table.config.lastCombinedFilter === combinedFilters ||\n\t\t\t\t!table.config.widgetOptions.filter_initialized ) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tvar len, norm_rows, rowData, $rows, $row, rowIndex, tbodyIndex, $tbody, columnIndex,\n\t\t\t\tisChild, childRow, lastSearch, showRow, showParent, time, val, indx,\n\t\t\t\tnotFiltered, searchFiltered, query, injected, res, id, txt,\n\t\t\t\tstoredFilters = $.extend( [], filters ),\n\t\t\t\tc = table.config,\n\t\t\t\two = c.widgetOptions,\n\t\t\t\t// data object passed to filters; anyMatch is a flag for the filters\n\t\t\t\tdata = {\n\t\t\t\t\tanyMatch: false,\n\t\t\t\t\tfilters: filters,\n\t\t\t\t\t// regex filter type cache\n\t\t\t\t\tfilter_regexCache : []\n\t\t\t\t},\n\t\t\t\tvars = {\n\t\t\t\t\t// anyMatch really screws up with these types of filters\n\t\t\t\t\tnoAnyMatch: [ 'range',  'operators' ],\n\t\t\t\t\t// cache filter variables that use ts.getColumnData in the main loop\n\t\t\t\t\tfunctions : [],\n\t\t\t\t\texcludeFilter : [],\n\t\t\t\t\tdefaultColFilter : [],\n\t\t\t\t\tdefaultAnyFilter : ts.getColumnData( table, wo.filter_defaultFilter, c.columns, true ) || ''\n\t\t\t\t};\n\n\t\t\t// parse columns after formatter, in case the class is added at that point\n\t\t\tdata.parsed = [];\n\t\t\tfor ( columnIndex = 0; columnIndex < c.columns; columnIndex++ ) {\n\t\t\t\tdata.parsed[ columnIndex ] = wo.filter_useParsedData ||\n\t\t\t\t\t// parser has a \"parsed\" parameter\n\t\t\t\t\t( c.parsers && c.parsers[ columnIndex ] && c.parsers[ columnIndex ].parsed ||\n\t\t\t\t\t// getData may not return 'parsed' if other 'filter-' class names exist\n\t\t\t\t\t// ( e.g. <th class=\"filter-select filter-parsed\"> )\n\t\t\t\t\tts.getData && ts.getData( c.$headerIndexed[ columnIndex ],\n\t\t\t\t\t\tts.getColumnData( table, c.headers, columnIndex ), 'filter' ) === 'parsed' ||\n\t\t\t\t\tc.$headerIndexed[ columnIndex ].hasClass( 'filter-parsed' ) );\n\n\t\t\t\tvars.functions[ columnIndex ] =\n\t\t\t\t\tts.getColumnData( table, wo.filter_functions, columnIndex ) ||\n\t\t\t\t\tc.$headerIndexed[ columnIndex ].hasClass( 'filter-select' );\n\t\t\t\tvars.defaultColFilter[ columnIndex ] =\n\t\t\t\t\tts.getColumnData( table, wo.filter_defaultFilter, columnIndex ) || '';\n\t\t\t\tvars.excludeFilter[ columnIndex ] =\n\t\t\t\t\t( ts.getColumnData( table, wo.filter_excludeFilter, columnIndex, true ) || '' ).split( /\\s+/ );\n\t\t\t}\n\n\t\t\tif ( c.debug ) {\n\t\t\t\tconsole.log( 'Filter: Starting filter widget search', filters );\n\t\t\t\ttime = new Date();\n\t\t\t}\n\t\t\t// filtered rows count\n\t\t\tc.filteredRows = 0;\n\t\t\tc.totalRows = 0;\n\t\t\t// combindedFilters are undefined on init\n\t\t\tcombinedFilters = ( storedFilters || [] ).join( '' );\n\n\t\t\tfor ( tbodyIndex = 0; tbodyIndex < c.$tbodies.length; tbodyIndex++ ) {\n\t\t\t\t$tbody = ts.processTbody( table, c.$tbodies.eq( tbodyIndex ), true );\n\t\t\t\t// skip child rows & widget added ( removable ) rows - fixes #448 thanks to @hempel!\n\t\t\t\t// $rows = $tbody.children( 'tr' ).not( c.selectorRemove );\n\t\t\t\tcolumnIndex = c.columns;\n\t\t\t\t// convert stored rows into a jQuery object\n\t\t\t\tnorm_rows = c.cache[ tbodyIndex ].normalized;\n\t\t\t\t$rows = $( $.map( norm_rows, function( el ) {\n\t\t\t\t\treturn el[ columnIndex ].$row.get();\n\t\t\t\t}) );\n\n\t\t\t\tif ( combinedFilters === '' || wo.filter_serversideFiltering ) {\n\t\t\t\t\t$rows\n\t\t\t\t\t\t.removeClass( wo.filter_filteredRow )\n\t\t\t\t\t\t.not( '.' + c.cssChildRow )\n\t\t\t\t\t\t.css( 'display', '' );\n\t\t\t\t} else {\n\t\t\t\t\t// filter out child rows\n\t\t\t\t\t$rows = $rows.not( '.' + c.cssChildRow );\n\t\t\t\t\tlen = $rows.length;\n\n\t\t\t\t\tif ( ( wo.filter_$anyMatch && wo.filter_$anyMatch.length ) ||\n\t\t\t\t\t\ttypeof filters[c.columns] !== 'undefined' ) {\n\t\t\t\t\t\tdata.anyMatchFlag = true;\n\t\t\t\t\t\tdata.anyMatchFilter = '' + (\n\t\t\t\t\t\t\tfilters[ c.columns ] ||\n\t\t\t\t\t\t\two.filter_$anyMatch && tsf.getLatestSearch( wo.filter_$anyMatch ).val() ||\n\t\t\t\t\t\t\t''\n\t\t\t\t\t\t);\n\t\t\t\t\t\tif ( wo.filter_columnAnyMatch ) {\n\t\t\t\t\t\t\t// specific columns search\n\t\t\t\t\t\t\tquery = data.anyMatchFilter.split( tsfRegex.andSplit );\n\t\t\t\t\t\t\tinjected = false;\n\t\t\t\t\t\t\tfor ( indx = 0; indx < query.length; indx++ ) {\n\t\t\t\t\t\t\t\tres = query[ indx ].split( ':' );\n\t\t\t\t\t\t\t\tif ( res.length > 1 ) {\n\t\t\t\t\t\t\t\t\t// make the column a one-based index ( non-developers start counting from one :P )\n\t\t\t\t\t\t\t\t\tid = parseInt( res[0], 10 ) - 1;\n\t\t\t\t\t\t\t\t\tif ( id >= 0 && id < c.columns ) { // if id is an integer\n\t\t\t\t\t\t\t\t\t\tfilters[ id ] = res[1];\n\t\t\t\t\t\t\t\t\t\tquery.splice( indx, 1 );\n\t\t\t\t\t\t\t\t\t\tindx--;\n\t\t\t\t\t\t\t\t\t\tinjected = true;\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tif ( injected ) {\n\t\t\t\t\t\t\t\tdata.anyMatchFilter = query.join( ' && ' );\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\t// optimize searching only through already filtered rows - see #313\n\t\t\t\t\tsearchFiltered = wo.filter_searchFiltered;\n\t\t\t\t\tlastSearch = c.lastSearch || c.$table.data( 'lastSearch' ) || [];\n\t\t\t\t\tif ( searchFiltered ) {\n\t\t\t\t\t\t// cycle through all filters; include last ( columnIndex + 1 = match any column ). Fixes #669\n\t\t\t\t\t\tfor ( indx = 0; indx < columnIndex + 1; indx++ ) {\n\t\t\t\t\t\t\tval = filters[indx] || '';\n\t\t\t\t\t\t\t// break out of loop if we've already determined not to search filtered rows\n\t\t\t\t\t\t\tif ( !searchFiltered ) { indx = columnIndex; }\n\t\t\t\t\t\t\t// search already filtered rows if...\n\t\t\t\t\t\t\tsearchFiltered = searchFiltered && lastSearch.length &&\n\t\t\t\t\t\t\t\t// there are no changes from beginning of filter\n\t\t\t\t\t\t\t\tval.indexOf( lastSearch[indx] || '' ) === 0 &&\n\t\t\t\t\t\t\t\t// if there is NOT a logical 'or', or range ( 'to' or '-' ) in the string\n\t\t\t\t\t\t\t\t!tsfRegex.alreadyFiltered.test( val ) &&\n\t\t\t\t\t\t\t\t// if we are not doing exact matches, using '|' ( logical or ) or not '!'\n\t\t\t\t\t\t\t\t!tsfRegex.exactTest.test( val ) &&\n\t\t\t\t\t\t\t\t// don't search only filtered if the value is negative\n\t\t\t\t\t\t\t\t// ( '> -10' => '> -100' will ignore hidden rows )\n\t\t\t\t\t\t\t\t!( tsfRegex.isNeg1.test( val ) || tsfRegex.isNeg2.test( val ) ) &&\n\t\t\t\t\t\t\t\t// if filtering using a select without a 'filter-match' class ( exact match ) - fixes #593\n\t\t\t\t\t\t\t\t!( val !== '' && c.$filters && c.$filters.filter( '[data-column=\"' + indx + '\"]' ).find( 'select' ).length &&\n\t\t\t\t\t\t\t\t\t!tsf.matchType( c, indx ) );\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tnotFiltered = $rows.not( '.' + wo.filter_filteredRow ).length;\n\t\t\t\t\t// can't search when all rows are hidden - this happens when looking for exact matches\n\t\t\t\t\tif ( searchFiltered && notFiltered === 0 ) { searchFiltered = false; }\n\t\t\t\t\tif ( c.debug ) {\n\t\t\t\t\t\tconsole.log( 'Filter: Searching through ' +\n\t\t\t\t\t\t\t( searchFiltered && notFiltered < len ? notFiltered : 'all' ) + ' rows' );\n\t\t\t\t\t}\n\t\t\t\t\tif ( data.anyMatchFlag ) {\n\t\t\t\t\t\tif ( c.sortLocaleCompare ) {\n\t\t\t\t\t\t\t// replace accents\n\t\t\t\t\t\t\tdata.anyMatchFilter = ts.replaceAccents( data.anyMatchFilter );\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif ( wo.filter_defaultFilter && tsfRegex.iQuery.test( vars.defaultAnyFilter ) ) {\n\t\t\t\t\t\t\tdata.anyMatchFilter = tsf.defaultFilter( data.anyMatchFilter, vars.defaultAnyFilter );\n\t\t\t\t\t\t\t// clear search filtered flag because default filters are not saved to the last search\n\t\t\t\t\t\t\tsearchFiltered = false;\n\t\t\t\t\t\t}\n\t\t\t\t\t\t// make iAnyMatchFilter lowercase unless both filter widget & core ignoreCase options are true\n\t\t\t\t\t\t// when c.ignoreCase is true, the cache contains all lower case data\n\t\t\t\t\t\tdata.iAnyMatchFilter = !( wo.filter_ignoreCase && c.ignoreCase ) ?\n\t\t\t\t\t\t\tdata.anyMatchFilter :\n\t\t\t\t\t\t\tdata.anyMatchFilter.toLowerCase();\n\t\t\t\t\t}\n\n\t\t\t\t\t// loop through the rows\n\t\t\t\t\tfor ( rowIndex = 0; rowIndex < len; rowIndex++ ) {\n\n\t\t\t\t\t\ttxt = $rows[ rowIndex ].className;\n\t\t\t\t\t\t// the first row can never be a child row\n\t\t\t\t\t\tisChild = rowIndex && tsfRegex.child.test( txt );\n\t\t\t\t\t\t// skip child rows & already filtered rows\n\t\t\t\t\t\tif ( isChild || ( searchFiltered && tsfRegex.filtered.test( txt ) ) ) {\n\t\t\t\t\t\t\tcontinue;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tdata.$row = $rows.eq( rowIndex );\n\t\t\t\t\t\tdata.cacheArray = norm_rows[ rowIndex ];\n\t\t\t\t\t\trowData = data.cacheArray[ c.columns ];\n\t\t\t\t\t\tdata.rawArray = rowData.raw;\n\t\t\t\t\t\tdata.childRowText = '';\n\n\t\t\t\t\t\tif ( !wo.filter_childByColumn ) {\n\t\t\t\t\t\t\ttxt = '';\n\t\t\t\t\t\t\t// child row cached text\n\t\t\t\t\t\t\tchildRow = rowData.child;\n\t\t\t\t\t\t\t// so, if 'table.config.widgetOptions.filter_childRows' is true and there is\n\t\t\t\t\t\t\t// a match anywhere in the child row, then it will make the row visible\n\t\t\t\t\t\t\t// checked here so the option can be changed dynamically\n\t\t\t\t\t\t\tfor ( indx = 0; indx < childRow.length; indx++ ) {\n\t\t\t\t\t\t\t\ttxt += ' ' + childRow[indx].join( ' ' ) || '';\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tdata.childRowText = wo.filter_childRows ?\n\t\t\t\t\t\t\t\t( wo.filter_ignoreCase ? txt.toLowerCase() : txt ) :\n\t\t\t\t\t\t\t\t'';\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tshowRow = false;\n\t\t\t\t\t\tshowParent = tsf.processRow( c, data, vars );\n\t\t\t\t\t\t$row = rowData.$row;\n\n\t\t\t\t\t\t// don't pass reference to val\n\t\t\t\t\t\tval = showParent ? true : false;\n\t\t\t\t\t\tchildRow = rowData.$row.filter( ':gt(0)' );\n\t\t\t\t\t\tif ( wo.filter_childRows && childRow.length ) {\n\t\t\t\t\t\t\tif ( wo.filter_childByColumn ) {\n\t\t\t\t\t\t\t\tif ( !wo.filter_childWithSibs ) {\n\t\t\t\t\t\t\t\t\t// hide all child rows\n\t\t\t\t\t\t\t\t\tchildRow.addClass( wo.filter_filteredRow );\n\t\t\t\t\t\t\t\t\t// if only showing resulting child row, only include parent\n\t\t\t\t\t\t\t\t\t$row = $row.eq( 0 );\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t// cycle through each child row\n\t\t\t\t\t\t\t\tfor ( indx = 0; indx < childRow.length; indx++ ) {\n\t\t\t\t\t\t\t\t\tdata.$row = childRow.eq( indx );\n\t\t\t\t\t\t\t\t\tdata.cacheArray = rowData.child[ indx ];\n\t\t\t\t\t\t\t\t\tdata.rawArray = data.cacheArray;\n\t\t\t\t\t\t\t\t\tval = tsf.processRow( c, data, vars );\n\t\t\t\t\t\t\t\t\t// use OR comparison on child rows\n\t\t\t\t\t\t\t\t\tshowRow = showRow || val;\n\t\t\t\t\t\t\t\t\tif ( !wo.filter_childWithSibs && val ) {\n\t\t\t\t\t\t\t\t\t\tchildRow.eq( indx ).removeClass( wo.filter_filteredRow );\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t// keep parent row match even if no child matches... see #1020\n\t\t\t\t\t\t\tshowRow = showRow || showParent;\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tshowRow = val;\n\t\t\t\t\t\t}\n\t\t\t\t\t\t$row\n\t\t\t\t\t\t\t.toggleClass( wo.filter_filteredRow, !showRow )[0]\n\t\t\t\t\t\t\t.display = showRow ? '' : 'none';\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tc.filteredRows += $rows.not( '.' + wo.filter_filteredRow ).length;\n\t\t\t\tc.totalRows += $rows.length;\n\t\t\t\tts.processTbody( table, $tbody, false );\n\t\t\t}\n\t\t\tc.lastCombinedFilter = combinedFilters; // save last search\n\t\t\t// don't save 'filters' directly since it may have altered ( AnyMatch column searches )\n\t\t\tc.lastSearch = storedFilters;\n\t\t\tc.$table.data( 'lastSearch', storedFilters );\n\t\t\tif ( wo.filter_saveFilters && ts.storage ) {\n\t\t\t\tts.storage( table, 'tablesorter-filters', tsf.processFilters( storedFilters, true ) );\n\t\t\t}\n\t\t\tif ( c.debug ) {\n\t\t\t\tconsole.log( 'Completed filter widget search' + ts.benchmark(time) );\n\t\t\t}\n\t\t\tif ( wo.filter_initialized ) {\n\t\t\t\tc.$table.triggerHandler( 'filterBeforeEnd', c );\n\t\t\t\tc.$table.triggerHandler( 'filterEnd', c );\n\t\t\t}\n\t\t\tsetTimeout( function() {\n\t\t\t\tts.applyWidget( c.table ); // make sure zebra widget is applied\n\t\t\t}, 0 );\n\t\t},\n\t\tgetOptionSource: function( table, column, onlyAvail ) {\n\t\t\ttable = $( table )[0];\n\t\t\tvar c = table.config,\n\t\t\t\two = c.widgetOptions,\n\t\t\t\tarry = false,\n\t\t\t\tsource = wo.filter_selectSource,\n\t\t\t\tlast = c.$table.data( 'lastSearch' ) || [],\n\t\t\t\tfxn = typeof source === 'function' ? true : ts.getColumnData( table, source, column );\n\n\t\t\tif ( onlyAvail && last[column] !== '' ) {\n\t\t\t\tonlyAvail = false;\n\t\t\t}\n\n\t\t\t// filter select source option\n\t\t\tif ( fxn === true ) {\n\t\t\t\t// OVERALL source\n\t\t\t\tarry = source( table, column, onlyAvail );\n\t\t\t} else if ( fxn instanceof $ || ( $.type( fxn ) === 'string' && fxn.indexOf( '</option>' ) >= 0 ) ) {\n\t\t\t\t// selectSource is a jQuery object or string of options\n\t\t\t\treturn fxn;\n\t\t\t} else if ( $.isArray( fxn ) ) {\n\t\t\t\tarry = fxn;\n\t\t\t} else if ( $.type( source ) === 'object' && fxn ) {\n\t\t\t\t// custom select source function for a SPECIFIC COLUMN\n\t\t\t\tarry = fxn( table, column, onlyAvail );\n\t\t\t}\n\t\t\tif ( arry === false ) {\n\t\t\t\t// fall back to original method\n\t\t\t\tarry = tsf.getOptions( table, column, onlyAvail );\n\t\t\t}\n\n\t\t\treturn tsf.processOptions( table, column, arry );\n\n\t\t},\n\t\tprocessOptions: function( table, column, arry ) {\n\t\t\tif ( !$.isArray( arry ) ) {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t\ttable = $( table )[0];\n\t\t\tvar cts, txt, indx, len, parsedTxt, str,\n\t\t\t\tc = table.config,\n\t\t\t\tvalidColumn = typeof column !== 'undefined' && column !== null && column >= 0 && column < c.columns,\n\t\t\t\tparsed = [];\n\t\t\t// get unique elements and sort the list\n\t\t\t// if $.tablesorter.sortText exists ( not in the original tablesorter ),\n\t\t\t// then natural sort the list otherwise use a basic sort\n\t\t\tarry = $.grep( arry, function( value, indx ) {\n\t\t\t\tif ( value.text ) {\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\t\t\t\treturn $.inArray( value, arry ) === indx;\n\t\t\t});\n\t\t\tif ( validColumn && c.$headerIndexed[ column ].hasClass( 'filter-select-nosort' ) ) {\n\t\t\t\t// unsorted select options\n\t\t\t\treturn arry;\n\t\t\t} else {\n\t\t\t\tlen = arry.length;\n\t\t\t\t// parse select option values\n\t\t\t\tfor ( indx = 0; indx < len; indx++ ) {\n\t\t\t\t\ttxt = arry[ indx ];\n\t\t\t\t\t// check for object\n\t\t\t\t\tstr = txt.text ? txt.text : txt;\n\t\t\t\t\t// sortNatural breaks if you don't pass it strings\n\t\t\t\t\tparsedTxt = ( validColumn && c.parsers && c.parsers.length &&\n\t\t\t\t\t\tc.parsers[ column ].format( str, table, [], column ) || str ).toString();\n\t\t\t\t\tparsedTxt = c.widgetOptions.filter_ignoreCase ? parsedTxt.toLowerCase() : parsedTxt;\n\t\t\t\t\t// parse array data using set column parser; this DOES NOT pass the original\n\t\t\t\t\t// table cell to the parser format function\n\t\t\t\t\tif ( txt.text ) {\n\t\t\t\t\t\ttxt.parsed = parsedTxt;\n\t\t\t\t\t\tparsed[ parsed.length ] = txt;\n\t\t\t\t\t} else {\n\t\t\t\t\t\tparsed[ parsed.length ] = {\n\t\t\t\t\t\t\ttext : txt,\n\t\t\t\t\t\t\t// check parser length - fixes #934\n\t\t\t\t\t\t\tparsed : parsedTxt\n\t\t\t\t\t\t};\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\t// sort parsed select options\n\t\t\t\tcts = c.textSorter || '';\n\t\t\t\tparsed.sort( function( a, b ) {\n\t\t\t\t\tvar x = a.parsed,\n\t\t\t\t\t\ty = b.parsed;\n\t\t\t\t\tif ( validColumn && typeof cts === 'function' ) {\n\t\t\t\t\t\t// custom OVERALL text sorter\n\t\t\t\t\t\treturn cts( x, y, true, column, table );\n\t\t\t\t\t} else if ( validColumn && typeof cts === 'object' && cts.hasOwnProperty( column ) ) {\n\t\t\t\t\t\t// custom text sorter for a SPECIFIC COLUMN\n\t\t\t\t\t\treturn cts[column]( x, y, true, column, table );\n\t\t\t\t\t} else if ( ts.sortNatural ) {\n\t\t\t\t\t\t// fall back to natural sort\n\t\t\t\t\t\treturn ts.sortNatural( x, y );\n\t\t\t\t\t}\n\t\t\t\t\t// using an older version! do a basic sort\n\t\t\t\t\treturn true;\n\t\t\t\t});\n\t\t\t\t// rebuild arry from sorted parsed data\n\t\t\t\tarry = [];\n\t\t\t\tlen = parsed.length;\n\t\t\t\tfor ( indx = 0; indx < len; indx++ ) {\n\t\t\t\t\tarry[ arry.length ] = parsed[indx];\n\t\t\t\t}\n\t\t\t\treturn arry;\n\t\t\t}\n\t\t},\n\t\tgetOptions: function( table, column, onlyAvail ) {\n\t\t\ttable = $( table )[0];\n\t\t\tvar rowIndex, tbodyIndex, len, row, cache, indx, child, childLen,\n\t\t\t\tc = table.config,\n\t\t\t\two = c.widgetOptions,\n\t\t\t\tarry = [];\n\t\t\tfor ( tbodyIndex = 0; tbodyIndex < c.$tbodies.length; tbodyIndex++ ) {\n\t\t\t\tcache = c.cache[tbodyIndex];\n\t\t\t\tlen = c.cache[tbodyIndex].normalized.length;\n\t\t\t\t// loop through the rows\n\t\t\t\tfor ( rowIndex = 0; rowIndex < len; rowIndex++ ) {\n\t\t\t\t\t// get cached row from cache.row ( old ) or row data object\n\t\t\t\t\t// ( new; last item in normalized array )\n\t\t\t\t\trow = cache.row ?\n\t\t\t\t\t\tcache.row[ rowIndex ] :\n\t\t\t\t\t\tcache.normalized[ rowIndex ][ c.columns ].$row[0];\n\t\t\t\t\t// check if has class filtered\n\t\t\t\t\tif ( onlyAvail && row.className.match( wo.filter_filteredRow ) ) {\n\t\t\t\t\t\tcontinue;\n\t\t\t\t\t}\n\t\t\t\t\t// get non-normalized cell content\n\t\t\t\t\tif ( wo.filter_useParsedData ||\n\t\t\t\t\t\tc.parsers[column].parsed ||\n\t\t\t\t\t\tc.$headerIndexed[column].hasClass( 'filter-parsed' ) ) {\n\t\t\t\t\t\tarry[ arry.length ] = '' + cache.normalized[ rowIndex ][ column ];\n\t\t\t\t\t\t// child row parsed data\n\t\t\t\t\t\tif ( wo.filter_childRows && wo.filter_childByColumn ) {\n\t\t\t\t\t\t\tchildLen = cache.normalized[ rowIndex ][ c.columns ].$row.length - 1;\n\t\t\t\t\t\t\tfor ( indx = 0; indx < childLen; indx++ ) {\n\t\t\t\t\t\t\t\tarry[ arry.length ] = '' + cache.normalized[ rowIndex ][ c.columns ].child[ indx ][ column ];\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t} else {\n\t\t\t\t\t\t// get raw cached data instead of content directly from the cells\n\t\t\t\t\t\tarry[ arry.length ] = cache.normalized[ rowIndex ][ c.columns ].raw[ column ];\n\t\t\t\t\t\t// child row unparsed data\n\t\t\t\t\t\tif ( wo.filter_childRows && wo.filter_childByColumn ) {\n\t\t\t\t\t\t\tchildLen = cache.normalized[ rowIndex ][ c.columns ].$row.length;\n\t\t\t\t\t\t\tfor ( indx = 1; indx < childLen; indx++ ) {\n\t\t\t\t\t\t\t\tchild =  cache.normalized[ rowIndex ][ c.columns ].$row.eq( indx ).children().eq( column );\n\t\t\t\t\t\t\t\tarry[ arry.length ] = '' + ts.getElementText( c, child, column );\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn arry;\n\t\t},\n\t\tbuildSelect: function( table, column, arry, updating, onlyAvail ) {\n\t\t\ttable = $( table )[0];\n\t\t\tcolumn = parseInt( column, 10 );\n\t\t\tif ( !table.config.cache || $.isEmptyObject( table.config.cache ) ) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tvar indx, val, txt, t, $filters, $filter, option,\n\t\t\t\tc = table.config,\n\t\t\t\two = c.widgetOptions,\n\t\t\t\tnode = c.$headerIndexed[ column ],\n\t\t\t\t// t.data( 'placeholder' ) won't work in jQuery older than 1.4.3\n\t\t\t\toptions = '<option value=\"\">' +\n\t\t\t\t\t( node.data( 'placeholder' ) ||\n\t\t\t\t\t\tnode.attr( 'data-placeholder' ) ||\n\t\t\t\t\t\two.filter_placeholder.select || ''\n\t\t\t\t\t) + '</option>',\n\t\t\t\t// Get curent filter value\n\t\t\t\tcurrentValue = c.$table\n\t\t\t\t\t.find( 'thead' )\n\t\t\t\t\t.find( 'select.' + tscss.filter + '[data-column=\"' + column + '\"]' )\n\t\t\t\t\t.val();\n\n\t\t\t// nothing included in arry ( external source ), so get the options from\n\t\t\t// filter_selectSource or column data\n\t\t\tif ( typeof arry === 'undefined' || arry === '' ) {\n\t\t\t\tarry = tsf.getOptionSource( table, column, onlyAvail );\n\t\t\t}\n\n\t\t\tif ( $.isArray( arry ) ) {\n\t\t\t\t// build option list\n\t\t\t\tfor ( indx = 0; indx < arry.length; indx++ ) {\n\t\t\t\t\toption = arry[ indx ];\n\t\t\t\t\tif ( option.text ) {\n\t\t\t\t\t\t// OBJECT!! add data-function-name in case the value is set in filter_functions\n\t\t\t\t\t\toption['data-function-name'] = typeof option.value === 'undefined' ? option.text : option.value;\n\n\t\t\t\t\t\t// support jQuery < v1.8, otherwise the below code could be shortened to\n\t\t\t\t\t\t// options += $( '<option>', option )[ 0 ].outerHTML;\n\t\t\t\t\t\toptions += '<option';\n\t\t\t\t\t\tfor ( val in option ) {\n\t\t\t\t\t\t\tif ( option.hasOwnProperty( val ) && val !== 'text' ) {\n\t\t\t\t\t\t\t\toptions += ' ' + val + '=\"' + option[ val ] + '\"';\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif ( !option.value ) {\n\t\t\t\t\t\t\toptions += ' value=\"' + option.text + '\"';\n\t\t\t\t\t\t}\n\t\t\t\t\t\toptions += '>' + option.text + '</option>';\n\t\t\t\t\t\t// above code is needed in jQuery < v1.8\n\n\t\t\t\t\t\t// make sure we don't turn an object into a string (objects without a \"text\" property)\n\t\t\t\t\t} else if ( '' + option !== '[object Object]' ) {\n\t\t\t\t\t\ttxt = option = ( '' + option ).replace( tsfRegex.quote, '&quot;' );\n\t\t\t\t\t\tval = txt;\n\t\t\t\t\t\t// allow including a symbol in the selectSource array\n\t\t\t\t\t\t// 'a-z|A through Z' so that 'a-z' becomes the option value\n\t\t\t\t\t\t// and 'A through Z' becomes the option text\n\t\t\t\t\t\tif ( txt.indexOf( wo.filter_selectSourceSeparator ) >= 0 ) {\n\t\t\t\t\t\t\tt = txt.split( wo.filter_selectSourceSeparator );\n\t\t\t\t\t\t\tval = t[0];\n\t\t\t\t\t\t\ttxt = t[1];\n\t\t\t\t\t\t}\n\t\t\t\t\t\t// replace quotes - fixes #242 & ignore empty strings\n\t\t\t\t\t\t// see http://stackoverflow.com/q/14990971/145346\n\t\t\t\t\t\toptions += option !== '' ?\n\t\t\t\t\t\t\t'<option ' +\n\t\t\t\t\t\t\t\t( val === txt ? '' : 'data-function-name=\"' + option + '\" ' ) +\n\t\t\t\t\t\t\t\t'value=\"' + val + '\">' + txt +\n\t\t\t\t\t\t\t'</option>' : '';\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\t// clear arry so it doesn't get appended twice\n\t\t\t\tarry = [];\n\t\t\t}\n\n\t\t\t// update all selects in the same column ( clone thead in sticky headers &\n\t\t\t// any external selects ) - fixes 473\n\t\t\t$filters = ( c.$filters ? c.$filters : c.$table.children( 'thead' ) )\n\t\t\t\t.find( '.' + tscss.filter );\n\t\t\tif ( wo.filter_$externalFilters ) {\n\t\t\t\t$filters = $filters && $filters.length ?\n\t\t\t\t\t$filters.add( wo.filter_$externalFilters ) :\n\t\t\t\t\two.filter_$externalFilters;\n\t\t\t}\n\t\t\t$filter = $filters.filter( 'select[data-column=\"' + column + '\"]' );\n\n\t\t\t// make sure there is a select there!\n\t\t\tif ( $filter.length ) {\n\t\t\t\t$filter[ updating ? 'html' : 'append' ]( options );\n\t\t\t\tif ( !$.isArray( arry ) ) {\n\t\t\t\t\t// append options if arry is provided externally as a string or jQuery object\n\t\t\t\t\t// options ( default value ) was already added\n\t\t\t\t\t$filter.append( arry ).val( currentValue );\n\t\t\t\t}\n\t\t\t\t$filter.val( currentValue );\n\t\t\t}\n\t\t},\n\t\tbuildDefault: function( table, updating ) {\n\t\t\tvar columnIndex, $header, noSelect,\n\t\t\t\tc = table.config,\n\t\t\t\two = c.widgetOptions,\n\t\t\t\tcolumns = c.columns;\n\t\t\t// build default select dropdown\n\t\t\tfor ( columnIndex = 0; columnIndex < columns; columnIndex++ ) {\n\t\t\t\t$header = c.$headerIndexed[columnIndex];\n\t\t\t\tnoSelect = !( $header.hasClass( 'filter-false' ) || $header.hasClass( 'parser-false' ) );\n\t\t\t\t// look for the filter-select class; build/update it if found\n\t\t\t\tif ( ( $header.hasClass( 'filter-select' ) ||\n\t\t\t\t\tts.getColumnData( table, wo.filter_functions, columnIndex ) === true ) && noSelect ) {\n\t\t\t\t\ttsf.buildSelect( table, columnIndex, '', updating, $header.hasClass( wo.filter_onlyAvail ) );\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t};\n\n\t// filter regex variable\n\ttsfRegex = tsf.regex;\n\n\tts.getFilters = function( table, getRaw, setFilters, skipFirst ) {\n\t\tvar i, $filters, $column, cols,\n\t\t\tfilters = false,\n\t\t\tc = table ? $( table )[0].config : '',\n\t\t\two = c ? c.widgetOptions : '';\n\t\tif ( ( getRaw !== true && wo && !wo.filter_columnFilters ) ||\n\t\t\t// setFilters called, but last search is exactly the same as the current\n\t\t\t// fixes issue #733 & #903 where calling update causes the input values to reset\n\t\t\t( $.isArray(setFilters) && setFilters.join('') === c.lastCombinedFilter ) ) {\n\t\t\treturn $( table ).data( 'lastSearch' );\n\t\t}\n\t\tif ( c ) {\n\t\t\tif ( c.$filters ) {\n\t\t\t\t$filters = c.$filters.find( '.' + tscss.filter );\n\t\t\t}\n\t\t\tif ( wo.filter_$externalFilters ) {\n\t\t\t\t$filters = $filters && $filters.length ?\n\t\t\t\t\t$filters.add( wo.filter_$externalFilters ) :\n\t\t\t\t\two.filter_$externalFilters;\n\t\t\t}\n\t\t\tif ( $filters && $filters.length ) {\n\t\t\t\tfilters = setFilters || [];\n\t\t\t\tfor ( i = 0; i < c.columns + 1; i++ ) {\n\t\t\t\t\tcols = ( i === c.columns ?\n\t\t\t\t\t\t// 'all' columns can now include a range or set of columms ( data-column='0-2,4,6-7' )\n\t\t\t\t\t\two.filter_anyColumnSelector + ',' + wo.filter_multipleColumnSelector :\n\t\t\t\t\t\t'[data-column=\"' + i + '\"]' );\n\t\t\t\t\t$column = $filters.filter( cols );\n\t\t\t\t\tif ( $column.length ) {\n\t\t\t\t\t\t// move the latest search to the first slot in the array\n\t\t\t\t\t\t$column = tsf.getLatestSearch( $column );\n\t\t\t\t\t\tif ( $.isArray( setFilters ) ) {\n\t\t\t\t\t\t\t// skip first ( latest input ) to maintain cursor position while typing\n\t\t\t\t\t\t\tif ( skipFirst && $column.length > 1 ) {\n\t\t\t\t\t\t\t\t$column = $column.slice( 1 );\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tif ( i === c.columns ) {\n\t\t\t\t\t\t\t\t// prevent data-column='all' from filling data-column='0,1' ( etc )\n\t\t\t\t\t\t\t\tcols = $column.filter( wo.filter_anyColumnSelector );\n\t\t\t\t\t\t\t\t$column = cols.length ? cols : $column;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t$column\n\t\t\t\t\t\t\t\t.val( setFilters[ i ] )\n\t\t\t\t\t\t\t\t// must include a namespace here; but not c.namespace + 'filter'?\n\t\t\t\t\t\t\t\t.trigger( 'change' + c.namespace );\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tfilters[i] = $column.val() || '';\n\t\t\t\t\t\t\t// don't change the first... it will move the cursor\n\t\t\t\t\t\t\tif ( i === c.columns ) {\n\t\t\t\t\t\t\t\t// don't update range columns from 'all' setting\n\t\t\t\t\t\t\t\t$column\n\t\t\t\t\t\t\t\t\t.slice( 1 )\n\t\t\t\t\t\t\t\t\t.filter( '[data-column*=\"' + $column.attr( 'data-column' ) + '\"]' )\n\t\t\t\t\t\t\t\t\t.val( filters[ i ] );\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t$column\n\t\t\t\t\t\t\t\t\t.slice( 1 )\n\t\t\t\t\t\t\t\t\t.val( filters[ i ] );\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t\t// save any match input dynamically\n\t\t\t\t\t\tif ( i === c.columns && $column.length ) {\n\t\t\t\t\t\t\two.filter_$anyMatch = $column;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tif ( filters.length === 0 ) {\n\t\t\tfilters = false;\n\t\t}\n\t\treturn filters;\n\t};\n\n\tts.setFilters = function( table, filter, apply, skipFirst ) {\n\t\tvar c = table ? $( table )[0].config : '',\n\t\t\tvalid = ts.getFilters( table, true, filter, skipFirst );\n\t\t// default apply to \"true\"\n\t\tif ( typeof apply === 'undefined' ) {\n\t\t\tapply = true;\n\t\t}\n\t\tif ( c && apply ) {\n\t\t\t// ensure new set filters are applied, even if the search is the same\n\t\t\tc.lastCombinedFilter = null;\n\t\t\tc.lastSearch = [];\n\t\t\ttsf.searching( c.table, filter, skipFirst );\n\t\t\tc.$table.triggerHandler( 'filterFomatterUpdate' );\n\t\t}\n\t\treturn !!valid;\n\t};\n\n})( jQuery );\n\n/*! Widget: stickyHeaders - updated 5/1/2016 (v2.26.0) *//*\n * Requires tablesorter v2.8+ and jQuery 1.4.3+\n * by Rob Garrison\n */\n;(function ($, window) {\n\t'use strict';\n\tvar ts = $.tablesorter || {};\n\n\t$.extend(ts.css, {\n\t\tsticky    : 'tablesorter-stickyHeader', // stickyHeader\n\t\tstickyVis : 'tablesorter-sticky-visible',\n\t\tstickyHide: 'tablesorter-sticky-hidden',\n\t\tstickyWrap: 'tablesorter-sticky-wrapper'\n\t});\n\n\t// Add a resize event to table headers\n\tts.addHeaderResizeEvent = function(table, disable, settings) {\n\t\ttable = $(table)[0]; // make sure we're using a dom element\n\t\tif ( !table.config ) { return; }\n\t\tvar defaults = {\n\t\t\t\ttimer : 250\n\t\t\t},\n\t\t\toptions = $.extend({}, defaults, settings),\n\t\t\tc = table.config,\n\t\t\two = c.widgetOptions,\n\t\t\tcheckSizes = function( triggerEvent ) {\n\t\t\t\tvar index, headers, $header, sizes, width, height,\n\t\t\t\t\tlen = c.$headers.length;\n\t\t\t\two.resize_flag = true;\n\t\t\t\theaders = [];\n\t\t\t\tfor ( index = 0; index < len; index++ ) {\n\t\t\t\t\t$header = c.$headers.eq( index );\n\t\t\t\t\tsizes = $header.data( 'savedSizes' ) || [ 0, 0 ]; // fixes #394\n\t\t\t\t\twidth = $header[0].offsetWidth;\n\t\t\t\t\theight = $header[0].offsetHeight;\n\t\t\t\t\tif ( width !== sizes[0] || height !== sizes[1] ) {\n\t\t\t\t\t\t$header.data( 'savedSizes', [ width, height ] );\n\t\t\t\t\t\theaders.push( $header[0] );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tif ( headers.length && triggerEvent !== false ) {\n\t\t\t\t\tc.$table.triggerHandler( 'resize', [ headers ] );\n\t\t\t\t}\n\t\t\t\two.resize_flag = false;\n\t\t\t};\n\t\tclearInterval(wo.resize_timer);\n\t\tif (disable) {\n\t\t\two.resize_flag = false;\n\t\t\treturn false;\n\t\t}\n\t\tcheckSizes( false );\n\t\two.resize_timer = setInterval(function() {\n\t\t\tif (wo.resize_flag) { return; }\n\t\t\tcheckSizes();\n\t\t}, options.timer);\n\t};\n\n\t// Sticky headers based on this awesome article:\n\t// http://css-tricks.com/13465-persistent-headers/\n\t// and https://github.com/jmosbech/StickyTableHeaders by Jonas Mosbech\n\t// **************************\n\tts.addWidget({\n\t\tid: 'stickyHeaders',\n\t\tpriority: 60, // sticky widget must be initialized after the filter widget!\n\t\toptions: {\n\t\t\tstickyHeaders : '',       // extra class name added to the sticky header row\n\t\t\tstickyHeaders_attachTo : null, // jQuery selector or object to attach sticky header to\n\t\t\tstickyHeaders_xScroll : null, // jQuery selector or object to monitor horizontal scroll position (defaults: xScroll > attachTo > window)\n\t\t\tstickyHeaders_yScroll : null, // jQuery selector or object to monitor vertical scroll position (defaults: yScroll > attachTo > window)\n\t\t\tstickyHeaders_offset : 0, // number or jquery selector targeting the position:fixed element\n\t\t\tstickyHeaders_filteredToTop: true, // scroll table top into view after filtering\n\t\t\tstickyHeaders_cloneId : '-sticky', // added to table ID, if it exists\n\t\t\tstickyHeaders_addResizeEvent : true, // trigger 'resize' event on headers\n\t\t\tstickyHeaders_includeCaption : true, // if false and a caption exist, it won't be included in the sticky header\n\t\t\tstickyHeaders_zIndex : 2 // The zIndex of the stickyHeaders, allows the user to adjust this to their needs\n\t\t},\n\t\tformat: function(table, c, wo) {\n\t\t\t// filter widget doesn't initialize on an empty table. Fixes #449\n\t\t\tif ( c.$table.hasClass('hasStickyHeaders') || ($.inArray('filter', c.widgets) >= 0 && !c.$table.hasClass('hasFilters')) ) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tvar index, len, $t,\n\t\t\t\t$table = c.$table,\n\t\t\t\t// add position: relative to attach element, hopefully it won't cause trouble.\n\t\t\t\t$attach = $(wo.stickyHeaders_attachTo),\n\t\t\t\tnamespace = c.namespace + 'stickyheaders ',\n\t\t\t\t// element to watch for the scroll event\n\t\t\t\t$yScroll = $(wo.stickyHeaders_yScroll || wo.stickyHeaders_attachTo || window),\n\t\t\t\t$xScroll = $(wo.stickyHeaders_xScroll || wo.stickyHeaders_attachTo || window),\n\t\t\t\t$thead = $table.children('thead:first'),\n\t\t\t\t$header = $thead.children('tr').not('.sticky-false').children(),\n\t\t\t\t$tfoot = $table.children('tfoot'),\n\t\t\t\t$stickyOffset = isNaN(wo.stickyHeaders_offset) ? $(wo.stickyHeaders_offset) : '',\n\t\t\t\tstickyOffset = $stickyOffset.length ? $stickyOffset.height() || 0 : parseInt(wo.stickyHeaders_offset, 10) || 0,\n\t\t\t\t// is this table nested? If so, find parent sticky header wrapper (div, not table)\n\t\t\t\t$nestedSticky = $table.parent().closest('.' + ts.css.table).hasClass('hasStickyHeaders') ?\n\t\t\t\t\t$table.parent().closest('table.tablesorter')[0].config.widgetOptions.$sticky.parent() : [],\n\t\t\t\tnestedStickyTop = $nestedSticky.length ? $nestedSticky.height() : 0,\n\t\t\t\t// clone table, then wrap to make sticky header\n\t\t\t\t$stickyTable = wo.$sticky = $table.clone()\n\t\t\t\t\t.addClass('containsStickyHeaders ' + ts.css.sticky + ' ' + wo.stickyHeaders + ' ' + c.namespace.slice(1) + '_extra_table' )\n\t\t\t\t\t.wrap('<div class=\"' + ts.css.stickyWrap + '\">'),\n\t\t\t\t$stickyWrap = $stickyTable.parent()\n\t\t\t\t\t.addClass(ts.css.stickyHide)\n\t\t\t\t\t.css({\n\t\t\t\t\t\tposition   : $attach.length ? 'absolute' : 'fixed',\n\t\t\t\t\t\tpadding    : parseInt( $stickyTable.parent().parent().css('padding-left'), 10 ),\n\t\t\t\t\t\ttop        : stickyOffset + nestedStickyTop,\n\t\t\t\t\t\tleft       : 0,\n\t\t\t\t\t\tvisibility : 'hidden',\n\t\t\t\t\t\tzIndex     : wo.stickyHeaders_zIndex || 2\n\t\t\t\t\t}),\n\t\t\t\t$stickyThead = $stickyTable.children('thead:first'),\n\t\t\t\t$stickyCells,\n\t\t\t\tlaststate = '',\n\t\t\t\tspacing = 0,\n\t\t\t\tsetWidth = function($orig, $clone){\n\t\t\t\t\tvar index, width, border, $cell, $this,\n\t\t\t\t\t\t$cells = $orig.filter(':visible'),\n\t\t\t\t\t\tlen = $cells.length;\n\t\t\t\t\tfor ( index = 0; index < len; index++ ) {\n\t\t\t\t\t\t$cell = $clone.filter(':visible').eq(index);\n\t\t\t\t\t\t$this = $cells.eq(index);\n\t\t\t\t\t\t// code from https://github.com/jmosbech/StickyTableHeaders\n\t\t\t\t\t\tif ($this.css('box-sizing') === 'border-box') {\n\t\t\t\t\t\t\twidth = $this.outerWidth();\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tif ($cell.css('border-collapse') === 'collapse') {\n\t\t\t\t\t\t\t\tif (window.getComputedStyle) {\n\t\t\t\t\t\t\t\t\twidth = parseFloat( window.getComputedStyle($this[0], null).width );\n\t\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t\t// ie8 only\n\t\t\t\t\t\t\t\t\tborder = parseFloat( $this.css('border-width') );\n\t\t\t\t\t\t\t\t\twidth = $this.outerWidth() - parseFloat( $this.css('padding-left') ) - parseFloat( $this.css('padding-right') ) - border;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\twidth = $this.width();\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t\t$cell.css({\n\t\t\t\t\t\t\t'width': width,\n\t\t\t\t\t\t\t'min-width': width,\n\t\t\t\t\t\t\t'max-width': width\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t},\n\t\t\t\tresizeHeader = function() {\n\t\t\t\t\tstickyOffset = $stickyOffset.length ? $stickyOffset.height() || 0 : parseInt(wo.stickyHeaders_offset, 10) || 0;\n\t\t\t\t\tspacing = 0;\n\t\t\t\t\t$stickyWrap.css({\n\t\t\t\t\t\tleft : $attach.length ? parseInt($attach.css('padding-left'), 10) || 0 :\n\t\t\t\t\t\t\t\t$table.offset().left - parseInt($table.css('margin-left'), 10) - $xScroll.scrollLeft() - spacing,\n\t\t\t\t\t\twidth: $table.outerWidth()\n\t\t\t\t\t});\n\t\t\t\t\tsetWidth( $table, $stickyTable );\n\t\t\t\t\tsetWidth( $header, $stickyCells );\n\t\t\t\t},\n\t\t\t\tscrollSticky = function( resizing ) {\n\t\t\t\t\tif (!$table.is(':visible')) { return; } // fixes #278\n\t\t\t\t\t// Detect nested tables - fixes #724\n\t\t\t\t\tnestedStickyTop = $nestedSticky.length ? $nestedSticky.offset().top - $yScroll.scrollTop() + $nestedSticky.height() : 0;\n\t\t\t\t\tvar offset = $table.offset(),\n\t\t\t\t\t\tyWindow = $.isWindow( $yScroll[0] ), // $.isWindow needs jQuery 1.4.3\n\t\t\t\t\t\txWindow = $.isWindow( $xScroll[0] ),\n\t\t\t\t\t\tattachTop = $attach.length ?\n\t\t\t\t\t\t\t( yWindow ? $yScroll.scrollTop() : $yScroll.offset().top ) :\n\t\t\t\t\t\t\t$yScroll.scrollTop(),\n\t\t\t\t\t\tcaptionHeight = wo.stickyHeaders_includeCaption ? 0 : $table.children( 'caption' ).height() || 0,\n\t\t\t\t\t\tscrollTop = attachTop + stickyOffset + nestedStickyTop - captionHeight,\n\t\t\t\t\t\ttableHeight = $table.height() - ($stickyWrap.height() + ($tfoot.height() || 0)) - captionHeight,\n\t\t\t\t\t\tisVisible = ( scrollTop > offset.top ) && ( scrollTop < offset.top + tableHeight ) ? 'visible' : 'hidden',\n\t\t\t\t\t\tcssSettings = { visibility : isVisible };\n\t\t\t\t\tif ($attach.length) {\n\t\t\t\t\t\tcssSettings.top = yWindow ? scrollTop - $attach.offset().top : $attach.scrollTop();\n\t\t\t\t\t}\n\t\t\t\t\tif (xWindow) {\n\t\t\t\t\t\t// adjust when scrolling horizontally - fixes issue #143\n\t\t\t\t\t\tcssSettings.left = $table.offset().left - parseInt($table.css('margin-left'), 10) - $xScroll.scrollLeft() - spacing;\n\t\t\t\t\t}\n\t\t\t\t\tif ($nestedSticky.length) {\n\t\t\t\t\t\tcssSettings.top = ( cssSettings.top || 0 ) + stickyOffset + nestedStickyTop;\n\t\t\t\t\t}\n\t\t\t\t\t$stickyWrap\n\t\t\t\t\t\t.removeClass( ts.css.stickyVis + ' ' + ts.css.stickyHide )\n\t\t\t\t\t\t.addClass( isVisible === 'visible' ? ts.css.stickyVis : ts.css.stickyHide )\n\t\t\t\t\t\t.css(cssSettings);\n\t\t\t\t\tif (isVisible !== laststate || resizing) {\n\t\t\t\t\t\t// make sure the column widths match\n\t\t\t\t\t\tresizeHeader();\n\t\t\t\t\t\tlaststate = isVisible;\n\t\t\t\t\t}\n\t\t\t\t};\n\t\t\t// only add a position relative if a position isn't already defined\n\t\t\tif ($attach.length && !$attach.css('position')) {\n\t\t\t\t$attach.css('position', 'relative');\n\t\t\t}\n\t\t\t// fix clone ID, if it exists - fixes #271\n\t\t\tif ($stickyTable.attr('id')) { $stickyTable[0].id += wo.stickyHeaders_cloneId; }\n\t\t\t// clear out cloned table, except for sticky header\n\t\t\t// include caption & filter row (fixes #126 & #249) - don't remove cells to get correct cell indexing\n\t\t\t$stickyTable.find('thead:gt(0), tr.sticky-false').hide();\n\t\t\t$stickyTable.find('tbody, tfoot').remove();\n\t\t\t$stickyTable.find('caption').toggle(wo.stickyHeaders_includeCaption);\n\t\t\t// issue #172 - find td/th in sticky header\n\t\t\t$stickyCells = $stickyThead.children().children();\n\t\t\t$stickyTable.css({ height:0, width:0, margin: 0 });\n\t\t\t// remove resizable block\n\t\t\t$stickyCells.find('.' + ts.css.resizer).remove();\n\t\t\t// update sticky header class names to match real header after sorting\n\t\t\t$table\n\t\t\t\t.addClass('hasStickyHeaders')\n\t\t\t\t.bind('pagerComplete' + namespace, function() {\n\t\t\t\t\tresizeHeader();\n\t\t\t\t});\n\n\t\t\tts.bindEvents(table, $stickyThead.children().children('.' + ts.css.header));\n\n\t\t\t// add stickyheaders AFTER the table. If the table is selected by ID, the original one (first) will be returned.\n\t\t\t$table.after( $stickyWrap );\n\n\t\t\t// onRenderHeader is defined, we need to do something about it (fixes #641)\n\t\t\tif (c.onRenderHeader) {\n\t\t\t\t$t = $stickyThead.children('tr').children();\n\t\t\t\tlen = $t.length;\n\t\t\t\tfor ( index = 0; index < len; index++ ) {\n\t\t\t\t\t// send second parameter\n\t\t\t\t\tc.onRenderHeader.apply( $t.eq( index ), [ index, c, $stickyTable ] );\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// make it sticky!\n\t\t\t$xScroll.add($yScroll)\n\t\t\t\t.unbind( ('scroll resize '.split(' ').join( namespace )).replace(/\\s+/g, ' ') )\n\t\t\t\t.bind('scroll resize '.split(' ').join( namespace ), function( event ) {\n\t\t\t\t\tscrollSticky( event.type === 'resize' );\n\t\t\t\t});\n\t\t\tc.$table\n\t\t\t\t.unbind('stickyHeadersUpdate' + namespace)\n\t\t\t\t.bind('stickyHeadersUpdate' + namespace, function(){\n\t\t\t\t\tscrollSticky( true );\n\t\t\t\t});\n\n\t\t\tif (wo.stickyHeaders_addResizeEvent) {\n\t\t\t\tts.addHeaderResizeEvent(table);\n\t\t\t}\n\n\t\t\t// look for filter widget\n\t\t\tif ($table.hasClass('hasFilters') && wo.filter_columnFilters) {\n\t\t\t\t// scroll table into view after filtering, if sticky header is active - #482\n\t\t\t\t$table.bind('filterEnd' + namespace, function() {\n\t\t\t\t\t// $(':focus') needs jQuery 1.6+\n\t\t\t\t\tvar $td = $(document.activeElement).closest('td'),\n\t\t\t\t\t\tcolumn = $td.parent().children().index($td);\n\t\t\t\t\t// only scroll if sticky header is active\n\t\t\t\t\tif ($stickyWrap.hasClass(ts.css.stickyVis) && wo.stickyHeaders_filteredToTop) {\n\t\t\t\t\t\t// scroll to original table (not sticky clone)\n\t\t\t\t\t\twindow.scrollTo(0, $table.position().top);\n\t\t\t\t\t\t// give same input/select focus; check if c.$filters exists; fixes #594\n\t\t\t\t\t\tif (column >= 0 && c.$filters) {\n\t\t\t\t\t\t\tc.$filters.eq(column).find('a, select, input').filter(':visible').focus();\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t\tts.filter.bindSearch( $table, $stickyCells.find('.' + ts.css.filter) );\n\t\t\t\t// support hideFilters\n\t\t\t\tif (wo.filter_hideFilters) {\n\t\t\t\t\tts.filter.hideFilters(c, $stickyTable);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// resize table (Firefox)\n\t\t\tif (wo.stickyHeaders_addResizeEvent) {\n\t\t\t\t$table.bind('resize' + c.namespace + 'stickyheaders', function() {\n\t\t\t\t\tresizeHeader();\n\t\t\t\t});\n\t\t\t}\n\n\t\t\t$table.triggerHandler('stickyHeadersInit');\n\n\t\t},\n\t\tremove: function(table, c, wo) {\n\t\t\tvar namespace = c.namespace + 'stickyheaders ';\n\t\t\tc.$table\n\t\t\t\t.removeClass('hasStickyHeaders')\n\t\t\t\t.unbind( ('pagerComplete resize filterEnd stickyHeadersUpdate '.split(' ').join(namespace)).replace(/\\s+/g, ' ') )\n\t\t\t\t.next('.' + ts.css.stickyWrap).remove();\n\t\t\tif (wo.$sticky && wo.$sticky.length) { wo.$sticky.remove(); } // remove cloned table\n\t\t\t$(window)\n\t\t\t\t.add(wo.stickyHeaders_xScroll)\n\t\t\t\t.add(wo.stickyHeaders_yScroll)\n\t\t\t\t.add(wo.stickyHeaders_attachTo)\n\t\t\t\t.unbind( ('scroll resize '.split(' ').join(namespace)).replace(/\\s+/g, ' ') );\n\t\t\tts.addHeaderResizeEvent(table, true);\n\t\t}\n\t});\n\n})(jQuery, window);\n\n/*! Widget: resizable - updated 6/28/2016 (v2.26.5) */\n/*jshint browser:true, jquery:true, unused:false */\n;(function ($, window) {\n\t'use strict';\n\tvar ts = $.tablesorter || {};\n\n\t$.extend(ts.css, {\n\t\tresizableContainer : 'tablesorter-resizable-container',\n\t\tresizableHandle    : 'tablesorter-resizable-handle',\n\t\tresizableNoSelect  : 'tablesorter-disableSelection',\n\t\tresizableStorage   : 'tablesorter-resizable'\n\t});\n\n\t// Add extra scroller css\n\t$(function(){\n\t\tvar s = '<style>' +\n\t\t\t'body.' + ts.css.resizableNoSelect + ' { -ms-user-select: none; -moz-user-select: -moz-none;' +\n\t\t\t\t'-khtml-user-select: none; -webkit-user-select: none; user-select: none; }' +\n\t\t\t'.' + ts.css.resizableContainer + ' { position: relative; height: 1px; }' +\n\t\t\t// make handle z-index > than stickyHeader z-index, so the handle stays above sticky header\n\t\t\t'.' + ts.css.resizableHandle + ' { position: absolute; display: inline-block; width: 8px;' +\n\t\t\t\t'top: 1px; cursor: ew-resize; z-index: 3; user-select: none; -moz-user-select: none; }' +\n\t\t\t'</style>';\n\t\t$(s).appendTo('body');\n\t});\n\n\tts.resizable = {\n\t\tinit : function( c, wo ) {\n\t\t\tif ( c.$table.hasClass( 'hasResizable' ) ) { return; }\n\t\t\tc.$table.addClass( 'hasResizable' );\n\n\t\t\tvar noResize, $header, column, storedSizes, tmp,\n\t\t\t\t$table = c.$table,\n\t\t\t\t$parent = $table.parent(),\n\t\t\t\tmarginTop = parseInt( $table.css( 'margin-top' ), 10 ),\n\n\t\t\t// internal variables\n\t\t\tvars = wo.resizable_vars = {\n\t\t\t\tuseStorage : ts.storage && wo.resizable !== false,\n\t\t\t\t$wrap : $parent,\n\t\t\t\tmouseXPosition : 0,\n\t\t\t\t$target : null,\n\t\t\t\t$next : null,\n\t\t\t\toverflow : $parent.css('overflow') === 'auto' ||\n\t\t\t\t\t$parent.css('overflow') === 'scroll' ||\n\t\t\t\t\t$parent.css('overflow-x') === 'auto' ||\n\t\t\t\t\t$parent.css('overflow-x') === 'scroll',\n\t\t\t\tstoredSizes : []\n\t\t\t};\n\n\t\t\t// set default widths\n\t\t\tts.resizableReset( c.table, true );\n\n\t\t\t// now get measurements!\n\t\t\tvars.tableWidth = $table.width();\n\t\t\t// attempt to autodetect\n\t\t\tvars.fullWidth = Math.abs( $parent.width() - vars.tableWidth ) < 20;\n\n\t\t\t/*\n\t\t\t// Hacky method to determine if table width is set to 'auto'\n\t\t\t// http://stackoverflow.com/a/20892048/145346\n\t\t\tif ( !vars.fullWidth ) {\n\t\t\t\ttmp = $table.width();\n\t\t\t\t$header = $table.wrap('<span>').parent(); // temp variable\n\t\t\t\tstoredSizes = parseInt( $table.css( 'margin-left' ), 10 ) || 0;\n\t\t\t\t$table.css( 'margin-left', storedSizes + 50 );\n\t\t\t\tvars.tableWidth = $header.width() > tmp ? 'auto' : tmp;\n\t\t\t\t$table.css( 'margin-left', storedSizes ? storedSizes : '' );\n\t\t\t\t$header = null;\n\t\t\t\t$table.unwrap('<span>');\n\t\t\t}\n\t\t\t*/\n\n\t\t\tif ( vars.useStorage && vars.overflow ) {\n\t\t\t\t// save table width\n\t\t\t\tts.storage( c.table, 'tablesorter-table-original-css-width', vars.tableWidth );\n\t\t\t\ttmp = ts.storage( c.table, 'tablesorter-table-resized-width' ) || 'auto';\n\t\t\t\tts.resizable.setWidth( $table, tmp, true );\n\t\t\t}\n\t\t\two.resizable_vars.storedSizes = storedSizes = ( vars.useStorage ?\n\t\t\t\tts.storage( c.table, ts.css.resizableStorage ) :\n\t\t\t\t[] ) || [];\n\t\t\tts.resizable.setWidths( c, wo, storedSizes );\n\t\t\tts.resizable.updateStoredSizes( c, wo );\n\n\t\t\two.$resizable_container = $( '<div class=\"' + ts.css.resizableContainer + '\">' )\n\t\t\t\t.css({ top : marginTop })\n\t\t\t\t.insertBefore( $table );\n\t\t\t// add container\n\t\t\tfor ( column = 0; column < c.columns; column++ ) {\n\t\t\t\t$header = c.$headerIndexed[ column ];\n\t\t\t\ttmp = ts.getColumnData( c.table, c.headers, column );\n\t\t\t\tnoResize = ts.getData( $header, tmp, 'resizable' ) === 'false';\n\t\t\t\tif ( !noResize ) {\n\t\t\t\t\t$( '<div class=\"' + ts.css.resizableHandle + '\">' )\n\t\t\t\t\t\t.appendTo( wo.$resizable_container )\n\t\t\t\t\t\t.attr({\n\t\t\t\t\t\t\t'data-column' : column,\n\t\t\t\t\t\t\t'unselectable' : 'on'\n\t\t\t\t\t\t})\n\t\t\t\t\t\t.data( 'header', $header )\n\t\t\t\t\t\t.bind( 'selectstart', false );\n\t\t\t\t}\n\t\t\t}\n\t\t\tts.resizable.bindings( c, wo );\n\t\t},\n\n\t\tupdateStoredSizes : function( c, wo ) {\n\t\t\tvar column, $header,\n\t\t\t\tlen = c.columns,\n\t\t\t\tvars = wo.resizable_vars;\n\t\t\tvars.storedSizes = [];\n\t\t\tfor ( column = 0; column < len; column++ ) {\n\t\t\t\t$header = c.$headerIndexed[ column ];\n\t\t\t\tvars.storedSizes[ column ] = $header.is(':visible') ? $header.width() : 0;\n\t\t\t}\n\t\t},\n\n\t\tsetWidth : function( $el, width, overflow ) {\n\t\t\t// overflow tables need min & max width set as well\n\t\t\t$el.css({\n\t\t\t\t'width' : width,\n\t\t\t\t'min-width' : overflow ? width : '',\n\t\t\t\t'max-width' : overflow ? width : ''\n\t\t\t});\n\t\t},\n\n\t\tsetWidths : function( c, wo, storedSizes ) {\n\t\t\tvar column, $temp,\n\t\t\t\tvars = wo.resizable_vars,\n\t\t\t\t$extra = $( c.namespace + '_extra_headers' ),\n\t\t\t\t$col = c.$table.children( 'colgroup' ).children( 'col' );\n\t\t\tstoredSizes = storedSizes || vars.storedSizes || [];\n\t\t\t// process only if table ID or url match\n\t\t\tif ( storedSizes.length ) {\n\t\t\t\tfor ( column = 0; column < c.columns; column++ ) {\n\t\t\t\t\t// set saved resizable widths\n\t\t\t\t\tts.resizable.setWidth( c.$headerIndexed[ column ], storedSizes[ column ], vars.overflow );\n\t\t\t\t\tif ( $extra.length ) {\n\t\t\t\t\t\t// stickyHeaders needs to modify min & max width as well\n\t\t\t\t\t\t$temp = $extra.eq( column ).add( $col.eq( column ) );\n\t\t\t\t\t\tts.resizable.setWidth( $temp, storedSizes[ column ], vars.overflow );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\t$temp = $( c.namespace + '_extra_table' );\n\t\t\t\tif ( $temp.length && !ts.hasWidget( c.table, 'scroller' ) ) {\n\t\t\t\t\tts.resizable.setWidth( $temp, c.$table.outerWidth(), vars.overflow );\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\n\t\tsetHandlePosition : function( c, wo ) {\n\t\t\tvar startPosition,\n\t\t\t\ttableHeight = c.$table.height(),\n\t\t\t\t$handles = wo.$resizable_container.children(),\n\t\t\t\thandleCenter = Math.floor( $handles.width() / 2 );\n\n\t\t\tif ( ts.hasWidget( c.table, 'scroller' ) ) {\n\t\t\t\ttableHeight = 0;\n\t\t\t\tc.$table.closest( '.' + ts.css.scrollerWrap ).children().each(function(){\n\t\t\t\t\tvar $this = $(this);\n\t\t\t\t\t// center table has a max-height set\n\t\t\t\t\ttableHeight += $this.filter('[style*=\"height\"]').length ? $this.height() : $this.children('table').height();\n\t\t\t\t});\n\t\t\t}\n\t\t\t// subtract out table left position from resizable handles. Fixes #864\n\t\t\tstartPosition = c.$table.position().left;\n\t\t\t$handles.each( function() {\n\t\t\t\tvar $this = $(this),\n\t\t\t\t\tcolumn = parseInt( $this.attr( 'data-column' ), 10 ),\n\t\t\t\t\tcolumns = c.columns - 1,\n\t\t\t\t\t$header = $this.data( 'header' );\n\t\t\t\tif ( !$header ) { return; } // see #859\n\t\t\t\tif ( !$header.is(':visible') ) {\n\t\t\t\t\t$this.hide();\n\t\t\t\t} else if ( column < columns || column === columns && wo.resizable_addLastColumn ) {\n\t\t\t\t\t$this.css({\n\t\t\t\t\t\tdisplay: 'inline-block',\n\t\t\t\t\t\theight : tableHeight,\n\t\t\t\t\t\tleft : $header.position().left - startPosition + $header.outerWidth() - handleCenter\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t});\n\t\t},\n\n\t\t// prevent text selection while dragging resize bar\n\t\ttoggleTextSelection : function( c, wo, toggle ) {\n\t\t\tvar namespace = c.namespace + 'tsresize';\n\t\t\two.resizable_vars.disabled = toggle;\n\t\t\t$( 'body' ).toggleClass( ts.css.resizableNoSelect, toggle );\n\t\t\tif ( toggle ) {\n\t\t\t\t$( 'body' )\n\t\t\t\t\t.attr( 'unselectable', 'on' )\n\t\t\t\t\t.bind( 'selectstart' + namespace, false );\n\t\t\t} else {\n\t\t\t\t$( 'body' )\n\t\t\t\t\t.removeAttr( 'unselectable' )\n\t\t\t\t\t.unbind( 'selectstart' + namespace );\n\t\t\t}\n\t\t},\n\n\t\tbindings : function( c, wo ) {\n\t\t\tvar namespace = c.namespace + 'tsresize';\n\t\t\two.$resizable_container.children().bind( 'mousedown', function( event ) {\n\t\t\t\t// save header cell and mouse position\n\t\t\t\tvar column,\n\t\t\t\t\tvars = wo.resizable_vars,\n\t\t\t\t\t$extras = $( c.namespace + '_extra_headers' ),\n\t\t\t\t\t$header = $( event.target ).data( 'header' );\n\n\t\t\t\tcolumn = parseInt( $header.attr( 'data-column' ), 10 );\n\t\t\t\tvars.$target = $header = $header.add( $extras.filter('[data-column=\"' + column + '\"]') );\n\t\t\t\tvars.target = column;\n\n\t\t\t\t// if table is not as wide as it's parent, then resize the table\n\t\t\t\tvars.$next = event.shiftKey || wo.resizable_targetLast ?\n\t\t\t\t\t$header.parent().children().not( '.resizable-false' ).filter( ':last' ) :\n\t\t\t\t\t$header.nextAll( ':not(.resizable-false)' ).eq( 0 );\n\n\t\t\t\tcolumn = parseInt( vars.$next.attr( 'data-column' ), 10 );\n\t\t\t\tvars.$next = vars.$next.add( $extras.filter('[data-column=\"' + column + '\"]') );\n\t\t\t\tvars.next = column;\n\n\t\t\t\tvars.mouseXPosition = event.pageX;\n\t\t\t\tts.resizable.updateStoredSizes( c, wo );\n\t\t\t\tts.resizable.toggleTextSelection(c, wo, true );\n\t\t\t});\n\n\t\t\t$( document )\n\t\t\t\t.bind( 'mousemove' + namespace, function( event ) {\n\t\t\t\t\tvar vars = wo.resizable_vars;\n\t\t\t\t\t// ignore mousemove if no mousedown\n\t\t\t\t\tif ( !vars.disabled || vars.mouseXPosition === 0 || !vars.$target ) { return; }\n\t\t\t\t\tif ( wo.resizable_throttle ) {\n\t\t\t\t\t\tclearTimeout( vars.timer );\n\t\t\t\t\t\tvars.timer = setTimeout( function() {\n\t\t\t\t\t\t\tts.resizable.mouseMove( c, wo, event );\n\t\t\t\t\t\t}, isNaN( wo.resizable_throttle ) ? 5 : wo.resizable_throttle );\n\t\t\t\t\t} else {\n\t\t\t\t\t\tts.resizable.mouseMove( c, wo, event );\n\t\t\t\t\t}\n\t\t\t\t})\n\t\t\t\t.bind( 'mouseup' + namespace, function() {\n\t\t\t\t\tif (!wo.resizable_vars.disabled) { return; }\n\t\t\t\t\tts.resizable.toggleTextSelection( c, wo, false );\n\t\t\t\t\tts.resizable.stopResize( c, wo );\n\t\t\t\t\tts.resizable.setHandlePosition( c, wo );\n\t\t\t\t});\n\n\t\t\t// resizeEnd event triggered by scroller widget\n\t\t\t$( window ).bind( 'resize' + namespace + ' resizeEnd' + namespace, function() {\n\t\t\t\tts.resizable.setHandlePosition( c, wo );\n\t\t\t});\n\n\t\t\t// right click to reset columns to default widths\n\t\t\tc.$table\n\t\t\t\t.bind( 'columnUpdate' + namespace + ' pagerComplete' + namespace, function() {\n\t\t\t\t\tts.resizable.setHandlePosition( c, wo );\n\t\t\t\t})\n\t\t\t\t.find( 'thead:first' )\n\t\t\t\t.add( $( c.namespace + '_extra_table' ).find( 'thead:first' ) )\n\t\t\t\t.bind( 'contextmenu' + namespace, function() {\n\t\t\t\t\t// $.isEmptyObject() needs jQuery 1.4+; allow right click if already reset\n\t\t\t\t\tvar allowClick = wo.resizable_vars.storedSizes.length === 0;\n\t\t\t\t\tts.resizableReset( c.table );\n\t\t\t\t\tts.resizable.setHandlePosition( c, wo );\n\t\t\t\t\two.resizable_vars.storedSizes = [];\n\t\t\t\t\treturn allowClick;\n\t\t\t\t});\n\n\t\t},\n\n\t\tmouseMove : function( c, wo, event ) {\n\t\t\tif ( wo.resizable_vars.mouseXPosition === 0 || !wo.resizable_vars.$target ) { return; }\n\t\t\t// resize columns\n\t\t\tvar column,\n\t\t\t\ttotal = 0,\n\t\t\t\tvars = wo.resizable_vars,\n\t\t\t\t$next = vars.$next,\n\t\t\t\ttar = vars.storedSizes[ vars.target ],\n\t\t\t\tleftEdge = event.pageX - vars.mouseXPosition;\n\t\t\tif ( vars.overflow ) {\n\t\t\t\tif ( tar + leftEdge > 0 ) {\n\t\t\t\t\tvars.storedSizes[ vars.target ] += leftEdge;\n\t\t\t\t\tts.resizable.setWidth( vars.$target, vars.storedSizes[ vars.target ], true );\n\t\t\t\t\t// update the entire table width\n\t\t\t\t\tfor ( column = 0; column < c.columns; column++ ) {\n\t\t\t\t\t\ttotal += vars.storedSizes[ column ];\n\t\t\t\t\t}\n\t\t\t\t\tts.resizable.setWidth( c.$table.add( $( c.namespace + '_extra_table' ) ), total );\n\t\t\t\t}\n\t\t\t\tif ( !$next.length ) {\n\t\t\t\t\t// if expanding right-most column, scroll the wrapper\n\t\t\t\t\tvars.$wrap[0].scrollLeft = c.$table.width();\n\t\t\t\t}\n\t\t\t} else if ( vars.fullWidth ) {\n\t\t\t\tvars.storedSizes[ vars.target ] += leftEdge;\n\t\t\t\tvars.storedSizes[ vars.next ] -= leftEdge;\n\t\t\t\tts.resizable.setWidths( c, wo );\n\t\t\t} else {\n\t\t\t\tvars.storedSizes[ vars.target ] += leftEdge;\n\t\t\t\tts.resizable.setWidths( c, wo );\n\t\t\t}\n\t\t\tvars.mouseXPosition = event.pageX;\n\t\t\t// dynamically update sticky header widths\n\t\t\tc.$table.triggerHandler('stickyHeadersUpdate');\n\t\t},\n\n\t\tstopResize : function( c, wo ) {\n\t\t\tvar vars = wo.resizable_vars;\n\t\t\tts.resizable.updateStoredSizes( c, wo );\n\t\t\tif ( vars.useStorage ) {\n\t\t\t\t// save all column widths\n\t\t\t\tts.storage( c.table, ts.css.resizableStorage, vars.storedSizes );\n\t\t\t\tts.storage( c.table, 'tablesorter-table-resized-width', c.$table.width() );\n\t\t\t}\n\t\t\tvars.mouseXPosition = 0;\n\t\t\tvars.$target = vars.$next = null;\n\t\t\t// will update stickyHeaders, just in case, see #912\n\t\t\tc.$table.triggerHandler('stickyHeadersUpdate');\n\t\t}\n\t};\n\n\t// this widget saves the column widths if\n\t// $.tablesorter.storage function is included\n\t// **************************\n\tts.addWidget({\n\t\tid: 'resizable',\n\t\tpriority: 40,\n\t\toptions: {\n\t\t\tresizable : true, // save column widths to storage\n\t\t\tresizable_addLastColumn : false,\n\t\t\tresizable_widths : [],\n\t\t\tresizable_throttle : false, // set to true (5ms) or any number 0-10 range\n\t\t\tresizable_targetLast : false,\n\t\t\tresizable_fullWidth : null\n\t\t},\n\t\tinit: function(table, thisWidget, c, wo) {\n\t\t\tts.resizable.init( c, wo );\n\t\t},\n\t\tformat: function( table, c, wo ) {\n\t\t\tts.resizable.setHandlePosition( c, wo );\n\t\t},\n\t\tremove: function( table, c, wo, refreshing ) {\n\t\t\tif (wo.$resizable_container) {\n\t\t\t\tvar namespace = c.namespace + 'tsresize';\n\t\t\t\tc.$table.add( $( c.namespace + '_extra_table' ) )\n\t\t\t\t\t.removeClass('hasResizable')\n\t\t\t\t\t.children( 'thead' )\n\t\t\t\t\t.unbind( 'contextmenu' + namespace );\n\n\t\t\t\two.$resizable_container.remove();\n\t\t\t\tts.resizable.toggleTextSelection( c, wo, false );\n\t\t\t\tts.resizableReset( table, refreshing );\n\t\t\t\t$( document ).unbind( 'mousemove' + namespace + ' mouseup' + namespace );\n\t\t\t}\n\t\t}\n\t});\n\n\tts.resizableReset = function( table, refreshing ) {\n\t\t$( table ).each(function(){\n\t\t\tvar index, $t,\n\t\t\t\tc = this.config,\n\t\t\t\two = c && c.widgetOptions,\n\t\t\t\tvars = wo.resizable_vars;\n\t\t\tif ( table && c && c.$headerIndexed.length ) {\n\t\t\t\t// restore the initial table width\n\t\t\t\tif ( vars.overflow && vars.tableWidth ) {\n\t\t\t\t\tts.resizable.setWidth( c.$table, vars.tableWidth, true );\n\t\t\t\t\tif ( vars.useStorage ) {\n\t\t\t\t\t\tts.storage( table, 'tablesorter-table-resized-width', 'auto' );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tfor ( index = 0; index < c.columns; index++ ) {\n\t\t\t\t\t$t = c.$headerIndexed[ index ];\n\t\t\t\t\tif ( wo.resizable_widths && wo.resizable_widths[ index ] ) {\n\t\t\t\t\t\tts.resizable.setWidth( $t, wo.resizable_widths[ index ], vars.overflow );\n\t\t\t\t\t} else if ( !$t.hasClass( 'resizable-false' ) ) {\n\t\t\t\t\t\t// don't clear the width of any column that is not resizable\n\t\t\t\t\t\tts.resizable.setWidth( $t, '', vars.overflow );\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t// reset stickyHeader widths\n\t\t\t\tc.$table.triggerHandler( 'stickyHeadersUpdate' );\n\t\t\t\tif ( ts.storage && !refreshing ) {\n\t\t\t\t\tts.storage( this, ts.css.resizableStorage, {} );\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t};\n\n})( jQuery, window );\n\n/*! Widget: saveSort - updated 10/31/2015 (v2.24.0) *//*\n* Requires tablesorter v2.16+\n* by Rob Garrison\n*/\n;(function ($) {\n\t'use strict';\n\tvar ts = $.tablesorter || {};\n\n\t// this widget saves the last sort only if the\n\t// saveSort widget option is true AND the\n\t// $.tablesorter.storage function is included\n\t// **************************\n\tts.addWidget({\n\t\tid: 'saveSort',\n\t\tpriority: 20,\n\t\toptions: {\n\t\t\tsaveSort : true\n\t\t},\n\t\tinit: function(table, thisWidget, c, wo) {\n\t\t\t// run widget format before all other widgets are applied to the table\n\t\t\tthisWidget.format(table, c, wo, true);\n\t\t},\n\t\tformat: function(table, c, wo, init) {\n\t\t\tvar stored, time,\n\t\t\t\t$table = c.$table,\n\t\t\t\tsaveSort = wo.saveSort !== false, // make saveSort active/inactive; default to true\n\t\t\t\tsortList = { 'sortList' : c.sortList };\n\t\t\tif (c.debug) {\n\t\t\t\ttime = new Date();\n\t\t\t}\n\t\t\tif ($table.hasClass('hasSaveSort')) {\n\t\t\t\tif (saveSort && table.hasInitialized && ts.storage) {\n\t\t\t\t\tts.storage( table, 'tablesorter-savesort', sortList );\n\t\t\t\t\tif (c.debug) {\n\t\t\t\t\t\tconsole.log('saveSort widget: Saving last sort: ' + c.sortList + ts.benchmark(time));\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\t// set table sort on initial run of the widget\n\t\t\t\t$table.addClass('hasSaveSort');\n\t\t\t\tsortList = '';\n\t\t\t\t// get data\n\t\t\t\tif (ts.storage) {\n\t\t\t\t\tstored = ts.storage( table, 'tablesorter-savesort' );\n\t\t\t\t\tsortList = (stored && stored.hasOwnProperty('sortList') && $.isArray(stored.sortList)) ? stored.sortList : '';\n\t\t\t\t\tif (c.debug) {\n\t\t\t\t\t\tconsole.log('saveSort: Last sort loaded: \"' + sortList + '\"' + ts.benchmark(time));\n\t\t\t\t\t}\n\t\t\t\t\t$table.bind('saveSortReset', function(event) {\n\t\t\t\t\t\tevent.stopPropagation();\n\t\t\t\t\t\tts.storage( table, 'tablesorter-savesort', '' );\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t\t// init is true when widget init is run, this will run this widget before all other widgets have initialized\n\t\t\t\t// this method allows using this widget in the original tablesorter plugin; but then it will run all widgets twice.\n\t\t\t\tif (init && sortList && sortList.length > 0) {\n\t\t\t\t\tc.sortList = sortList;\n\t\t\t\t} else if (table.hasInitialized && sortList && sortList.length > 0) {\n\t\t\t\t\t// update sort change\n\t\t\t\t\tts.sortOn( c, sortList );\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\t\tremove: function(table, c) {\n\t\t\tc.$table.removeClass('hasSaveSort');\n\t\t\t// clear storage\n\t\t\tif (ts.storage) { ts.storage( table, 'tablesorter-savesort', '' ); }\n\t\t}\n\t});\n\n})(jQuery);\n\nreturn $.tablesorter;\n}));\n\n},{\"jquery\":1}],4:[function(require,module,exports){\nvar Analyzer;\n\nmodule.exports = Analyzer = class Analyzer {\n  constructor() {}\n\n  analyze(net) {\n    var aspect_ratios, d, dilation, dim_in, failed, feature_map, group, has_bias, i, infered_dim, isglobal, j, k, kernel, kernel_h, kernel_w, key, l, layertype, len, len1, len2, len3, mem, mode, module, n, n_elements, newshape, num_inputs, num_ops, num_priors, num_region_proposals, numout, op, ops, p, pad_h, pad_w, params, parent, parent2, permutation, pooltype, power, prod_in_dims, prod_out_dims, ref, ref1, ref10, ref11, ref12, ref13, ref14, ref15, ref16, ref17, ref18, ref19, ref2, ref20, ref21, ref22, ref23, ref24, ref25, ref26, ref27, ref28, ref29, ref3, ref30, ref31, ref32, ref33, ref34, ref35, ref36, ref37, ref38, ref39, ref4, ref40, ref41, ref42, ref43, ref44, ref45, ref46, ref47, ref48, ref49, ref5, ref50, ref51, ref52, ref53, ref54, ref55, ref56, ref6, ref7, ref8, ref9, roi_proposals, scale, settings, shape, shift, size, stride_h, stride_w, summary, trivial_layers, val;\n    ref = net.sortTopologically();\n    //# Add Input/Output Dimensions + Channels to each Node / Layer\n    // shape.dim: (    N   x   K   x   W   x   H   )\n    //              batch   channel  width   height\n    //               chIn    chOut   wIn     wOut\n    for (i = 0, len = ref.length; i < len; i++) {\n      n = ref[i];\n      layertype = n.type.toLowerCase();\n      // Setup Default Values for Analysis\n      d = n.analysis;\n      d.wIn = d.hIn = d.wOut = d.hOut = d.chIn = d.chOut = 0;\n      d.comp = {\n        macc: 0,\n        comp: 0,\n        add: 0,\n        div: 0,\n        exp: 0\n      };\n      d.mem = {\n        activation: 0,\n        param: 0\n      };\n      d.variants = [];\n      parent = (ref1 = n.parents[0]) != null ? ref1.analysis : void 0;\n      // Setup default channels + dimensions: inherited from parent\n      d.batchOut = d.batchIn = parent != null ? parent.batchOut : void 0;\n      d.wIn = parent != null ? parent.wOut : void 0;\n      d.hIn = parent != null ? parent.hOut : void 0;\n      d.chIn = parent != null ? parent.chOut : void 0;\n      switch (layertype) {\n        case \"data\":\n        case \"input\":\n          //dimensions\n          if (((ref2 = n.attribs.input_param) != null ? ref2.shape : void 0) != null) {\n            shape = n.attribs.input_param.shape;\n            d.batchIn = shape.dim[0];\n            d.chIn = shape.dim[1];\n            d.hIn = shape.dim[2];\n            d.wIn = shape.dim[3];\n          } else if (((ref3 = n.attribs.transform_param) != null ? ref3.crop_size : void 0) != null) {\n            d.wIn = d.hIn = n.attribs.transform_param.crop_size;\n            d.chIn = 3; // assume RGB\n            d.batchOut = 1;\n          } else {\n            onerror('Unknown Input Dimensions');\n            debugger;\n          }\n          d.wOut = d.wIn;\n          d.hOut = d.hIn;\n          d.chOut = d.chIn;\n          d.batchOut = d.batchIn;\n          //computation\n          //-- none\n          //memory\n          //-- none\n          d.mem.activation = d.wOut * d.hOut * d.chOut * d.batchOut;\n          break;\n        case \"convolution\":\n          //dimensions\n          params = n.attribs.convolution_param;\n          kernel_w = (ref4 = params.kernel_w) != null ? ref4 : params.kernel_size;\n          kernel_h = (ref5 = params.kernel_h) != null ? ref5 : params.kernel_size;\n          stride_w = (ref6 = params.stride_w) != null ? ref6 : (ref7 = params.stride) != null ? ref7 : 1;\n          stride_h = (ref8 = params.stride_h) != null ? ref8 : (ref9 = params.stride) != null ? ref9 : 1;\n          pad_w = (ref10 = params.pad_w) != null ? ref10 : (ref11 = params.pad) != null ? ref11 : 0;\n          pad_h = (ref12 = params.pad_h) != null ? ref12 : (ref13 = params.pad) != null ? ref13 : 0;\n          numout = params.num_output;\n          group = (ref14 = params.group) != null ? ref14 : 1;\n          dilation = (ref15 = params.dilation) != null ? ref15 : 1;\n          has_bias = ((ref16 = params.bias_term) != null ? ref16 : \"true\") === \"false\" ? 0 : 1;\n          // according to http://caffe.berkeleyvision.org/tutorial/layers.html and https://github.com/BVLC/caffe/issues/3656\n          kernel = dilation * (kernel_w - 1) + 1;\n          d.wOut = Math.floor((d.wIn + 2 * pad_w - kernel) / stride_w) + 1;\n          kernel = dilation * (kernel_h - 1) + 1;\n          d.hOut = Math.floor((d.hIn + 2 * pad_h - kernel) / stride_h) + 1;\n          d.chOut = numout;\n          //computation\n          d.comp.macc = (kernel_w * kernel_h) * (d.wOut * d.hOut) * d.chIn * d.chOut * d.batchOut / group;\n          //memory\n          d.mem.param = (kernel_w * kernel_h) * d.chIn * d.chOut / group + has_bias * d.chOut;\n          d.mem.activation = (d.wOut * d.hOut) * d.chOut * d.batchOut;\n          // CACHE AND BANDWIDTH for Implementation Variants\n          if (do_variants_analysis) {\n            d.variants.push({\n              name: \"complete outputs, input cache\",\n              cache: d.chIn * kernel_h * d.wIn + d.chIn * kernel_h * kernel_w, // line buffers // param cache\n              readBW: d.chOut * d.chIn * (d.wIn * d.hIn),\n              writeBW: d.chOut * (d.wOut * d.hOut), // ideal\n              confBW: d.chOut * d.chIn * kernel_w * kernel_h // ideal\n            });\n            d.variants.push({\n              name: \"complete inputs, input cache\",\n              cache: kernel_h * d.wIn + d.chIn * kernel_h * kernel_w, // line buffers // param cache\n              readBW: d.chIn * ((d.chOut + 1) * (d.wIn * d.hIn)),\n              writeBW: d.chIn * (d.chOut * (d.wOut * d.hOut)),\n              confBW: d.chOut * d.chIn * kernel_w * kernel_h // ideal\n            });\n            d.variants.push({\n              name: \"complete inputs, input + output cache\",\n              cache: kernel_h * d.wIn + d.chIn * kernel_h * kernel_w + d.wIn * d.hIn * d.chOut, // line buffers // param cache // output cache\n              readBW: d.chIn * (d.wIn * d.hIn), // ideal\n              writeBW: d.chOut * (d.wOut * d.hOut), // ideal\n              confBW: d.chOut * d.chIn * kernel_w * kernel_h // ideal\n            });\n            d.variants.push({\n              name: \"streaming, input cache\",\n              cache: d.chIn * kernel_h * d.wIn,\n              readBW: d.chIn * (d.wIn * d.hIn),\n              writeBW: d.chOut * (d.wOut * d.hOut),\n              confBW: d.hIn * (d.chIn * d.chOut * (kernel_w * kernel_h))\n            });\n            d.variants.push({\n              name: \"streaming, input + config cache\",\n              cache: d.chIn * kernel_h * d.wIn + d.chIn * d.chOut * (kernel_h * kernel_w),\n              readBW: d.chIn * (d.wIn * d.hIn),\n              writeBW: d.chOut * (d.wOut * d.hOut),\n              confBW: d.chOut * d.chIn * kernel_w * kernel_h // ideal\n            });\n            d.variants.push({\n              name: \"streaming, temp.\",\n              img_cache: kernel_h > 1 ? d.chIn * kernel_h * d.wIn : d.chIn,\n              img_dim: d.chIn + \"ch ∙ \" + d.wIn + \" × \" + kernel_h + \" × 32b\",\n              flt_cache: d.chIn * d.chOut * (kernel_h * kernel_w),\n              squeeze_cache: n.name.indexOf(\"squeeze\") > -1 ? d.chOut * d.wOut * d.hOut : \"\"\n            });\n          }\n          break;\n        case \"innerproduct\":\n        case \"inner_product\":\n          //dimensions\n          numout = n.attribs.inner_product_param.num_output;\n          has_bias = ((ref17 = n.attribs.inner_product_param.bias_term) != null ? ref17 : \"true\") === \"false\" ? 0 : 1;\n          d.wOut = 1;\n          d.hOut = 1;\n          d.chOut = numout;\n          //computation\n          d.comp.macc = (d.wIn * d.hIn) * d.chIn * d.chOut * d.batchOut;\n          //memory\n          d.mem.param = d.wIn * d.hIn * d.chIn * d.chOut + has_bias * d.chOut;\n          d.mem.activation = d.wOut * d.hOut * d.chOut * d.batchOut;\n          break;\n        case \"pooling\":\n          //dimensions\n          params = n.attribs.pooling_param;\n          kernel_w = (ref18 = params.kernel_w) != null ? ref18 : params.kernel_size;\n          kernel_h = (ref19 = params.kernel_h) != null ? ref19 : params.kernel_size;\n          stride_w = (ref20 = params.stride_w) != null ? ref20 : (ref21 = params.stride) != null ? ref21 : 1;\n          stride_h = (ref22 = params.stride_h) != null ? ref22 : (ref23 = params.stride) != null ? ref23 : 1;\n          pad_w = (ref24 = params.pad_w) != null ? ref24 : (ref25 = params.pad) != null ? ref25 : 0;\n          pad_h = (ref26 = params.pad_h) != null ? ref26 : (ref27 = params.pad) != null ? ref27 : 0;\n          isglobal = (ref28 = params.global_pooling) != null ? ref28 : 0;\n          pooltype = ((ref29 = params.pool) != null ? ref29 : 'MAX').toUpperCase();\n          d.chOut = d.chIn;\n          // according to http://caffe.berkeleyvision.org/tutorial/layers.html and https://github.com/BVLC/caffe/issues/3656\n          d.wOut = Math.ceil((d.wIn + 2 * pad_w - kernel_w) / stride_w) + 1;\n          d.hOut = Math.ceil((d.hIn + 2 * pad_h - kernel_h) / stride_h) + 1;\n          if (isglobal) {\n            d.wOut = d.hOut = 1;\n          }\n          //computation\n          num_ops = isglobal ? (d.wIn * d.hIn) * d.chIn * d.batchOut : (d.wOut * d.hOut) * kernel_h * kernel_w * d.chOut * d.batchOut;\n          if (pooltype === 'MAX') {\n            d.comp.comp = num_ops;\n          } else if (pooltype === 'AVE') {\n            d.comp.add = num_ops;\n          } else {\n            //d.comp.div = (d.wOut*d.hOut*d.chOut) #divide by const.\n            onerror(`Unknown pooling type ${pooltype}`);\n          }\n          //memory\n          d.mem.activation = d.wOut * d.hOut * d.chOut * d.batchOut;\n          break;\n        case \"batchnorm\":\n        case \"bn\":\n          //dimensions\n          d.wOut = d.wIn;\n          d.hOut = d.hIn;\n          d.chOut = d.chIn;\n          //computation\n          // BN: subtract mean, divide by variance for each channel\n          // averages during training: over spatial dims + batch\n          d.comp.add = d.wIn * d.hIn * d.chIn * d.batchOut;\n          d.comp.div = d.wIn * d.hIn * d.chIn * d.batchOut;\n          //memory\n          d.mem.param = d.chIn * 2;\n          d.mem.activation = d.wOut * d.hOut * d.chOut * d.batchOut;\n          break;\n        case \"lrn\":\n        case \"normalize\":\n          //dimensions\n          //default mode: ACROSS_CHANNELS\n          mode = (ref30 = (ref31 = n.attribs.lrn_param) != null ? ref31.norm_region : void 0) != null ? ref30 : 'ACROSS_CHANNELS';\n          size = (ref32 = (ref33 = n.attribs.lrn_param) != null ? ref33.local_size : void 0) != null ? ref32 : 1;\n          d.wOut = d.wIn;\n          d.hOut = d.hIn;\n          d.chOut = d.chIn;\n          //computation\n          //  Each input value is divided by (1+(α/n)∑xi^2)^β\n          num_inputs = d.wIn * d.hIn * d.chIn * d.batchOut;\n          d.comp.macc = num_inputs * size; // (∑xi^2)\n          d.comp.add = num_inputs; // (1+...)\n          d.comp.exp = num_inputs; // (...)^β\n          d.comp.div = num_inputs * 2; // (α/n)*... + divide by sum\n          //memory\n          d.mem.param = 2; // alpha, beta\n          d.mem.activation = d.wOut * d.hOut * d.chOut * d.batchOut;\n          break;\n        case \"concat\":\n          //dimensions\n          d.wOut = d.wIn;\n          d.hOut = d.hIn;\n          // sum up channels from inputs\n          d.chIn = 0;\n          ref34 = n.parents;\n          for (j = 0, len1 = ref34.length; j < len1; j++) {\n            p = ref34[j];\n            d.chIn += p.analysis.chOut;\n          }\n          d.chOut = d.chIn;\n          ref35 = n.parents;\n          for (k = 0, len2 = ref35.length; k < len2; k++) {\n            p = ref35[k];\n            // check input dimensions\n            failed = failed || (p.analysis.wOut !== d.wIn || p.analysis.hOut !== d.hIn);\n          }\n          if (failed) {\n            window.onerror('CONCAT: input dimensions dont agree!');\n          }\n          //computation\n          // --none\n          //memory\n          d.mem.activation = d.wOut * d.hOut * d.chOut * d.batchOut;\n          break;\n        //relu/dropout use some memory, do some comparisons\n        case \"relu\":\n        case \"relu6\":\n        case \"elu\":\n        case \"prelu\":\n        case \"dropout\":\n          //dimensions\n          d.wIn = parent.wOut;\n          d.hIn = parent.hOut;\n          d.wOut = d.wIn;\n          d.hOut = d.hIn;\n          d.chOut = d.chIn = parent.chOut;\n          //computation\n          d.comp.comp = d.wIn * d.hIn * d.chIn * d.batchOut;\n          //memory\n          d.mem.activation = d.wOut * d.hOut * d.chOut * d.batchOut;\n          break;\n        case \"softmax\":\n        case \"softmaxwithloss\":\n        case \"softmax_loss\":\n          //dimensions\n          d.wOut = d.wIn;\n          d.hOut = d.hIn;\n          d.chOut = d.chIn;\n          //computation\n          d.comp.exp = d.wIn * d.hIn * d.chIn * d.batchOut;\n          d.comp.add = d.wIn * d.hIn * d.chIn * d.batchOut;\n          d.comp.div = d.wIn * d.hIn * d.chIn * d.batchOut;\n          //memory\n          d.mem.activation = d.wOut * d.hOut * d.chOut * d.batchOut;\n          break;\n        case \"flatten\":\n          //dimensions\n          d.wOut = d.hOut = 1;\n          d.chOut = d.chIn * d.wIn * d.hIn;\n          //computation\n          // --none\n          //memory\n          d.mem.activation = d.wOut * d.hOut * d.chOut * d.batchOut;\n          break;\n        case \"eltwise\":\n          //dimensions\n          d.wOut = d.wIn;\n          d.hOut = d.hIn;\n          d.chOut = d.chIn;\n          // check input dimensions\n          failed = false;\n          ref36 = n.parents;\n          for (l = 0, len3 = ref36.length; l < len3; l++) {\n            p = ref36[l];\n            failed = failed || (d.wIn !== p.analysis.wOut) || (d.hIn !== p.analysis.hOut);\n          }\n          if (failed) {\n            onerror('ELTWISE: input dimensions dont agree in ' + n.name);\n          }\n          //computation\n          op = (ref37 = (ref38 = n.eltwise_param) != null ? (ref39 = ref38.operation) != null ? ref39.toUpperCase() : void 0 : void 0) != null ? ref37 : 'SUM';\n          if (op === 'SUM') {\n            d.comp.add = d.wIn * d.hIn * d.chIn * d.batchOut;\n          } else if (op === 'MAX') {\n            d.comp.comp = d.wIn * d.hIn * d.chIn * d.batchOut;\n          } else if (op === 'PROD') {\n            d.comp.macc = d.wIn * d.hIn * d.chIn * d.batchOut;\n          } else {\n            onerror('ELTWISE: unknown operation ' + op);\n          }\n          //memory\n          d.mem.activation = d.wOut * d.hOut * d.chOut * d.batchOut;\n          break;\n        case \"deconvolution\":\n          //dimensions\n          params = n.attribs.convolution_param;\n          kernel_w = (ref40 = params.kernel_w) != null ? ref40 : params.kernel_size;\n          kernel_h = (ref41 = params.kernel_h) != null ? ref41 : params.kernel_size;\n          stride_w = (ref42 = params.stride_w) != null ? ref42 : (ref43 = params.stride) != null ? ref43 : 1;\n          stride_h = (ref44 = params.stride_h) != null ? ref44 : (ref45 = params.stride) != null ? ref45 : 1;\n          pad_w = (ref46 = params.pad_w) != null ? ref46 : (ref47 = params.pad) != null ? ref47 : 0;\n          pad_h = (ref48 = params.pad_h) != null ? ref48 : (ref49 = params.pad) != null ? ref49 : 0;\n          numout = params.num_output;\n          d.wOut = stride_w * (d.wIn - 1) + kernel_w - 2 * pad_w;\n          d.hOut = stride_h * (d.hIn - 1) + kernel_h - 2 * pad_h;\n          d.chOut = numout;\n          //computation\n          d.comp.macc = d.chIn * d.chOut * d.wOut * d.hOut * (kernel_w / stride_w) * (kernel_h / stride_h) * d.batchOut;\n          //memory\n          d.mem.param = kernel_w * kernel_h * d.chIn * d.chOut;\n          d.mem.activation = d.wOut * d.hOut * d.chOut * d.batchOut;\n          break;\n        case \"crop\":\n          //dimensions\n          //# crop to dims of 2nd parent\n          parent2 = n.parents[1].analysis;\n          d.wOut = parent2.wOut;\n          d.hOut = parent2.hOut;\n          d.chOut = d.chIn;\n          //computation\n          // --none\n          //memory\n          d.mem.activation = d.wOut * d.hOut * d.chOut * d.batchOut;\n          break;\n        //scale layer use activation memory and does multiplies\n        case \"scale\":\n          //dimensions\n          //# assume pass-through\n          d.wOut = d.wIn;\n          d.hOut = d.hIn;\n          d.chOut = d.chIn;\n          //computation: scale = multiplication\n          d.comp.macc = d.wOut * d.hOut * d.chOut * d.batchOut;\n          //memory\n          d.mem.activation = d.wOut * d.hOut * d.chOut * d.batchOut;\n          break;\n        //implicit layers use activation memory, but no computation\n        case \"implicit\":\n          //dimensions\n          //fix potentially undefined inputs\n          d.wIn = (ref50 = d.wIn) != null ? ref50 : \"?\";\n          d.hIn = (ref51 = d.hIn) != null ? ref51 : \"?\";\n          d.chIn = (ref52 = d.chIn) != null ? ref52 : \"?\";\n          d.batchIn = (ref53 = d.batchIn) != null ? ref53 : \"?\";\n          //# assume pass-through\n          d.wOut = d.wIn;\n          d.hOut = d.hIn;\n          d.chOut = d.chIn;\n          d.batchOut = d.batchIn;\n          //computation\n          // --none\n          //memory\n          d.mem.activation = d.wOut * d.hOut * d.chOut * d.batchOut;\n          if (isNaN(d.mem.activation)) {\n            d.mem.activation = 0;\n          }\n          break;\n        // accuracy layers just pass through\n        case \"accuracy\":\n          //dimensions\n          //# assume pass-through\n          d.wOut = d.wIn;\n          d.hOut = d.hIn;\n          d.chOut = d.chIn;\n          break;\n        //computation\n        // --none\n        //memory\n        // --none\n\n        // power layers: computes outputs y = (shift + scale * x) ^ power\n        case \"power\":\n          params = n.attribs.power_param;\n          power = (ref54 = params.power) != null ? ref54 : 1;\n          scale = (ref55 = params.scale) != null ? ref55 : 1;\n          shift = (ref56 = params.shift) != null ? ref56 : 0;\n          //dimensions: pass-through\n          d.wOut = d.wIn;\n          d.hOut = d.hIn;\n          d.chOut = d.chIn;\n          //computation\n          n_elements = d.wOut * d.hOut * d.chOut;\n          d.comp.macc = scale !== 1 ? n_elements : 0;\n          d.comp.add = shift !== 0 ? n_elements : 0;\n          d.comp.exp = power !== 1 ? n_elements : 0;\n          //memory\n          d.mem.activation = n_elements;\n          break;\n        // permute layers reorder the channels / dimensions\n        case \"permute\":\n          permutation = n.attribs.permute_param.order.slice(0); //copy array\n          //dimension order: [batch, channels, height, width] according to http://caffe.berkeleyvision.org/tutorial/layers.html\n          dim_in = [d.batchIn, d.chIn, d.hIn, d.wIn];\n          d.batchOut = dim_in[permutation[0]];\n          d.chOut = dim_in[permutation[1]];\n          d.hOut = dim_in[permutation[2]];\n          d.wOut = dim_in[permutation[3]];\n          break;\n        case \"priorbox\":\n          settings = n.attribs.prior_box_param;\n          aspect_ratios = settings.aspect_ratio;\n          num_priors = settings.min_size * settings.aspect_ratio;\n          if (settings.flip) {\n            num_priors *= 2;\n          }\n          d.batchOut = d.batchIn;\n          d.chOut = 2;\n          d.hOut = 4;\n          d.wOut = num_priors;\n          break;\n        //computation\n        // -- neglectable\n        //memory\n        // --neglectable\n\n        // reshape layers just permute dimensions, assume on-the-fly operation\n        case \"reshape\":\n          //get reshape parameters\n          newshape = n.attribs.reshape_param.shape.dim.slice(0); // copy array\n          //debugger\n          console.log(newshape);\n          if ((!newshape[0]) || (newshape[0] === 0)) {\n            newshape[0] = d.batchIn;\n          }\n          if ((!newshape[1]) || (newshape[1] === 0)) {\n            newshape[1] = d.chIn;\n          }\n          if ((!newshape[2]) || (newshape[2] === 0)) {\n            newshape[2] = d.hIn;\n          }\n          if ((!newshape[3]) || (newshape[3] === 0)) {\n            newshape[3] = d.wIn;\n          }\n          // -1 as dimension = infer from other dimensions, allowed for at most 1 dimension\n          prod_in_dims = d.batchIn * d.wIn * d.hIn * d.chIn;\n          prod_out_dims = newshape[0] * newshape[1] * newshape[2] * newshape[3] * (-1); // -1 compensates \"-1\" in newshape\n          infered_dim = prod_in_dims / prod_out_dims;\n          if (newshape[0] === -1) {\n            newshape[0] = infered_dim;\n          }\n          if (newshape[1] === -1) {\n            newshape[1] = infered_dim;\n          }\n          if (newshape[2] === -1) {\n            newshape[2] = infered_dim;\n          }\n          if (newshape[3] === -1) {\n            newshape[3] = infered_dim;\n          }\n          // assign output dimensions\n          d.batchOut = newshape[0];\n          d.chOut = newshape[1];\n          d.hOut = newshape[2];\n          d.wOut = newshape[3];\n          break;\n        //computation\n        // --none (some shifting-around only)\n        //memory\n        case \"python\":\n          module = n.attribs.python_param.module;\n          if (module === \"rpn.proposal_layer\") {\n            // ASSUME TEST.RPN_POST_NMS_TOP_N = 300\n            num_region_proposals = 300; // see RPN_POST_NMS_TOP_N in lib/fast_rcnn/config.py\n            \n            //output dimensions:\n            d.wOut = d.hOut = 1;\n            d.chOut = 5; // rectangle (x1, y1, x2, y2) (and image batch index n)\n            d.batchOut = num_region_proposals;\n            //computation\n            d.comp.div = (num_region_proposals * (num_region_proposals - 1)) / 2;\n            d.comp.macc = d.batchIn * (4 + 4) * 9 * (d.wIn * d.hIn) + 2 * d.comp.div;\n            d.comp.add = d.batchIn * (8 + 2) * 9 * (d.wIn * d.hIn) + 6 * d.comp.div;\n            d.comp.comp = d.batchIn * (4 + 2) * 9 * (d.wIn * d.hIn) + Math.pow(9 * (d.wIn * d.hIn), 2) + 7 * d.comp.div;\n            d.comp.exp = d.batchIn * 2 * 9 * (d.wIn * d.hIn);\n            //memory\n            d.mem.activation = d.wOut * d.hOut * d.chOut * d.batchOut;\n          } else {\n            onerror('Unknown Python Layer: ' + module);\n            console.log(n);\n            debugger;\n          }\n          break;\n        case \"roipooling\":\n          // 2 parent layers: region proposals, feature vectors\n          roi_proposals = (n.parents[0].analysis.batchOut > 1) ? n.parents[0].analysis : n.parents[1].analysis; // parent with batchOut > 1 = region proposals\n          feature_map = (n.parents[0].analysis.batchOut > 1) ? n.parents[1].analysis : n.parents[0].analysis; // features = the other one\n          // Input / Output dimensions\n          d.chIn = d.chOut = feature_map.chIn;\n          d.hIn = feature_map.hIn;\n          d.wIn = feature_map.wIn;\n          d.hOut = n.attribs.roi_pooling_param.pooled_h;\n          d.wOut = n.attribs.roi_pooling_param.pooled_w;\n          d.batchIn = d.batchOut = roi_proposals.batchOut;\n          //spatial_scale = n.attribs.roi_pooling_param.spatial_scale\n          //computation\n          d.comp.add = d.batchOut;\n          d.comp.div = d.batchOut;\n          d.comp.macc = d.batchOut;\n          d.comp.comp = d.batchOut * d.chIn * d.wIn * d.hIn;\n          //memory\n          d.mem.activation = d.wOut * d.hOut * d.chOut * d.batchOut; // unknown layer;  print error message;\n          break;\n        default:\n          onerror('Unknown Layer: ' + layertype);\n          console.log(n);\n          debugger;\n      }\n      trivial_layers = [\"softmax\", \"softmaxwithloss\", \"softmax_loss\", \"dropout\", \"concat\", \"accuracy\"];\n      if (!($.inArray(layertype, trivial_layers) >= 0)) {\n        summary = {\n          in: `${d.chIn}ch ⋅ ${d.wIn}×${d.hIn} (×${d.batchIn})`,\n          out: `${d.chOut}ch ⋅ ${d.wOut}×${d.hOut} (×${d.batchOut})`\n        };\n        // concat number of required operations into string\n        ops = ((function() {\n          var ref57, results;\n          ref57 = d.comp;\n          results = [];\n          for (key in ref57) {\n            val = ref57[key];\n            if (val !== 0) {\n              results.push(val + '⋅' + key);\n            }\n          }\n          return results;\n        })()).join(', ');\n        if (ops !== \"\") {\n          //debugger\n          summary.ops = ops;\n        }\n        // concat memory requirements into string\n        mem = ((function() {\n          var ref57, results;\n          ref57 = d.mem;\n          results = [];\n          for (key in ref57) {\n            val = ref57[key];\n            if (val !== 0) {\n              results.push(val + '⋅' + key);\n            }\n          }\n          return results;\n        })()).join(', ');\n        if (mem !== \"\") {\n          summary.mem = mem;\n        }\n        // attach\n        _.extend(n.attribs, {\n          analysis: summary\n        });\n      }\n    }\n    return net;\n  }\n\n};\n\n\n},{}],5:[function(require,module,exports){\nvar AppController, Editor, Renderer;\n\nRenderer = require('./renderer.coffee');\n\nEditor = require('./editor.coffee');\n\nmodule.exports = AppController = class AppController {\n  constructor() {\n    this.inProgress = false;\n    this.$spinner = $('#net-spinner');\n    this.$netBox = $('#net-container');\n    this.$netError = $('#net-error');\n    this.svg = '#net-svg';\n    this.$tableBox = $('#table-container');\n    this.table = '#table-content';\n    this.setupErrorHandler();\n  }\n\n  startLoading(loaderFunc, loader, ...args) {\n    if (this.inProgress) {\n      return;\n    }\n    this.$netError.hide();\n    this.$netBox.hide();\n    this.$tableBox.hide();\n    this.$spinner.show();\n    return loaderFunc(...args, (net) => {\n      return this.completeLoading(net, loader);\n    });\n  }\n\n  completeLoading(net, loader) {\n    var editlink, extendlink;\n    this.$spinner.hide();\n    $('#net-title').html(net.name.replace(/_/g, ' '));\n    $('title').text(net.name.replace(/_/g, ' ') + ' — Netscope CNN Analyzer');\n    editlink = $(\"<a>(edit)</a>\").addClass(\"editlink\");\n    editlink.appendTo($('#net-title'));\n    editlink.click(() => {\n      return this.showEditor(loader);\n    });\n    this.$netBox.show();\n    this.$tableBox.show();\n    $(this.svg).empty();\n    $('.qtip').remove();\n    this.renderer = new Renderer(net, this.svg, this.table);\n    if (!window.do_variants_analysis) {\n      $(\"<br>\").appendTo(this.table);\n      extendlink = $('<a>Excel-compatible Analysis Results (experimental)</a>');\n      extendlink.click(() => {\n        window.do_variants_analysis = true;\n        return this.renderer.renderTable();\n      });\n      extendlink.appendTo(this.table);\n    }\n    return this.inProgress = false;\n  }\n\n  makeLoader(loaderFunc, loader) {\n    return (...args) => {\n      return this.startLoading(loaderFunc, loader, ...args);\n    };\n  }\n\n  showEditor(loader) {\n    // Display the editor by lazily loading CodeMirror.\n    // loader is an instance of a Loader.\n    if (_.isUndefined(window.CodeMirror)) {\n      return $.getScript('assets/js/lib/codemirror.min.js', () => {\n        return this.netEditor = new Editor(this.makeLoader(loader.load, loader), loader);\n      });\n    } else {\n      return this.netEditor.reload(loader.load, loader);\n    }\n  }\n\n  setupErrorHandler() {\n    return window.onerror = (message, filename, lineno, colno, e) => {\n      var msg;\n      msg = message;\n      if (!(_.isUndefined(e) || _.isUndefined(e.line) || _.isUndefined(e.column))) {\n        msg = _.template('Line ${line}, Column ${column}: ${message}')(e);\n      }\n      this.$spinner.hide();\n      $('.msg', this.$netError).html(msg);\n      this.$netError.show();\n      return this.inProgress = false;\n    };\n  }\n\n};\n\n\n},{\"./editor.coffee\":8,\"./renderer.coffee\":12}],6:[function(require,module,exports){\nvar Analyzer, CaffeParser, Network, Parser, generateLayers, generateNetwork,\n  hasProp = {}.hasOwnProperty;\n\nParser = require('./parser');\n\nNetwork = require('../network.coffee');\n\nAnalyzer = require('../analyzer.coffee');\n\ngenerateLayers = function(descriptors, phase) {\n  var entry, headerKeys, j, layer, layerDesc, layers, len;\n  if (phase == null) {\n    phase = 'train';\n  }\n  layers = [];\n  for (j = 0, len = descriptors.length; j < len; j++) {\n    entry = descriptors[j];\n    // Support the deprecated Caffe 'layers' key as well.\n    layerDesc = entry.layer || entry.layers;\n    if (layerDesc != null) {\n      layer = {};\n      headerKeys = ['name', 'type', 'top', 'bottom'];\n      _.extend(layer, _.pick(layerDesc, headerKeys));\n      layer.attribs = _.omit(layerDesc, headerKeys);\n      layers.push(layer);\n    } else {\n      console.log('Unidentified entry ignored: ', entry);\n    }\n  }\n  layers = _.filter(layers, function(layer) {\n    var layerPhase, ref;\n    layerPhase = (ref = layer.attribs.include) != null ? ref.phase : void 0;\n    return !((layerPhase != null) && layerPhase !== phase);\n  });\n  return layers;\n};\n\ngenerateNetwork = function(layers, header) {\n  var children, curNode, dataNode, dims, getNodes, getSingleNode, i, implicitLayers, inplaceChild, inplaceOps, inplaceTable, input, inputs, j, k, l, layer, len, len1, len2, len3, m, n, net, node, nodeTable, ref;\n  nodeTable = {};\n  implicitLayers = [];\n  net = new Network(header.name);\n  getSingleNode = (name) => {\n    var node;\n    node = nodeTable[name];\n    // Caffe allows top to be a layer which isn't explicitly\n    // defined. Create an implicit layer if this is detected.\n    if (node == null) {\n      debugger;\n      node = net.createNode(name, 'implicit');\n      nodeTable[name] = node;\n    }\n    return node;\n  };\n  getNodes = (names, exclude) => {\n    names = [].concat(names);\n    if (exclude != null) {\n      _.pullAll(names, exclude);\n    }\n    return _.map(names, getSingleNode);\n  };\n  // Build the node LUT.\n  for (j = 0, len = layers.length; j < len; j++) {\n    layer = layers[j];\n    nodeTable[layer.name] = net.createNode(layer.name, layer.type, layer.attribs, {});\n  }\n  // Connect layers.\n  inplaceTable = {};\n  for (l = 0, len1 = layers.length; l < len1; l++) {\n    layer = layers[l];\n    node = nodeTable[layer.name];\n    if (layer.top != null) {\n      if (layer.top === layer.bottom) {\n        // This is an inplace node. We will treat this specially.\n        // Note that this would have otherwise introduced a cycle,\n        // violating the requirements of a DAG.\n        if (inplaceTable[layer.top] == null) {\n          inplaceTable[layer.top] = [];\n        }\n        inplaceTable[layer.top].push(node);\n        continue;\n      } else {\n        node.addChildren(getNodes(layer.top, [layer.name]));\n      }\n    }\n    if (layer.bottom != null) {\n      node.addParents(getNodes(layer.bottom, [].concat(layer.top)));\n    }\n  }\n  for (k in inplaceTable) {\n    if (!hasProp.call(inplaceTable, k)) continue;\n    inplaceOps = inplaceTable[k];\n    curNode = nodeTable[k];\n    curNode.coalesce = inplaceOps;\n    children = curNode.detachChildren();\n    for (m = 0, len2 = inplaceOps.length; m < len2; m++) {\n      inplaceChild = inplaceOps[m];\n      inplaceChild.annotation = 'InPlace';\n      curNode.addChild(inplaceChild);\n      curNode = inplaceChild;\n    }\n    curNode.addChildren(children);\n  }\n  // Patch in data layer parameters.\n  if (((header != null ? header.input : void 0) != null) && (((header != null ? header.input_dim : void 0) != null) || ((header != null ? (ref = header.input_shape) != null ? ref.dim : void 0 : void 0) != null))) {\n    inputs = [].concat(header.input);\n    dims = header.input_dim || header.input_shape.dim;\n    if (inputs.length === (dims.length * 0.25)) {\n      for (i = n = 0, len3 = inputs.length; n < len3; i = ++n) {\n        input = inputs[i];\n        dataNode = nodeTable[input];\n        dataNode.type = 'data';\n        dataNode.attribs.input_param = {\n          shape: {\n            dim: dims.slice(i * 4, (i + 1) * 4)\n          }\n        };\n      }\n    } else {\n      console.log('Inconsistent input dimensions.');\n    }\n  }\n  return net;\n};\n\nmodule.exports = CaffeParser = class CaffeParser {\n  static parse(txt, phase) {\n    var NetworkAnalyzer, header, layerDesc, layers, network;\n    [header, layerDesc] = Parser.parse(txt);\n    // if header is already a layer instead of a 'global header' with network name etc...:\n    if (header.layer) {\n      layerDesc.unshift(header);\n      header = {\n        name: 'Unnamed Network'\n      };\n    }\n    // extract input_shape field from layerDesc to header\n    if ((layerDesc[0].input_dim != null) || (layerDesc[0].input_shape != null)) {\n      _.extend(header, layerDesc[0]);\n    }\n    layers = generateLayers(layerDesc, phase);\n    network = generateNetwork(layers, header);\n    NetworkAnalyzer = new Analyzer();\n    network = NetworkAnalyzer.analyze(network);\n    return network;\n  }\n\n};\n\n\n},{\"../analyzer.coffee\":4,\"../network.coffee\":11,\"./parser\":7}],7:[function(require,module,exports){\nmodule.exports = (function() {\n  \"use strict\";\n\n  function peg$subclass(child, parent) {\n    function ctor() { this.constructor = child; }\n    ctor.prototype = parent.prototype;\n    child.prototype = new ctor();\n  }\n\n  function peg$SyntaxError(message, expected, found, location) {\n    this.message  = message;\n    this.expected = expected;\n    this.found    = found;\n    this.location = location;\n    this.name     = \"SyntaxError\";\n\n    if (typeof Error.captureStackTrace === \"function\") {\n      Error.captureStackTrace(this, peg$SyntaxError);\n    }\n  }\n\n  peg$subclass(peg$SyntaxError, Error);\n\n  function peg$parse(input) {\n    var options = arguments.length > 1 ? arguments[1] : {},\n        parser  = this,\n\n        peg$FAILED = {},\n\n        peg$startRuleFunctions = { Proto_text: peg$parseProto_text },\n        peg$startRuleFunction  = peg$parseProto_text,\n\n        peg$c0 = function(doc) { return doc; },\n        peg$c1 = { type: \"other\", description: \"whitespace\" },\n        peg$c2 = /^[ \\t\\n\\r]/,\n        peg$c3 = { type: \"class\", value: \"[ \\\\t\\\\n\\\\r]\", description: \"[ \\\\t\\\\n\\\\r]\" },\n        peg$c4 = { type: \"other\", description: \"whitespace or comment\" },\n        peg$c5 = function(first, v) { return v; },\n        peg$c6 = { type: \"other\", description: \"comment\" },\n        peg$c7 = \"#\",\n        peg$c8 = { type: \"literal\", value: \"#\", description: \"\\\"#\\\"\" },\n        peg$c9 = { type: \"any\", description: \"any character\" },\n        peg$c10 = function(first, m) { return m; },\n        peg$c11 = function(first, rest) {\n              var result = {};\n              var kvPairs = [first].concat(rest);\n              for (var i = 0; i < kvPairs.length; i++)\n              {\n                var k = kvPairs[i].key;\n                var v = kvPairs[i].value;\n                if(k in result)\n                {\n                  result[k] = [].concat(result[k]);\n                  result[k].push(v);\n              }\n                else\n                {\n                  result[k] = v;\n                }\n              }\n              return result;\n          },\n        peg$c12 = \":\",\n        peg$c13 = { type: \"literal\", value: \":\", description: \"\\\":\\\"\" },\n        peg$c14 = function(key, value) {\n            return {key: key, value: value};\n          },\n        peg$c15 = \"[\",\n        peg$c16 = { type: \"literal\", value: \"[\", description: \"\\\"[\\\"\" },\n        peg$c17 = \",\",\n        peg$c18 = { type: \"literal\", value: \",\", description: \"\\\",\\\"\" },\n        peg$c19 = function(v) { return v; },\n        peg$c20 = \"]\",\n        peg$c21 = { type: \"literal\", value: \"]\", description: \"\\\"]\\\"\" },\n        peg$c22 = function(entries) {\n              return entries;\n            },\n        peg$c23 = \"{\",\n        peg$c24 = { type: \"literal\", value: \"{\", description: \"\\\"{\\\"\" },\n        peg$c25 = function(key, first, m) { return m; },\n        peg$c26 = \"}\",\n        peg$c27 = { type: \"literal\", value: \"}\", description: \"\\\"}\\\"\" },\n        peg$c28 = function(key, first, rest) {\n              var elems = [first].concat(rest);\n              var merged = {};\n              for (var i = 0; i < elems.length; ++i)\n              {\n                  for(var k in elems[i])\n                  {\n                      merged[k] = elems[i][k];\n                  }\n              }\n              var result = {};\n              result[key] = merged;\n              return result;\n            },\n        peg$c29 = { type: \"other\", description: \"number\" },\n        peg$c30 = function() { return parseFloat(text()); },\n        peg$c31 = /^[eE]/,\n        peg$c32 = { type: \"class\", value: \"[eE]\", description: \"[eE]\" },\n        peg$c33 = \".\",\n        peg$c34 = { type: \"literal\", value: \".\", description: \"\\\".\\\"\" },\n        peg$c35 = \"0\",\n        peg$c36 = { type: \"literal\", value: \"0\", description: \"\\\"0\\\"\" },\n        peg$c37 = /^[1-9]/,\n        peg$c38 = { type: \"class\", value: \"[1-9]\", description: \"[1-9]\" },\n        peg$c39 = \"-\",\n        peg$c40 = { type: \"literal\", value: \"-\", description: \"\\\"-\\\"\" },\n        peg$c41 = \"+\",\n        peg$c42 = { type: \"literal\", value: \"+\", description: \"\\\"+\\\"\" },\n        peg$c43 = \"'\",\n        peg$c44 = { type: \"literal\", value: \"'\", description: \"\\\"'\\\"\" },\n        peg$c45 = function(chars) { return chars.join(\"\"); },\n        peg$c46 = \"\\\"\",\n        peg$c47 = { type: \"literal\", value: \"\\\"\", description: \"\\\"\\\\\\\"\\\"\" },\n        peg$c48 = { type: \"other\", description: \"key\" },\n        peg$c49 = /^[a-zA-Z0-9_\\-]/,\n        peg$c50 = { type: \"class\", value: \"[a-zA-Z0-9_-]\", description: \"[a-zA-Z0-9_-]\" },\n        peg$c51 = function(chars) { return chars.join(\"\").toLowerCase(); },\n        peg$c52 = { type: \"other\", description: \"double-quoted string character\" },\n        peg$c53 = /^[ -!#-[\\]-\\u10FFFF]/,\n        peg$c54 = { type: \"class\", value: \"[\\\\x20-\\\\x21\\\\x23-\\\\x5B\\\\x5D-\\\\u10FFFF]\", description: \"[\\\\x20-\\\\x21\\\\x23-\\\\x5B\\\\x5D-\\\\u10FFFF]\" },\n        peg$c55 = { type: \"other\", description: \"single-quoted string character\" },\n        peg$c56 = /^[ -&(-[\\]-\\u10FFFF]/,\n        peg$c57 = { type: \"class\", value: \"[\\\\x20-\\\\x26\\\\x28-\\\\x5B\\\\x5D-\\\\u10FFFF]\", description: \"[\\\\x20-\\\\x26\\\\x28-\\\\x5B\\\\x5D-\\\\u10FFFF]\" },\n        peg$c58 = { type: \"other\", description: \"escaped character sequence\" },\n        peg$c59 = \"\\\\\",\n        peg$c60 = { type: \"literal\", value: \"\\\\\", description: \"\\\"\\\\\\\\\\\"\" },\n        peg$c61 = \"/\",\n        peg$c62 = { type: \"literal\", value: \"/\", description: \"\\\"/\\\"\" },\n        peg$c63 = \"b\",\n        peg$c64 = { type: \"literal\", value: \"b\", description: \"\\\"b\\\"\" },\n        peg$c65 = function() { return \"\\b\"; },\n        peg$c66 = \"f\",\n        peg$c67 = { type: \"literal\", value: \"f\", description: \"\\\"f\\\"\" },\n        peg$c68 = function() { return \"\\f\"; },\n        peg$c69 = \"n\",\n        peg$c70 = { type: \"literal\", value: \"n\", description: \"\\\"n\\\"\" },\n        peg$c71 = function() { return \"\\n\"; },\n        peg$c72 = \"r\",\n        peg$c73 = { type: \"literal\", value: \"r\", description: \"\\\"r\\\"\" },\n        peg$c74 = function() { return \"\\r\"; },\n        peg$c75 = \"t\",\n        peg$c76 = { type: \"literal\", value: \"t\", description: \"\\\"t\\\"\" },\n        peg$c77 = function() { return \"\\t\"; },\n        peg$c78 = \"u\",\n        peg$c79 = { type: \"literal\", value: \"u\", description: \"\\\"u\\\"\" },\n        peg$c80 = function(digits) {\n                return String.fromCharCode(parseInt(digits, 16));\n              },\n        peg$c81 = function(sequence) {\n            return sequence;\n          },\n        peg$c82 = /^[0-9]/,\n        peg$c83 = { type: \"class\", value: \"[0-9]\", description: \"[0-9]\" },\n        peg$c84 = /^[0-9a-f]/i,\n        peg$c85 = { type: \"class\", value: \"[0-9a-f]i\", description: \"[0-9a-f]i\" },\n        peg$c86 = /^[\\n\\r\\u2028\\u2029]/,\n        peg$c87 = { type: \"class\", value: \"[\\\\n\\\\r\\\\u2028\\\\u2029]\", description: \"[\\\\n\\\\r\\\\u2028\\\\u2029]\" },\n\n        peg$currPos          = 0,\n        peg$savedPos         = 0,\n        peg$posDetailsCache  = [{ line: 1, column: 1, seenCR: false }],\n        peg$maxFailPos       = 0,\n        peg$maxFailExpected  = [],\n        peg$silentFails      = 0,\n\n        peg$result;\n\n    if (\"startRule\" in options) {\n      if (!(options.startRule in peg$startRuleFunctions)) {\n        throw new Error(\"Can't start parsing from rule \\\"\" + options.startRule + \"\\\".\");\n      }\n\n      peg$startRuleFunction = peg$startRuleFunctions[options.startRule];\n    }\n\n    function text() {\n      return input.substring(peg$savedPos, peg$currPos);\n    }\n\n    function location() {\n      return peg$computeLocation(peg$savedPos, peg$currPos);\n    }\n\n    function expected(description) {\n      throw peg$buildException(\n        null,\n        [{ type: \"other\", description: description }],\n        input.substring(peg$savedPos, peg$currPos),\n        peg$computeLocation(peg$savedPos, peg$currPos)\n      );\n    }\n\n    function error(message) {\n      throw peg$buildException(\n        message,\n        null,\n        input.substring(peg$savedPos, peg$currPos),\n        peg$computeLocation(peg$savedPos, peg$currPos)\n      );\n    }\n\n    function peg$computePosDetails(pos) {\n      var details = peg$posDetailsCache[pos],\n          p, ch;\n\n      if (details) {\n        return details;\n      } else {\n        p = pos - 1;\n        while (!peg$posDetailsCache[p]) {\n          p--;\n        }\n\n        details = peg$posDetailsCache[p];\n        details = {\n          line:   details.line,\n          column: details.column,\n          seenCR: details.seenCR\n        };\n\n        while (p < pos) {\n          ch = input.charAt(p);\n          if (ch === \"\\n\") {\n            if (!details.seenCR) { details.line++; }\n            details.column = 1;\n            details.seenCR = false;\n          } else if (ch === \"\\r\" || ch === \"\\u2028\" || ch === \"\\u2029\") {\n            details.line++;\n            details.column = 1;\n            details.seenCR = true;\n          } else {\n            details.column++;\n            details.seenCR = false;\n          }\n\n          p++;\n        }\n\n        peg$posDetailsCache[pos] = details;\n        return details;\n      }\n    }\n\n    function peg$computeLocation(startPos, endPos) {\n      var startPosDetails = peg$computePosDetails(startPos),\n          endPosDetails   = peg$computePosDetails(endPos);\n\n      return {\n        start: {\n          offset: startPos,\n          line:   startPosDetails.line,\n          column: startPosDetails.column\n        },\n        end: {\n          offset: endPos,\n          line:   endPosDetails.line,\n          column: endPosDetails.column\n        }\n      };\n    }\n\n    function peg$fail(expected) {\n      if (peg$currPos < peg$maxFailPos) { return; }\n\n      if (peg$currPos > peg$maxFailPos) {\n        peg$maxFailPos = peg$currPos;\n        peg$maxFailExpected = [];\n      }\n\n      peg$maxFailExpected.push(expected);\n    }\n\n    function peg$buildException(message, expected, found, location) {\n      function cleanupExpected(expected) {\n        var i = 1;\n\n        expected.sort(function(a, b) {\n          if (a.description < b.description) {\n            return -1;\n          } else if (a.description > b.description) {\n            return 1;\n          } else {\n            return 0;\n          }\n        });\n\n        while (i < expected.length) {\n          if (expected[i - 1] === expected[i]) {\n            expected.splice(i, 1);\n          } else {\n            i++;\n          }\n        }\n      }\n\n      function buildMessage(expected, found) {\n        function stringEscape(s) {\n          function hex(ch) { return ch.charCodeAt(0).toString(16).toUpperCase(); }\n\n          return s\n            .replace(/\\\\/g,   '\\\\\\\\')\n            .replace(/\"/g,    '\\\\\"')\n            .replace(/\\x08/g, '\\\\b')\n            .replace(/\\t/g,   '\\\\t')\n            .replace(/\\n/g,   '\\\\n')\n            .replace(/\\f/g,   '\\\\f')\n            .replace(/\\r/g,   '\\\\r')\n            .replace(/[\\x00-\\x07\\x0B\\x0E\\x0F]/g, function(ch) { return '\\\\x0' + hex(ch); })\n            .replace(/[\\x10-\\x1F\\x80-\\xFF]/g,    function(ch) { return '\\\\x'  + hex(ch); })\n            .replace(/[\\u0100-\\u0FFF]/g,         function(ch) { return '\\\\u0' + hex(ch); })\n            .replace(/[\\u1000-\\uFFFF]/g,         function(ch) { return '\\\\u'  + hex(ch); });\n        }\n\n        var expectedDescs = new Array(expected.length),\n            expectedDesc, foundDesc, i;\n\n        for (i = 0; i < expected.length; i++) {\n          expectedDescs[i] = expected[i].description;\n        }\n\n        expectedDesc = expected.length > 1\n          ? expectedDescs.slice(0, -1).join(\", \")\n              + \" or \"\n              + expectedDescs[expected.length - 1]\n          : expectedDescs[0];\n\n        foundDesc = found ? \"\\\"\" + stringEscape(found) + \"\\\"\" : \"end of input\";\n\n        return \"Expected \" + expectedDesc + \" but \" + foundDesc + \" found.\";\n      }\n\n      if (expected !== null) {\n        cleanupExpected(expected);\n      }\n\n      return new peg$SyntaxError(\n        message !== null ? message : buildMessage(expected, found),\n        expected,\n        found,\n        location\n      );\n    }\n\n    function peg$parseProto_text() {\n      var s0, s1, s2, s3;\n\n      s0 = peg$currPos;\n      s1 = peg$parsewsc();\n      if (s1 !== peg$FAILED) {\n        s2 = peg$parsedoc();\n        if (s2 !== peg$FAILED) {\n          s3 = peg$parsewsc();\n          if (s3 !== peg$FAILED) {\n            peg$savedPos = s0;\n            s1 = peg$c0(s2);\n            s0 = s1;\n          } else {\n            peg$currPos = s0;\n            s0 = peg$FAILED;\n          }\n        } else {\n          peg$currPos = s0;\n          s0 = peg$FAILED;\n        }\n      } else {\n        peg$currPos = s0;\n        s0 = peg$FAILED;\n      }\n\n      return s0;\n    }\n\n    function peg$parsews() {\n      var s0, s1;\n\n      peg$silentFails++;\n      s0 = [];\n      if (peg$c2.test(input.charAt(peg$currPos))) {\n        s1 = input.charAt(peg$currPos);\n        peg$currPos++;\n      } else {\n        s1 = peg$FAILED;\n        if (peg$silentFails === 0) { peg$fail(peg$c3); }\n      }\n      while (s1 !== peg$FAILED) {\n        s0.push(s1);\n        if (peg$c2.test(input.charAt(peg$currPos))) {\n          s1 = input.charAt(peg$currPos);\n          peg$currPos++;\n        } else {\n          s1 = peg$FAILED;\n          if (peg$silentFails === 0) { peg$fail(peg$c3); }\n        }\n      }\n      peg$silentFails--;\n      if (s0 === peg$FAILED) {\n        s1 = peg$FAILED;\n        if (peg$silentFails === 0) { peg$fail(peg$c1); }\n      }\n\n      return s0;\n    }\n\n    function peg$parsewsc() {\n      var s0, s1, s2, s3;\n\n      peg$silentFails++;\n      s0 = peg$currPos;\n      s1 = peg$parsews();\n      if (s1 !== peg$FAILED) {\n        s2 = [];\n        s3 = peg$parsecomment();\n        while (s3 !== peg$FAILED) {\n          s2.push(s3);\n          s3 = peg$parsecomment();\n        }\n        if (s2 !== peg$FAILED) {\n          s3 = peg$parsews();\n          if (s3 !== peg$FAILED) {\n            s1 = [s1, s2, s3];\n            s0 = s1;\n          } else {\n            peg$currPos = s0;\n            s0 = peg$FAILED;\n          }\n        } else {\n          peg$currPos = s0;\n          s0 = peg$FAILED;\n        }\n      } else {\n        peg$currPos = s0;\n        s0 = peg$FAILED;\n      }\n      peg$silentFails--;\n      if (s0 === peg$FAILED) {\n        s1 = peg$FAILED;\n        if (peg$silentFails === 0) { peg$fail(peg$c4); }\n      }\n\n      return s0;\n    }\n\n    function peg$parsedoc() {\n      var s0, s1, s2, s3, s4, s5;\n\n      s0 = peg$currPos;\n      s1 = peg$parsevalue();\n      if (s1 !== peg$FAILED) {\n        s2 = [];\n        s3 = peg$currPos;\n        s4 = peg$parsewsc();\n        if (s4 !== peg$FAILED) {\n          s5 = peg$parsevalue();\n          if (s5 !== peg$FAILED) {\n            peg$savedPos = s3;\n            s4 = peg$c5(s1, s5);\n            s3 = s4;\n          } else {\n            peg$currPos = s3;\n            s3 = peg$FAILED;\n          }\n        } else {\n          peg$currPos = s3;\n          s3 = peg$FAILED;\n        }\n        while (s3 !== peg$FAILED) {\n          s2.push(s3);\n          s3 = peg$currPos;\n          s4 = peg$parsewsc();\n          if (s4 !== peg$FAILED) {\n            s5 = peg$parsevalue();\n            if (s5 !== peg$FAILED) {\n              peg$savedPos = s3;\n              s4 = peg$c5(s1, s5);\n              s3 = s4;\n            } else {\n              peg$currPos = s3;\n              s3 = peg$FAILED;\n            }\n          } else {\n            peg$currPos = s3;\n            s3 = peg$FAILED;\n          }\n        }\n        if (s2 !== peg$FAILED) {\n          s1 = [s1, s2];\n          s0 = s1;\n        } else {\n          peg$currPos = s0;\n          s0 = peg$FAILED;\n        }\n      } else {\n        peg$currPos = s0;\n        s0 = peg$FAILED;\n      }\n\n      return s0;\n    }\n\n    function peg$parsevalue() {\n      var s0;\n\n      s0 = peg$parseobject();\n      if (s0 === peg$FAILED) {\n        s0 = peg$parsepairs();\n      }\n\n      return s0;\n    }\n\n    function peg$parsecomment() {\n      var s0, s1, s2, s3, s4, s5, s6;\n\n      peg$silentFails++;\n      s0 = peg$currPos;\n      s1 = peg$parsews();\n      if (s1 !== peg$FAILED) {\n        if (input.charCodeAt(peg$currPos) === 35) {\n          s2 = peg$c7;\n          peg$currPos++;\n        } else {\n          s2 = peg$FAILED;\n          if (peg$silentFails === 0) { peg$fail(peg$c8); }\n        }\n        if (s2 !== peg$FAILED) {\n          s3 = [];\n          s4 = peg$currPos;\n          s5 = peg$currPos;\n          peg$silentFails++;\n          s6 = peg$parseLineTerminator();\n          peg$silentFails--;\n          if (s6 === peg$FAILED) {\n            s5 = void 0;\n          } else {\n            peg$currPos = s5;\n            s5 = peg$FAILED;\n          }\n          if (s5 !== peg$FAILED) {\n            if (input.length > peg$currPos) {\n              s6 = input.charAt(peg$currPos);\n              peg$currPos++;\n            } else {\n              s6 = peg$FAILED;\n              if (peg$silentFails === 0) { peg$fail(peg$c9); }\n            }\n            if (s6 !== peg$FAILED) {\n              s5 = [s5, s6];\n              s4 = s5;\n            } else {\n              peg$currPos = s4;\n              s4 = peg$FAILED;\n            }\n          } else {\n            peg$currPos = s4;\n            s4 = peg$FAILED;\n          }\n          while (s4 !== peg$FAILED) {\n            s3.push(s4);\n            s4 = peg$currPos;\n            s5 = peg$currPos;\n            peg$silentFails++;\n            s6 = peg$parseLineTerminator();\n            peg$silentFails--;\n            if (s6 === peg$FAILED) {\n              s5 = void 0;\n            } else {\n              peg$currPos = s5;\n              s5 = peg$FAILED;\n            }\n            if (s5 !== peg$FAILED) {\n              if (input.length > peg$currPos) {\n                s6 = input.charAt(peg$currPos);\n                peg$currPos++;\n              } else {\n                s6 = peg$FAILED;\n                if (peg$silentFails === 0) { peg$fail(peg$c9); }\n              }\n              if (s6 !== peg$FAILED) {\n                s5 = [s5, s6];\n                s4 = s5;\n              } else {\n                peg$currPos = s4;\n                s4 = peg$FAILED;\n              }\n            } else {\n              peg$currPos = s4;\n              s4 = peg$FAILED;\n            }\n          }\n          if (s3 !== peg$FAILED) {\n            s1 = [s1, s2, s3];\n            s0 = s1;\n          } else {\n            peg$currPos = s0;\n            s0 = peg$FAILED;\n          }\n        } else {\n          peg$currPos = s0;\n          s0 = peg$FAILED;\n        }\n      } else {\n        peg$currPos = s0;\n        s0 = peg$FAILED;\n      }\n      peg$silentFails--;\n      if (s0 === peg$FAILED) {\n        s1 = peg$FAILED;\n        if (peg$silentFails === 0) { peg$fail(peg$c6); }\n      }\n\n      return s0;\n    }\n\n    function peg$parsepairs() {\n      var s0, s1, s2, s3, s4, s5;\n\n      s0 = peg$currPos;\n      s1 = peg$parsepair();\n      if (s1 !== peg$FAILED) {\n        s2 = [];\n        s3 = peg$currPos;\n        s4 = peg$parsewsc();\n        if (s4 !== peg$FAILED) {\n          s5 = peg$parsepair();\n          if (s5 !== peg$FAILED) {\n            peg$savedPos = s3;\n            s4 = peg$c10(s1, s5);\n            s3 = s4;\n          } else {\n            peg$currPos = s3;\n            s3 = peg$FAILED;\n          }\n        } else {\n          peg$currPos = s3;\n          s3 = peg$FAILED;\n        }\n        while (s3 !== peg$FAILED) {\n          s2.push(s3);\n          s3 = peg$currPos;\n          s4 = peg$parsewsc();\n          if (s4 !== peg$FAILED) {\n            s5 = peg$parsepair();\n            if (s5 !== peg$FAILED) {\n              peg$savedPos = s3;\n              s4 = peg$c10(s1, s5);\n              s3 = s4;\n            } else {\n              peg$currPos = s3;\n              s3 = peg$FAILED;\n            }\n          } else {\n            peg$currPos = s3;\n            s3 = peg$FAILED;\n          }\n        }\n        if (s2 !== peg$FAILED) {\n          peg$savedPos = s0;\n          s1 = peg$c11(s1, s2);\n          s0 = s1;\n        } else {\n          peg$currPos = s0;\n          s0 = peg$FAILED;\n        }\n      } else {\n        peg$currPos = s0;\n        s0 = peg$FAILED;\n      }\n\n      return s0;\n    }\n\n    function peg$parsepair() {\n      var s0, s1, s2, s3, s4, s5;\n\n      s0 = peg$currPos;\n      s1 = peg$parsekey();\n      if (s1 !== peg$FAILED) {\n        s2 = peg$parsews();\n        if (s2 !== peg$FAILED) {\n          if (input.charCodeAt(peg$currPos) === 58) {\n            s3 = peg$c12;\n            peg$currPos++;\n          } else {\n            s3 = peg$FAILED;\n            if (peg$silentFails === 0) { peg$fail(peg$c13); }\n          }\n          if (s3 !== peg$FAILED) {\n            s4 = peg$parsews();\n            if (s4 !== peg$FAILED) {\n              s5 = peg$parsestring();\n              if (s5 === peg$FAILED) {\n                s5 = peg$parsenumber();\n                if (s5 === peg$FAILED) {\n                  s5 = peg$parsekey();\n                  if (s5 === peg$FAILED) {\n                    s5 = peg$parselist();\n                  }\n                }\n              }\n              if (s5 !== peg$FAILED) {\n                peg$savedPos = s0;\n                s1 = peg$c14(s1, s5);\n                s0 = s1;\n              } else {\n                peg$currPos = s0;\n                s0 = peg$FAILED;\n              }\n            } else {\n              peg$currPos = s0;\n              s0 = peg$FAILED;\n            }\n          } else {\n            peg$currPos = s0;\n            s0 = peg$FAILED;\n          }\n        } else {\n          peg$currPos = s0;\n          s0 = peg$FAILED;\n        }\n      } else {\n        peg$currPos = s0;\n        s0 = peg$FAILED;\n      }\n\n      return s0;\n    }\n\n    function peg$parselist() {\n      var s0, s1, s2, s3, s4, s5, s6, s7;\n\n      s0 = peg$currPos;\n      if (input.charCodeAt(peg$currPos) === 91) {\n        s1 = peg$c15;\n        peg$currPos++;\n      } else {\n        s1 = peg$FAILED;\n        if (peg$silentFails === 0) { peg$fail(peg$c16); }\n      }\n      if (s1 !== peg$FAILED) {\n        s2 = [];\n        s3 = peg$currPos;\n        s4 = peg$parsews();\n        if (s4 !== peg$FAILED) {\n          s5 = peg$parsestring();\n          if (s5 === peg$FAILED) {\n            s5 = peg$parsenumber();\n          }\n          if (s5 !== peg$FAILED) {\n            s6 = peg$parsews();\n            if (s6 !== peg$FAILED) {\n              if (input.charCodeAt(peg$currPos) === 44) {\n                s7 = peg$c17;\n                peg$currPos++;\n              } else {\n                s7 = peg$FAILED;\n                if (peg$silentFails === 0) { peg$fail(peg$c18); }\n              }\n              if (s7 === peg$FAILED) {\n                s7 = null;\n              }\n              if (s7 !== peg$FAILED) {\n                peg$savedPos = s3;\n                s4 = peg$c19(s5);\n                s3 = s4;\n              } else {\n                peg$currPos = s3;\n                s3 = peg$FAILED;\n              }\n            } else {\n              peg$currPos = s3;\n              s3 = peg$FAILED;\n            }\n          } else {\n            peg$currPos = s3;\n            s3 = peg$FAILED;\n          }\n        } else {\n          peg$currPos = s3;\n          s3 = peg$FAILED;\n        }\n        while (s3 !== peg$FAILED) {\n          s2.push(s3);\n          s3 = peg$currPos;\n          s4 = peg$parsews();\n          if (s4 !== peg$FAILED) {\n            s5 = peg$parsestring();\n            if (s5 === peg$FAILED) {\n              s5 = peg$parsenumber();\n            }\n            if (s5 !== peg$FAILED) {\n              s6 = peg$parsews();\n              if (s6 !== peg$FAILED) {\n                if (input.charCodeAt(peg$currPos) === 44) {\n                  s7 = peg$c17;\n                  peg$currPos++;\n                } else {\n                  s7 = peg$FAILED;\n                  if (peg$silentFails === 0) { peg$fail(peg$c18); }\n                }\n                if (s7 === peg$FAILED) {\n                  s7 = null;\n                }\n                if (s7 !== peg$FAILED) {\n                  peg$savedPos = s3;\n                  s4 = peg$c19(s5);\n                  s3 = s4;\n                } else {\n                  peg$currPos = s3;\n                  s3 = peg$FAILED;\n                }\n              } else {\n                peg$currPos = s3;\n                s3 = peg$FAILED;\n              }\n            } else {\n              peg$currPos = s3;\n              s3 = peg$FAILED;\n            }\n          } else {\n            peg$currPos = s3;\n            s3 = peg$FAILED;\n          }\n        }\n        if (s2 !== peg$FAILED) {\n          s3 = peg$parsews();\n          if (s3 !== peg$FAILED) {\n            if (input.charCodeAt(peg$currPos) === 93) {\n              s4 = peg$c20;\n              peg$currPos++;\n            } else {\n              s4 = peg$FAILED;\n              if (peg$silentFails === 0) { peg$fail(peg$c21); }\n            }\n            if (s4 !== peg$FAILED) {\n              peg$savedPos = s0;\n              s1 = peg$c22(s2);\n              s0 = s1;\n            } else {\n              peg$currPos = s0;\n              s0 = peg$FAILED;\n            }\n          } else {\n            peg$currPos = s0;\n            s0 = peg$FAILED;\n          }\n        } else {\n          peg$currPos = s0;\n          s0 = peg$FAILED;\n        }\n      } else {\n        peg$currPos = s0;\n        s0 = peg$FAILED;\n      }\n\n      return s0;\n    }\n\n    function peg$parseobject() {\n      var s0, s1, s2, s3, s4, s5, s6, s7, s8, s9, s10, s11;\n\n      s0 = peg$currPos;\n      s1 = peg$parsekey();\n      if (s1 !== peg$FAILED) {\n        s2 = peg$parsews();\n        if (s2 !== peg$FAILED) {\n          if (input.charCodeAt(peg$currPos) === 58) {\n            s3 = peg$c12;\n            peg$currPos++;\n          } else {\n            s3 = peg$FAILED;\n            if (peg$silentFails === 0) { peg$fail(peg$c13); }\n          }\n          if (s3 === peg$FAILED) {\n            s3 = null;\n          }\n          if (s3 !== peg$FAILED) {\n            s4 = peg$parsews();\n            if (s4 !== peg$FAILED) {\n              if (input.charCodeAt(peg$currPos) === 123) {\n                s5 = peg$c23;\n                peg$currPos++;\n              } else {\n                s5 = peg$FAILED;\n                if (peg$silentFails === 0) { peg$fail(peg$c24); }\n              }\n              if (s5 !== peg$FAILED) {\n                s6 = peg$parsewsc();\n                if (s6 !== peg$FAILED) {\n                  s7 = peg$parsemember();\n                  if (s7 === peg$FAILED) {\n                    s7 = null;\n                  }\n                  if (s7 !== peg$FAILED) {\n                    s8 = [];\n                    s9 = peg$currPos;\n                    s10 = peg$parsewsc();\n                    if (s10 !== peg$FAILED) {\n                      s11 = peg$parsemember();\n                      if (s11 !== peg$FAILED) {\n                        peg$savedPos = s9;\n                        s10 = peg$c25(s1, s7, s11);\n                        s9 = s10;\n                      } else {\n                        peg$currPos = s9;\n                        s9 = peg$FAILED;\n                      }\n                    } else {\n                      peg$currPos = s9;\n                      s9 = peg$FAILED;\n                    }\n                    while (s9 !== peg$FAILED) {\n                      s8.push(s9);\n                      s9 = peg$currPos;\n                      s10 = peg$parsewsc();\n                      if (s10 !== peg$FAILED) {\n                        s11 = peg$parsemember();\n                        if (s11 !== peg$FAILED) {\n                          peg$savedPos = s9;\n                          s10 = peg$c25(s1, s7, s11);\n                          s9 = s10;\n                        } else {\n                          peg$currPos = s9;\n                          s9 = peg$FAILED;\n                        }\n                      } else {\n                        peg$currPos = s9;\n                        s9 = peg$FAILED;\n                      }\n                    }\n                    if (s8 !== peg$FAILED) {\n                      s9 = peg$parsewsc();\n                      if (s9 !== peg$FAILED) {\n                        if (input.charCodeAt(peg$currPos) === 125) {\n                          s10 = peg$c26;\n                          peg$currPos++;\n                        } else {\n                          s10 = peg$FAILED;\n                          if (peg$silentFails === 0) { peg$fail(peg$c27); }\n                        }\n                        if (s10 !== peg$FAILED) {\n                          s11 = peg$parsewsc();\n                          if (s11 !== peg$FAILED) {\n                            peg$savedPos = s0;\n                            s1 = peg$c28(s1, s7, s8);\n                            s0 = s1;\n                          } else {\n                            peg$currPos = s0;\n                            s0 = peg$FAILED;\n                          }\n                        } else {\n                          peg$currPos = s0;\n                          s0 = peg$FAILED;\n                        }\n                      } else {\n                        peg$currPos = s0;\n                        s0 = peg$FAILED;\n                      }\n                    } else {\n                      peg$currPos = s0;\n                      s0 = peg$FAILED;\n                    }\n                  } else {\n                    peg$currPos = s0;\n                    s0 = peg$FAILED;\n                  }\n                } else {\n                  peg$currPos = s0;\n                  s0 = peg$FAILED;\n                }\n              } else {\n                peg$currPos = s0;\n                s0 = peg$FAILED;\n              }\n            } else {\n              peg$currPos = s0;\n              s0 = peg$FAILED;\n            }\n          } else {\n            peg$currPos = s0;\n            s0 = peg$FAILED;\n          }\n        } else {\n          peg$currPos = s0;\n          s0 = peg$FAILED;\n        }\n      } else {\n        peg$currPos = s0;\n        s0 = peg$FAILED;\n      }\n\n      return s0;\n    }\n\n    function peg$parsemember() {\n      var s0;\n\n      s0 = peg$parsecomment();\n      if (s0 === peg$FAILED) {\n        s0 = peg$parsepairs();\n        if (s0 === peg$FAILED) {\n          s0 = peg$parseobject();\n        }\n      }\n\n      return s0;\n    }\n\n    function peg$parsenumber() {\n      var s0, s1, s2, s3, s4;\n\n      peg$silentFails++;\n      s0 = peg$currPos;\n      s1 = peg$parseminus();\n      if (s1 === peg$FAILED) {\n        s1 = null;\n      }\n      if (s1 !== peg$FAILED) {\n        s2 = peg$parseint();\n        if (s2 !== peg$FAILED) {\n          s3 = peg$parsefrac();\n          if (s3 === peg$FAILED) {\n            s3 = null;\n          }\n          if (s3 !== peg$FAILED) {\n            s4 = peg$parseexp();\n            if (s4 === peg$FAILED) {\n              s4 = null;\n            }\n            if (s4 !== peg$FAILED) {\n              peg$savedPos = s0;\n              s1 = peg$c30();\n              s0 = s1;\n            } else {\n              peg$currPos = s0;\n              s0 = peg$FAILED;\n            }\n          } else {\n            peg$currPos = s0;\n            s0 = peg$FAILED;\n          }\n        } else {\n          peg$currPos = s0;\n          s0 = peg$FAILED;\n        }\n      } else {\n        peg$currPos = s0;\n        s0 = peg$FAILED;\n      }\n      peg$silentFails--;\n      if (s0 === peg$FAILED) {\n        s1 = peg$FAILED;\n        if (peg$silentFails === 0) { peg$fail(peg$c29); }\n      }\n\n      return s0;\n    }\n\n    function peg$parseexp() {\n      var s0, s1, s2, s3, s4;\n\n      s0 = peg$currPos;\n      if (peg$c31.test(input.charAt(peg$currPos))) {\n        s1 = input.charAt(peg$currPos);\n        peg$currPos++;\n      } else {\n        s1 = peg$FAILED;\n        if (peg$silentFails === 0) { peg$fail(peg$c32); }\n      }\n      if (s1 !== peg$FAILED) {\n        s2 = peg$parseminus();\n        if (s2 === peg$FAILED) {\n          s2 = peg$parseplus();\n        }\n        if (s2 === peg$FAILED) {\n          s2 = null;\n        }\n        if (s2 !== peg$FAILED) {\n          s3 = [];\n          s4 = peg$parseDigit();\n          if (s4 !== peg$FAILED) {\n            while (s4 !== peg$FAILED) {\n              s3.push(s4);\n              s4 = peg$parseDigit();\n            }\n          } else {\n            s3 = peg$FAILED;\n          }\n          if (s3 !== peg$FAILED) {\n            s1 = [s1, s2, s3];\n            s0 = s1;\n          } else {\n            peg$currPos = s0;\n            s0 = peg$FAILED;\n          }\n        } else {\n          peg$currPos = s0;\n          s0 = peg$FAILED;\n        }\n      } else {\n        peg$currPos = s0;\n        s0 = peg$FAILED;\n      }\n\n      return s0;\n    }\n\n    function peg$parsefrac() {\n      var s0, s1, s2, s3;\n\n      s0 = peg$currPos;\n      if (input.charCodeAt(peg$currPos) === 46) {\n        s1 = peg$c33;\n        peg$currPos++;\n      } else {\n        s1 = peg$FAILED;\n        if (peg$silentFails === 0) { peg$fail(peg$c34); }\n      }\n      if (s1 !== peg$FAILED) {\n        s2 = [];\n        s3 = peg$parseDigit();\n        if (s3 !== peg$FAILED) {\n          while (s3 !== peg$FAILED) {\n            s2.push(s3);\n            s3 = peg$parseDigit();\n          }\n        } else {\n          s2 = peg$FAILED;\n        }\n        if (s2 !== peg$FAILED) {\n          s1 = [s1, s2];\n          s0 = s1;\n        } else {\n          peg$currPos = s0;\n          s0 = peg$FAILED;\n        }\n      } else {\n        peg$currPos = s0;\n        s0 = peg$FAILED;\n      }\n\n      return s0;\n    }\n\n    function peg$parseint() {\n      var s0, s1, s2, s3;\n\n      if (input.charCodeAt(peg$currPos) === 48) {\n        s0 = peg$c35;\n        peg$currPos++;\n      } else {\n        s0 = peg$FAILED;\n        if (peg$silentFails === 0) { peg$fail(peg$c36); }\n      }\n      if (s0 === peg$FAILED) {\n        s0 = peg$currPos;\n        if (peg$c37.test(input.charAt(peg$currPos))) {\n          s1 = input.charAt(peg$currPos);\n          peg$currPos++;\n        } else {\n          s1 = peg$FAILED;\n          if (peg$silentFails === 0) { peg$fail(peg$c38); }\n        }\n        if (s1 !== peg$FAILED) {\n          s2 = [];\n          s3 = peg$parseDigit();\n          while (s3 !== peg$FAILED) {\n            s2.push(s3);\n            s3 = peg$parseDigit();\n          }\n          if (s2 !== peg$FAILED) {\n            s1 = [s1, s2];\n            s0 = s1;\n          } else {\n            peg$currPos = s0;\n            s0 = peg$FAILED;\n          }\n        } else {\n          peg$currPos = s0;\n          s0 = peg$FAILED;\n        }\n      }\n\n      return s0;\n    }\n\n    function peg$parseminus() {\n      var s0;\n\n      if (input.charCodeAt(peg$currPos) === 45) {\n        s0 = peg$c39;\n        peg$currPos++;\n      } else {\n        s0 = peg$FAILED;\n        if (peg$silentFails === 0) { peg$fail(peg$c40); }\n      }\n\n      return s0;\n    }\n\n    function peg$parseplus() {\n      var s0;\n\n      if (input.charCodeAt(peg$currPos) === 43) {\n        s0 = peg$c41;\n        peg$currPos++;\n      } else {\n        s0 = peg$FAILED;\n        if (peg$silentFails === 0) { peg$fail(peg$c42); }\n      }\n\n      return s0;\n    }\n\n    function peg$parsestring() {\n      var s0;\n\n      s0 = peg$parsesstring();\n      if (s0 === peg$FAILED) {\n        s0 = peg$parsedstring();\n      }\n\n      return s0;\n    }\n\n    function peg$parsesstring() {\n      var s0, s1, s2, s3;\n\n      s0 = peg$currPos;\n      if (input.charCodeAt(peg$currPos) === 39) {\n        s1 = peg$c43;\n        peg$currPos++;\n      } else {\n        s1 = peg$FAILED;\n        if (peg$silentFails === 0) { peg$fail(peg$c44); }\n      }\n      if (s1 !== peg$FAILED) {\n        s2 = [];\n        s3 = peg$parseschar();\n        while (s3 !== peg$FAILED) {\n          s2.push(s3);\n          s3 = peg$parseschar();\n        }\n        if (s2 !== peg$FAILED) {\n          if (input.charCodeAt(peg$currPos) === 39) {\n            s3 = peg$c43;\n            peg$currPos++;\n          } else {\n            s3 = peg$FAILED;\n            if (peg$silentFails === 0) { peg$fail(peg$c44); }\n          }\n          if (s3 !== peg$FAILED) {\n            peg$savedPos = s0;\n            s1 = peg$c45(s2);\n            s0 = s1;\n          } else {\n            peg$currPos = s0;\n            s0 = peg$FAILED;\n          }\n        } else {\n          peg$currPos = s0;\n          s0 = peg$FAILED;\n        }\n      } else {\n        peg$currPos = s0;\n        s0 = peg$FAILED;\n      }\n\n      return s0;\n    }\n\n    function peg$parsedstring() {\n      var s0, s1, s2, s3;\n\n      s0 = peg$currPos;\n      if (input.charCodeAt(peg$currPos) === 34) {\n        s1 = peg$c46;\n        peg$currPos++;\n      } else {\n        s1 = peg$FAILED;\n        if (peg$silentFails === 0) { peg$fail(peg$c47); }\n      }\n      if (s1 !== peg$FAILED) {\n        s2 = [];\n        s3 = peg$parsedchar();\n        while (s3 !== peg$FAILED) {\n          s2.push(s3);\n          s3 = peg$parsedchar();\n        }\n        if (s2 !== peg$FAILED) {\n          if (input.charCodeAt(peg$currPos) === 34) {\n            s3 = peg$c46;\n            peg$currPos++;\n          } else {\n            s3 = peg$FAILED;\n            if (peg$silentFails === 0) { peg$fail(peg$c47); }\n          }\n          if (s3 !== peg$FAILED) {\n            peg$savedPos = s0;\n            s1 = peg$c45(s2);\n            s0 = s1;\n          } else {\n            peg$currPos = s0;\n            s0 = peg$FAILED;\n          }\n        } else {\n          peg$currPos = s0;\n          s0 = peg$FAILED;\n        }\n      } else {\n        peg$currPos = s0;\n        s0 = peg$FAILED;\n      }\n\n      return s0;\n    }\n\n    function peg$parsekey() {\n      var s0, s1, s2;\n\n      peg$silentFails++;\n      s0 = peg$currPos;\n      s1 = [];\n      if (peg$c49.test(input.charAt(peg$currPos))) {\n        s2 = input.charAt(peg$currPos);\n        peg$currPos++;\n      } else {\n        s2 = peg$FAILED;\n        if (peg$silentFails === 0) { peg$fail(peg$c50); }\n      }\n      if (s2 !== peg$FAILED) {\n        while (s2 !== peg$FAILED) {\n          s1.push(s2);\n          if (peg$c49.test(input.charAt(peg$currPos))) {\n            s2 = input.charAt(peg$currPos);\n            peg$currPos++;\n          } else {\n            s2 = peg$FAILED;\n            if (peg$silentFails === 0) { peg$fail(peg$c50); }\n          }\n        }\n      } else {\n        s1 = peg$FAILED;\n      }\n      if (s1 !== peg$FAILED) {\n        peg$savedPos = s0;\n        s1 = peg$c51(s1);\n      }\n      s0 = s1;\n      peg$silentFails--;\n      if (s0 === peg$FAILED) {\n        s1 = peg$FAILED;\n        if (peg$silentFails === 0) { peg$fail(peg$c48); }\n      }\n\n      return s0;\n    }\n\n    function peg$parsedchar() {\n      var s0, s1;\n\n      peg$silentFails++;\n      if (peg$c53.test(input.charAt(peg$currPos))) {\n        s0 = input.charAt(peg$currPos);\n        peg$currPos++;\n      } else {\n        s0 = peg$FAILED;\n        if (peg$silentFails === 0) { peg$fail(peg$c54); }\n      }\n      if (s0 === peg$FAILED) {\n        s0 = peg$parseechar();\n      }\n      peg$silentFails--;\n      if (s0 === peg$FAILED) {\n        s1 = peg$FAILED;\n        if (peg$silentFails === 0) { peg$fail(peg$c52); }\n      }\n\n      return s0;\n    }\n\n    function peg$parseschar() {\n      var s0, s1;\n\n      peg$silentFails++;\n      if (peg$c56.test(input.charAt(peg$currPos))) {\n        s0 = input.charAt(peg$currPos);\n        peg$currPos++;\n      } else {\n        s0 = peg$FAILED;\n        if (peg$silentFails === 0) { peg$fail(peg$c57); }\n      }\n      if (s0 === peg$FAILED) {\n        s0 = peg$parseechar();\n      }\n      peg$silentFails--;\n      if (s0 === peg$FAILED) {\n        s1 = peg$FAILED;\n        if (peg$silentFails === 0) { peg$fail(peg$c55); }\n      }\n\n      return s0;\n    }\n\n    function peg$parseechar() {\n      var s0, s1, s2, s3, s4, s5, s6, s7, s8, s9;\n\n      peg$silentFails++;\n      s0 = peg$currPos;\n      if (input.charCodeAt(peg$currPos) === 92) {\n        s1 = peg$c59;\n        peg$currPos++;\n      } else {\n        s1 = peg$FAILED;\n        if (peg$silentFails === 0) { peg$fail(peg$c60); }\n      }\n      if (s1 !== peg$FAILED) {\n        if (input.charCodeAt(peg$currPos) === 34) {\n          s2 = peg$c46;\n          peg$currPos++;\n        } else {\n          s2 = peg$FAILED;\n          if (peg$silentFails === 0) { peg$fail(peg$c47); }\n        }\n        if (s2 === peg$FAILED) {\n          if (input.charCodeAt(peg$currPos) === 39) {\n            s2 = peg$c43;\n            peg$currPos++;\n          } else {\n            s2 = peg$FAILED;\n            if (peg$silentFails === 0) { peg$fail(peg$c44); }\n          }\n          if (s2 === peg$FAILED) {\n            if (input.charCodeAt(peg$currPos) === 92) {\n              s2 = peg$c59;\n              peg$currPos++;\n            } else {\n              s2 = peg$FAILED;\n              if (peg$silentFails === 0) { peg$fail(peg$c60); }\n            }\n            if (s2 === peg$FAILED) {\n              if (input.charCodeAt(peg$currPos) === 47) {\n                s2 = peg$c61;\n                peg$currPos++;\n              } else {\n                s2 = peg$FAILED;\n                if (peg$silentFails === 0) { peg$fail(peg$c62); }\n              }\n              if (s2 === peg$FAILED) {\n                s2 = peg$currPos;\n                if (input.charCodeAt(peg$currPos) === 98) {\n                  s3 = peg$c63;\n                  peg$currPos++;\n                } else {\n                  s3 = peg$FAILED;\n                  if (peg$silentFails === 0) { peg$fail(peg$c64); }\n                }\n                if (s3 !== peg$FAILED) {\n                  peg$savedPos = s2;\n                  s3 = peg$c65();\n                }\n                s2 = s3;\n                if (s2 === peg$FAILED) {\n                  s2 = peg$currPos;\n                  if (input.charCodeAt(peg$currPos) === 102) {\n                    s3 = peg$c66;\n                    peg$currPos++;\n                  } else {\n                    s3 = peg$FAILED;\n                    if (peg$silentFails === 0) { peg$fail(peg$c67); }\n                  }\n                  if (s3 !== peg$FAILED) {\n                    peg$savedPos = s2;\n                    s3 = peg$c68();\n                  }\n                  s2 = s3;\n                  if (s2 === peg$FAILED) {\n                    s2 = peg$currPos;\n                    if (input.charCodeAt(peg$currPos) === 110) {\n                      s3 = peg$c69;\n                      peg$currPos++;\n                    } else {\n                      s3 = peg$FAILED;\n                      if (peg$silentFails === 0) { peg$fail(peg$c70); }\n                    }\n                    if (s3 !== peg$FAILED) {\n                      peg$savedPos = s2;\n                      s3 = peg$c71();\n                    }\n                    s2 = s3;\n                    if (s2 === peg$FAILED) {\n                      s2 = peg$currPos;\n                      if (input.charCodeAt(peg$currPos) === 114) {\n                        s3 = peg$c72;\n                        peg$currPos++;\n                      } else {\n                        s3 = peg$FAILED;\n                        if (peg$silentFails === 0) { peg$fail(peg$c73); }\n                      }\n                      if (s3 !== peg$FAILED) {\n                        peg$savedPos = s2;\n                        s3 = peg$c74();\n                      }\n                      s2 = s3;\n                      if (s2 === peg$FAILED) {\n                        s2 = peg$currPos;\n                        if (input.charCodeAt(peg$currPos) === 116) {\n                          s3 = peg$c75;\n                          peg$currPos++;\n                        } else {\n                          s3 = peg$FAILED;\n                          if (peg$silentFails === 0) { peg$fail(peg$c76); }\n                        }\n                        if (s3 !== peg$FAILED) {\n                          peg$savedPos = s2;\n                          s3 = peg$c77();\n                        }\n                        s2 = s3;\n                        if (s2 === peg$FAILED) {\n                          s2 = peg$currPos;\n                          if (input.charCodeAt(peg$currPos) === 117) {\n                            s3 = peg$c78;\n                            peg$currPos++;\n                          } else {\n                            s3 = peg$FAILED;\n                            if (peg$silentFails === 0) { peg$fail(peg$c79); }\n                          }\n                          if (s3 !== peg$FAILED) {\n                            s4 = peg$currPos;\n                            s5 = peg$currPos;\n                            s6 = peg$parseHexDigit();\n                            if (s6 !== peg$FAILED) {\n                              s7 = peg$parseHexDigit();\n                              if (s7 !== peg$FAILED) {\n                                s8 = peg$parseHexDigit();\n                                if (s8 !== peg$FAILED) {\n                                  s9 = peg$parseHexDigit();\n                                  if (s9 !== peg$FAILED) {\n                                    s6 = [s6, s7, s8, s9];\n                                    s5 = s6;\n                                  } else {\n                                    peg$currPos = s5;\n                                    s5 = peg$FAILED;\n                                  }\n                                } else {\n                                  peg$currPos = s5;\n                                  s5 = peg$FAILED;\n                                }\n                              } else {\n                                peg$currPos = s5;\n                                s5 = peg$FAILED;\n                              }\n                            } else {\n                              peg$currPos = s5;\n                              s5 = peg$FAILED;\n                            }\n                            if (s5 !== peg$FAILED) {\n                              s4 = input.substring(s4, peg$currPos);\n                            } else {\n                              s4 = s5;\n                            }\n                            if (s4 !== peg$FAILED) {\n                              peg$savedPos = s2;\n                              s3 = peg$c80(s4);\n                              s2 = s3;\n                            } else {\n                              peg$currPos = s2;\n                              s2 = peg$FAILED;\n                            }\n                          } else {\n                            peg$currPos = s2;\n                            s2 = peg$FAILED;\n                          }\n                        }\n                      }\n                    }\n                  }\n                }\n              }\n            }\n          }\n        }\n        if (s2 !== peg$FAILED) {\n          peg$savedPos = s0;\n          s1 = peg$c81(s2);\n          s0 = s1;\n        } else {\n          peg$currPos = s0;\n          s0 = peg$FAILED;\n        }\n      } else {\n        peg$currPos = s0;\n        s0 = peg$FAILED;\n      }\n      peg$silentFails--;\n      if (s0 === peg$FAILED) {\n        s1 = peg$FAILED;\n        if (peg$silentFails === 0) { peg$fail(peg$c58); }\n      }\n\n      return s0;\n    }\n\n    function peg$parseDigit() {\n      var s0;\n\n      if (peg$c82.test(input.charAt(peg$currPos))) {\n        s0 = input.charAt(peg$currPos);\n        peg$currPos++;\n      } else {\n        s0 = peg$FAILED;\n        if (peg$silentFails === 0) { peg$fail(peg$c83); }\n      }\n\n      return s0;\n    }\n\n    function peg$parseHexDigit() {\n      var s0;\n\n      if (peg$c84.test(input.charAt(peg$currPos))) {\n        s0 = input.charAt(peg$currPos);\n        peg$currPos++;\n      } else {\n        s0 = peg$FAILED;\n        if (peg$silentFails === 0) { peg$fail(peg$c85); }\n      }\n\n      return s0;\n    }\n\n    function peg$parseLineTerminator() {\n      var s0;\n\n      if (peg$c86.test(input.charAt(peg$currPos))) {\n        s0 = input.charAt(peg$currPos);\n        peg$currPos++;\n      } else {\n        s0 = peg$FAILED;\n        if (peg$silentFails === 0) { peg$fail(peg$c87); }\n      }\n\n      return s0;\n    }\n\n    peg$result = peg$startRuleFunction();\n\n    if (peg$result !== peg$FAILED && peg$currPos === input.length) {\n      return peg$result;\n    } else {\n      if (peg$result !== peg$FAILED && peg$currPos < input.length) {\n        peg$fail({ type: \"end\", description: \"end of input\" });\n      }\n\n      throw peg$buildException(\n        null,\n        peg$maxFailExpected,\n        peg$maxFailPos < input.length ? input.charAt(peg$maxFailPos) : null,\n        peg$maxFailPos < input.length\n          ? peg$computeLocation(peg$maxFailPos, peg$maxFailPos + 1)\n          : peg$computeLocation(peg$maxFailPos, peg$maxFailPos)\n      );\n    }\n  }\n\n  return {\n    SyntaxError: peg$SyntaxError,\n    parse:       peg$parse\n  };\n})();\n\n},{}],8:[function(require,module,exports){\nvar Editor;\n\nmodule.exports = Editor = class Editor {\n  constructor(loaderFunc, loader) {\n    var $editorBox, editorWidthPercentage, preset, ref;\n    this.loaderFunc = loaderFunc;\n    editorWidthPercentage = 30;\n    $editorBox = $($.parseHTML('<div class=\"column\"></div>'));\n    $editorBox.width(editorWidthPercentage + '%');\n    $('#net-column').width((100 - editorWidthPercentage) + '%');\n    $('#master-container').prepend($editorBox);\n    preset = (ref = loader.dataLoaded) != null ? ref : '# Enter your network definition here.\\n# Use Shift+Enter to update the visualization.';\n    this.editor = CodeMirror($editorBox[0], {\n      value: preset,\n      lineNumbers: true,\n      lineWrapping: true\n    });\n    this.editor.on('keydown', (cm, e) => {\n      return this.onKeyDown(e);\n    });\n  }\n\n  reload(loaderFunc, loader) {\n    var preset, ref;\n    this.loaderFunc = loaderFunc;\n    preset = (ref = loader.dataLoaded) != null ? ref : '# Enter your network definition here.\\n# Use Shift+Enter to update the visualization.';\n    return this.editor.setValue(preset);\n  }\n\n  //alert(preset)\n  onKeyDown(e) {\n    if (e.shiftKey && e.keyCode === 13) {\n      // Using onKeyDown lets us prevent the default action,\n      // even if an error is encountered (say, due to parsing).\n      // This would not be possible with keymaps.\n      e.preventDefault();\n      return this.loaderFunc(this.editor.getValue());\n    }\n  }\n\n};\n\n\n},{}],9:[function(require,module,exports){\nvar Loader;\n\nmodule.exports = Loader = class Loader {\n  constructor(parser) {\n    this.fromGist = this.fromGist.bind(this);\n    this.fromURL = this.fromURL.bind(this);\n    this.fromPreset = this.fromPreset.bind(this);\n    this.load = this.load.bind(this);\n    this.parser = parser;\n    // The parser is a unary function that accepts the network source\n    // and outputs a Network instance.\n    this.dataLoaded = null;\n  }\n\n  fromGist(gistID, callback) {\n    var url;\n    // Load the model with the given Gist ID.\n    url = 'https://api.github.com/gists/' + gistID;\n    return $.getJSON(url, (data) => {\n      var fileInfo, fileKey, fileSet, filename, isProto, isSolitaryFile, isSolver;\n      fileSet = data['files'];\n      isSolitaryFile = Object.keys(fileSet).length === 1;\n      for (fileKey in fileSet) {\n        fileInfo = fileSet[fileKey];\n        filename = fileInfo['filename'].toLowerCase();\n        isProto = _.endsWith(filename, '.prototxt');\n        isSolver = _.startsWith(filename, 'solver');\n        if ((isProto && !isSolver) || isSolitaryFile) {\n          this.load(fileInfo['content'], callback);\n          return;\n        }\n      }\n      return console.log('No prototxt found in the given GIST.');\n    });\n  }\n\n  fromURL(url, callback) {\n    // Load the model from the given URL.\n    // This may fail due to same-origin policy.\n    return $.ajax({\n      url: url,\n      success: () => {\n        return this.load(data, callback);\n      }\n    });\n  }\n\n  fromPreset(name, callback) {\n    // Load a preset model. Caffe Only.\n    return $.get('./presets/' + name + '.prototxt', (data) => {\n      return this.load(data, callback);\n    });\n  }\n\n  load(data, callback) {\n    var net;\n    this.dataLoaded = data;\n    net = this.parser.parse(data);\n    if (!_.isUndefined(callback)) {\n      callback(net);\n    }\n    return net;\n  }\n\n};\n\n\n},{}],10:[function(require,module,exports){\nvar AppController, CaffeNetwork, Loader, showDocumentation;\n\nAppController = require('./app.coffee');\n\nCaffeNetwork = require('./caffe/caffe.coffee');\n\nLoader = require('./loader.coffee');\n\nwindow.do_variants_analysis = false;\n\nshowDocumentation = function() {\n  return window.location.href = 'quickstart.html';\n};\n\n$(document).ready(function() {\n  var app, loader, makeLoader, router, routes;\n  app = new AppController();\n  // Setup Caffe model loader.\n  // This can be replaced with any arbitrary parser to support\n  // formats other than Caffe.\n  loader = new Loader(CaffeNetwork);\n  // Helper function for wrapping the load calls.\n  makeLoader = function(loadingFunc, loader) {\n    return function(...args) {\n      return app.startLoading(loadingFunc, loader, ...args);\n    };\n  };\n  // Register routes\n  routes = {\n    '/gist/:gistID': makeLoader(loader.fromGist, loader),\n    '/url/(.+)': makeLoader(loader.fromURL, loader),\n    '/preset/:name': makeLoader(loader.fromPreset, loader),\n    '/editor(/?)': () => {\n      return app.showEditor(loader);\n    },\n    '/doc': () => {\n      return showDocumentation();\n    }\n  };\n  router = Router(routes);\n  return router.init('/doc');\n});\n\n\n},{\"./app.coffee\":5,\"./caffe/caffe.coffee\":6,\"./loader.coffee\":9}],11:[function(require,module,exports){\nvar Network, Node,\n  indexOf = [].indexOf;\n\nNode = class Node {\n  constructor(name, type1, attribs1 = {}, analysis1 = {}) {\n    this.addChild = this.addChild.bind(this);\n    this.addChildren = this.addChildren.bind(this);\n    this.addParent = this.addParent.bind(this);\n    this.addParents = this.addParents.bind(this);\n    this.detachChild = this.detachChild.bind(this);\n    this.detachChildren = this.detachChildren.bind(this);\n    this.name = name;\n    this.type = type1;\n    this.attribs = attribs1;\n    this.analysis = analysis1;\n    this.parents = [];\n    this.children = [];\n    // Nodes to be coalesced (by the renderer) with the current one.\n    // For instance, this can be used for grouping in-place operations.\n    // Note that this assumes the nodes to be coalesced and the current\n    // node form a simple chain structure.\n    this.coalesce = [];\n  }\n\n  addChild(child) {\n    if (indexOf.call(this.children, child) < 0) {\n      this.children.push(child);\n      if (indexOf.call(child.parents, this) < 0) {\n        return child.parents.push(this);\n      }\n    }\n  }\n\n  addChildren(children) {\n    return _.forEach(children, (c) => {\n      return this.addChild(c);\n    });\n  }\n\n  addParent(parent) {\n    return parent.addChild(this);\n  }\n\n  addParents(parents) {\n    return _.forEach(parents, (p) => {\n      return this.addParent(p);\n    });\n  }\n\n  detachChild(child) {\n    _.pull(this.children, child);\n    return _.pull(child.parents, this);\n  }\n\n  detachChildren() {\n    var children;\n    children = _.clone(this.children);\n    _.forEach(children, (c) => {\n      return this.detachChild(c);\n    });\n    return children;\n  }\n\n};\n\nmodule.exports = Network = class Network {\n  constructor(name = 'Untitled Network') {\n    this.sortTopologically = this.sortTopologically.bind(this);\n    this.name = name;\n    this.nodes = [];\n  }\n\n  createNode(label, type, attribs, analysis) {\n    var node;\n    node = new Node(label, type, attribs, analysis);\n    this.nodes.push(node);\n    return node;\n  }\n\n  sortTopologically() {\n    var i, j, len, len1, node, sortedNodes, unsortedNodes, visit;\n    sortedNodes = [];\n    unsortedNodes = _.clone(this.nodes);\n    for (i = 0, len = unsortedNodes.length; i < len; i++) {\n      node = unsortedNodes[i];\n      node.sort_ = {\n        temp: false,\n        perm: false\n      };\n    }\n    visit = function(node) {\n      var child, j, len1, ref;\n      if (node.sort_.temp === true) {\n        throw \"Graph is not a DAG.\";\n      }\n      if (node.sort_.perm) {\n        return;\n      }\n      node.sort_.temp = true;\n      ref = node.children;\n      for (j = 0, len1 = ref.length; j < len1; j++) {\n        child = ref[j];\n        visit(child);\n      }\n      node.sort_.perm = true;\n      node.sort_.temp = false;\n      return sortedNodes.unshift(node);\n    };\n    while (unsortedNodes.length !== 0) {\n      visit(unsortedNodes.pop());\n    }\n    for (j = 0, len1 = sortedNodes.length; j < len1; j++) {\n      node = sortedNodes[j];\n      delete node.sort_;\n    }\n    return sortedNodes;\n  }\n\n};\n\n\n},{}],12:[function(require,module,exports){\nvar Renderer, Tableify,\n  hasProp = {}.hasOwnProperty;\n\nTableify = require('tableify');\n\nrequire('tablesorter');\n\nmodule.exports = Renderer = class Renderer {\n  constructor(net, parent1, table) {\n    this.net = net;\n    this.parent = parent1;\n    this.table = table;\n    this.iconify = false;\n    this.layoutDirection = 'tb';\n    this.generateGraph();\n    this.renderTable();\n  }\n\n  setupGraph() {\n    this.graph = new dagreD3.graphlib.Graph();\n    this.graph.setDefaultEdgeLabel((function() {\n      return {};\n    }));\n    return this.graph.setGraph({\n      rankdir: this.layoutDirection,\n      ranksep: 10, // Vertical node separation\n      nodesep: 5, // Horizontal node separation\n      edgesep: 10, // Horizontal edge separation\n      marginx: 0, // Horizontal graph margin\n      marginy: 0 // Vertical graph margin\n    });\n  }\n\n  generateGraph() {\n    var child, j, k, l, lastCoalesed, layers, len, len1, len2, len3, len4, m, node, nodes, o, parent, ref, ref1, ref2, ref3, sink, source, uberParents;\n    this.setupGraph();\n    nodes = this.net.sortTopologically();\n    for (j = 0, len = nodes.length; j < len; j++) {\n      node = nodes[j];\n      if (node.isInGraph) {\n        continue;\n      }\n      layers = [node].concat(node.coalesce);\n      if (layers.length > 1) {\n        // Rewire the node following the last coalesced node to this one\n        lastCoalesed = layers[layers.length - 1];\n        ref = lastCoalesed.children;\n        for (k = 0, len1 = ref.length; k < len1; k++) {\n          child = ref[k];\n          uberParents = _.clone(child.parents);\n          uberParents[uberParents.indexOf(lastCoalesed)] = node;\n          child.parents = uberParents;\n        }\n      }\n      this.insertNode(layers);\n      ref1 = node.parents;\n      for (l = 0, len2 = ref1.length; l < len2; l++) {\n        parent = ref1[l];\n        this.insertLink(parent, node);\n      }\n    }\n    ref2 = this.graph.sources();\n    for (m = 0, len3 = ref2.length; m < len3; m++) {\n      source = ref2[m];\n      (this.graph.node(source)).class = 'node-type-source';\n    }\n    ref3 = this.graph.sinks();\n    for (o = 0, len4 = ref3.length; o < len4; o++) {\n      sink = ref3[o];\n      (this.graph.node(sink)).class = 'node-type-sink';\n    }\n    return this.render();\n  }\n\n  generateTable() {\n    var entry, id, idx, j, k, key, l, len, len1, len2, n, ref, tbl, val, variant, variantcopy, worstcasepervariant;\n    entry = {\n      name: 'start'\n    };\n    tbl = [];\n    id = 0;\n    worstcasepervariant = null;\n    ref = this.net.sortTopologically();\n    // Build up Layer Table\n    for (j = 0, len = ref.length; j < len; j++) {\n      n = ref[j];\n      // summarize Values in Variant Implementations\n      if (do_variants_analysis) {\n        if (n.analysis.variants.length > 0) {\n          if (!worstcasepervariant) { // initial copy\n            worstcasepervariant = _.cloneDeep(n.analysis.variants);\n          }\n          variantcopy = _.extend([], n.analysis.variants);\n          for (idx = k = 0, len1 = variantcopy.length; k < len1; idx = ++k) {\n            variant = variantcopy[idx];\n            for (key in variant) {\n              val = variant[key];\n              if (worstcasepervariant[idx][key] < val) {\n                worstcasepervariant[idx][key] = val;\n              }\n            }\n            for (key in variant) {\n              val = variant[key];\n              if (val > 0) {\n                variant[key] = this.toSuffixForm(val);\n              }\n            }\n          }\n        }\n      }\n      id++;\n      entry = {\n        ID: id,\n        name: n.name,\n        type: n.type,\n        batch: n.analysis.batchIn,\n        ch_in: n.analysis.chIn,\n        dim_in: n.analysis.wIn + 'x' + n.analysis.hIn,\n        ch_out: n.analysis.chOut,\n        dim_out: n.analysis.wOut + 'x' + n.analysis.hOut,\n        ops_raw: n.analysis.comp,\n        mem_raw: n.analysis.mem\n      };\n      if (do_variants_analysis) {\n        entry.implementations = n.analysis.variants;\n      }\n      tbl.push(entry);\n    }\n    if (do_variants_analysis && worstcasepervariant) {\n      // worst case variant summary\n      for (l = 0, len2 = worstcasepervariant.length; l < len2; l++) {\n        variant = worstcasepervariant[l];\n        for (key in variant) {\n          val = variant[key];\n          if (val > 0) {\n            variant[key] = this.toSuffixForm(val);\n          }\n        }\n      }\n      entry = {\n        ID: 999,\n        name: \"Worst-Case Requirements\",\n        implementations: worstcasepervariant\n      };\n      tbl.push(entry);\n    }\n    return tbl;\n  }\n\n  toSuffixForm(num, decimals = 2) {\n    var exponent, exponents, factor, i, j, len, suffices, suffix;\n    exponents = [12, 9, 6, 3];\n    suffices = [\"T\", \"G\", \"M\", \"k\"];\n    decimals = Math.pow(10, decimals);\n    //debugger\n    for (i = j = 0, len = exponents.length; j < len; i = ++j) {\n      exponent = exponents[i];\n      suffix = suffices[i];\n      factor = Math.pow(10, exponent);\n      if (num > factor) {\n        return Math.round(num / factor * decimals) / decimals + suffix;\n      }\n    }\n    // too small, no suffix\n    return num;\n  }\n\n  summarizeTable(tbl) {\n    var entry, j, k, key, len, len1, n, num_subs, ref, ref1, ref2, ref3, ref4, ref5, slashindex, summary, summary_without_raw, total, val;\n    entry = {\n      name: 'start'\n    };\n    summary = [];\n    num_subs = 0;\n    for (j = 0, len = tbl.length; j < len; j++) {\n      n = tbl[j];\n      slashindex = n.name.indexOf('/');\n      if (slashindex > 0 && entry.name.substring(0, slashindex) === n.name.substring(0, slashindex)) { // layer has same prefix as current summary item\n        num_subs++;\n        entry.name = n.name.substring(0, slashindex);\n        entry.type = 'submodule(' + num_subs + ')';\n        entry.ch_out = n.ch_out;\n        entry.dim_out = n.dim_out;\n        for (key in entry.ops_raw) {\n          entry.ops_raw[key] += n.ops_raw[key];\n        }\n        for (key in entry.mem_raw) {\n          entry.mem_raw[key] += n.mem_raw[key];\n        }\n        ref = entry.ops_raw;\n        for (key in ref) {\n          val = ref[key];\n          if (val > 0) {\n            entry.ops[key] = this.toSuffixForm(val);\n          }\n        }\n        ref1 = entry.mem_raw;\n        for (key in ref1) {\n          val = ref1[key];\n          if (val > 0) {\n            entry.mem[key] = this.toSuffixForm(val);\n          }\n        }\n        //debugger\n        summary.pop();\n        summary.push(entry);\n      } else {\n        num_subs = 0;\n        entry = {\n          ID: n.ID,\n          name: n.name,\n          type: n.type,\n          batch: n.batchIn,\n          ch_in: n.ch_in,\n          dim_in: n.dim_in,\n          ch_out: n.ch_out,\n          dim_out: n.dim_out,\n          ops_raw: _.extend({}, n.ops_raw),\n          mem_raw: _.extend({}, n.mem_raw),\n          ops: {},\n          mem: {}\n        };\n        ref2 = entry.ops_raw;\n        for (key in ref2) {\n          val = ref2[key];\n          if (val > 0) {\n            entry.ops[key] = this.toSuffixForm(val);\n          }\n        }\n        ref3 = entry.mem_raw;\n        for (key in ref3) {\n          val = ref3[key];\n          if (val > 0) {\n            entry.mem[key] = this.toSuffixForm(val);\n          }\n        }\n        summary.push(entry);\n      }\n    }\n    // initialize TOTAL row\n    total = {\n      name: 'TOTAL',\n      ops_raw: {},\n      mem_raw: {},\n      ops: {},\n      mem: {}\n    };\n    _.extend(total.ops_raw, summary[0].ops_raw); // copy zeros from data layer\n    _.extend(total.mem_raw, summary[0].mem_raw); // idem\n    total.mem_raw.activation = 0; // data layer already uses activation --> set to zero\n    for (k = 0, len1 = summary.length; k < len1; k++) {\n      entry = summary[k];\n      for (key in entry.ops_raw) {\n        //debugger\n        total.ops_raw[key] += entry.ops_raw[key];\n      }\n      for (key in entry.mem_raw) {\n        total.mem_raw[key] += entry.mem_raw[key];\n      }\n    }\n    ref4 = total.ops_raw;\n    for (key in ref4) {\n      val = ref4[key];\n      total.ops[key] = this.toSuffixForm(val);\n    }\n    ref5 = total.mem_raw;\n    for (key in ref5) {\n      val = ref5[key];\n      total.mem[key] = this.toSuffixForm(val);\n    }\n    summary.push(total);\n    summary_without_raw = (function() {\n      var l, len2, results;\n      results = [];\n      for (l = 0, len2 = summary.length; l < len2; l++) {\n        entry = summary[l];\n        results.push(_.omit(entry, ['ops_raw', 'mem_raw']));\n      }\n      return results;\n    })();\n    return summary_without_raw;\n  }\n\n  renderTable() {\n    var $node_elem, $table_elem, areatbl, detail, dim_in, entry, j, k, len, len1, line, ref, ref1, ref2, ref3, ref4, row, row_array, scroll_to, suffix, summary, summary_body, summary_table;\n    // Generate Detail Table and Summary\n    detail = this.generateTable();\n    summary = this.summarizeTable(detail);\n    $(this.table).html('<h3>Summary:</h3><a id=\"summary\"></a>' + Tableify(summary) + '<h3>Details:</h3><a id=\"details\"></a>' + Tableify(detail));\n    $(this.table + ' table').tablesorter();\n    // Add Click-to-Scroll Handlers\n    // Closure Function that executes scroll:\n    scroll_to = function(el) {\n      return function() {\n        var removeHighlight, top_coord;\n        top_coord = $(el).offset().top - 200;\n        $(\"body,html\").animate({\n          scrollTop: top_coord\n        }, 200);\n        $(el).addClass('node-highlight');\n        removeHighlight = function(node) {\n          return function() {\n            return $(node).removeClass('node-highlight');\n          };\n        };\n        return window.setTimeout(removeHighlight(el), 4000);\n      };\n    };\n    // Add Click-to-Scroll to all summary rows, except last\n    summary_table = $(this.table + ' table')[0];\n    summary_body = summary_table.children[1];\n    row_array = Array.prototype.slice.call(summary_body.children);\n    ref = row_array.slice(0, -1);\n    for (j = 0, len = ref.length; j < len; j++) {\n      row = ref[j];\n      // Add Link between Node and Table Element -> both directions work\n      $table_elem = $(row.children[1]);\n      $node_elem = $('div[id^=\"node-' + $table_elem.text() + '\"]');\n      $table_elem.click(scroll_to($node_elem));\n      $node_elem.click(scroll_to($table_elem));\n    }\n    if (do_variants_analysis) {\n      // Calculate Per-Layer Statistics\n      areatbl = [];\n      for (k = 0, len1 = detail.length; k < len1; k++) {\n        entry = detail[k];\n        if (!(entry.type === \"Convolution\" || entry.type === \"Concat\" || entry.type === \"SoftmaxWithLoss\" || entry.type === \"innerproduct\")) {\n          continue;\n        }\n        // extract input dimension:\n        dim_in = (ref1 = entry.dim_in) != null ? ref1.split(\"x\").pop() : void 0;\n        // add entry\n        suffix = \" \" + this.net.name;\n        line = {};\n        line[\"layer\"] = entry.name;\n        line[\"capacity\" + suffix] = ((ref2 = entry.mem_raw) != null ? ref2.activation : void 0) > 0 ? entry.mem_raw.activation : \"\";\n        line[\"macc \" + suffix] = ((ref3 = entry.ops_raw) != null ? ref3.macc : void 0) > 0 ? entry.ops_raw.macc : \"\";\n        line[\"param \" + suffix] = ((ref4 = entry.mem_raw) != null ? ref4.param : void 0) > 0 ? entry.mem_raw.param : \"\";\n        line[\"ch_out \" + suffix] = entry.ch_out;\n        line[\"width \" + suffix] = dim_in;\n        areatbl.push(line);\n      }\n      $(Tableify(areatbl)).appendTo(this.table);\n    }\n    return null;\n  }\n\n  insertNode(layers) {\n    var baseNode, j, layer, len, nodeClass, nodeDesc, nodeLabel;\n    baseNode = layers[0];\n    nodeClass = 'node-type-' + baseNode.type.replace(/_/g, '-').toLowerCase();\n    nodeLabel = '';\n    for (j = 0, len = layers.length; j < len; j++) {\n      layer = layers[j];\n      layer.isInGraph = true;\n      nodeLabel += this.generateLabel(layer);\n      nodeDesc = {\n        labelType: 'html',\n        label: nodeLabel,\n        class: nodeClass,\n        layers: layers,\n        rx: 5,\n        ry: 5\n      };\n    }\n    if (this.iconify) {\n      _.extend(nodeDesc, {\n        shape: 'circle'\n      });\n    }\n    return this.graph.setNode(baseNode.name, nodeDesc);\n  }\n\n  generateLabel(layer) {\n    if (!this.iconify) {\n      return '<div class=\"node-label\" id=\"node-' + layer.name + '\">' + layer.name + '</div>';\n    } else {\n      return '';\n    }\n  }\n\n  insertLink(src, dst) {\n    var b, ch, h, lbl, ref, ref1, ref2, ref3, w;\n    if (!this.iconify) {\n      ch = (ref = src.analysis.chOut) != null ? ref : \"?\";\n      w = (ref1 = src.analysis.wOut) != null ? ref1 : \"?\";\n      h = (ref2 = src.analysis.hOut) != null ? ref2 : \"?\";\n      b = (ref3 = src.analysis.batchOut) != null ? ref3 : \"?\";\n      lbl = ch + 'ch ⋅ ' + w + '×' + h;\n      if (b > 1) {\n        lbl += ' (×' + b + ')';\n      }\n    } else {\n      lbl = '';\n    }\n    return this.graph.setEdge(src.name, dst.name, {\n      arrowhead: 'vee',\n      label: lbl\n    });\n  }\n\n  renderKey(key) {\n    return key.replace(/_/g, ' ');\n  }\n\n  renderValue(value) {\n    if (Array.isArray(value)) {\n      return value.join(', ');\n    }\n    return value;\n  }\n\n  renderSection(section) {\n    var isSection, key, s, val;\n    s = '';\n    for (key in section) {\n      if (!hasProp.call(section, key)) continue;\n      val = section[key];\n      isSection = (typeof val === 'object') && !Array.isArray(val);\n      if (isSection) {\n        s += '<div class=\"node-param-section-title node-param-key\">' + this.renderKey(key) + '</div>';\n        s += '<div class=\"node-param-section\">';\n        s += this.renderSection(val);\n      } else {\n        s += '<div class=\"node-param-row\">';\n        s += '<span class=\"node-param-key\">' + this.renderKey(key) + ': </span>';\n        s += '<span class=\"node-param-value\">' + this.renderValue(val) + '</span>';\n      }\n      s += '</div>';\n    }\n    return s;\n  }\n\n  tipForNode(nodeKey) {\n    var j, layer, len, node, ref, s;\n    node = this.graph.node(nodeKey);\n    s = '';\n    ref = node.layers;\n    for (j = 0, len = ref.length; j < len; j++) {\n      layer = ref[j];\n      s += '<div class=\"node-info-group\">';\n      s += '<div class=\"node-info-header\">';\n      s += '<span class=\"node-info-title\">' + layer.name + '</span>';\n      s += ' &middot; ';\n      s += '<span class=\"node-info-type\">' + this.renderKey(layer.type) + '</span>';\n      if (layer.annotation != null) {\n        s += ' &middot; <span class=\"node-info-annotation\">' + layer.annotation + '</span>';\n      }\n      s += '</div>';\n      s += this.renderSection(layer.attribs);\n    }\n    return s;\n  }\n\n  render() {\n    var bbox, graphRender, svg, svgGroup, that, tipPositions;\n    svg = d3.select(this.parent);\n    svgGroup = svg.append('g');\n    graphRender = new dagreD3.render();\n    graphRender(svgGroup, this.graph);\n    // Size to fit.\n    // getBBox appears to do the right thing on Chrome,\n    // but not on Firefox. getBoundingClientRect works on both.\n    bbox = svgGroup.node().getBoundingClientRect();\n    svg.attr('width', bbox.width);\n    svg.attr('height', bbox.height);\n    // Configure Tooltips.\n    tipPositions = {\n      tb: {\n        my: 'left center',\n        at: 'right center'\n      },\n      lr: {\n        my: 'top center',\n        at: 'bottom center'\n      }\n    };\n    that = this;\n    return svgGroup.selectAll(\"g.node\").each(function(nodeKey) {\n      var position;\n      position = tipPositions[that.layoutDirection];\n      position.viewport = $(window);\n      return $(this).qtip({\n        content: {\n          text: that.tipForNode(nodeKey)\n        },\n        position: position,\n        show: {\n          delay: 0,\n          effect: false\n        },\n        hide: {\n          effect: false\n        }\n      });\n    });\n  }\n\n};\n\n\n},{\"tableify\":2,\"tablesorter\":3}]},{},[10]);\n"
  },
  {
    "path": "index.html",
    "content": "<!DOCTYPE html>\n<html>\n<head>\n    <meta charset=\"utf-8\">\n\t<meta name=\"description\" content=\"Netscope Visualization Tool for Convolutional Neural Networks\">\n\t<meta name=\"keywords\" content=\"netscope, CNN, visualization, tool, neural network, convnet, graph, deep learning\">\n\t<meta name=\"autho\" content=\"dgschwend\">\n    <title>Netscope CNN Analyzer</title>\n    <link href='http://fonts.googleapis.com/css?family=Roboto:400,300' rel='stylesheet' type='text/css'>\n    <link rel=\"stylesheet\" href=\"assets/css/tooltip.css\">\n    <link rel=\"stylesheet\" href=\"assets/css/codemirror.css\">\n    <link rel=\"stylesheet\" href=\"assets/css/netscope.css\">\n    <link rel=\"stylesheet\" href=\"assets/css/tablesorter.css\">\n    <script src=\"assets/js/lib/lodash.min.js\"></script>\n    <script src=\"assets/js/lib/jquery.min.js\"></script>\n    <script src=\"assets/js/lib/jquery.qtip.min.js\"></script>\n    <script src=\"assets/js/lib/d3.min.js\"></script>\n    <script src=\"assets/js/lib/dagre-d3.min.js\"></script>\n    <script src=\"assets/js/lib/director.min.js\"></script>\n    <script src=\"assets/js/netscope.js\"></script>\n</head>\n<body>\n<div id=\"master-container\">\n    <div id='net-column' class=\"column\">\n        <div id=\"net-spinner\">\n            <img src=\"assets/img/loading.svg\" title=\"Loading network...\" />\n        </div>\n        <div id=\"net-error\" style=\"display:none\">\n            <div class=\"title\">Error Encountered</div>\n            <div class=\"msg\"></div>\n        </div>\n        <div id=\"net-container\">\n            <div id=\"net-group\">\n                <h1 id=\"net-title\"></h1>\n                <svg id=\"net-svg\"></svg>\n            </div>\n        </div>\n        <div id=\"table-container\">\n\t\t\t<h2 id=\"table-header\"><a id=\"analysis\">Network Analysis</a></h2>\n\t\t\t<div id=\"table-content\">\n\t\t\t</div>\n        </div>\n    </div>\n</div>\n</body>\n</html>\n"
  },
  {
    "path": "presets/SSD300.prototxt",
    "content": "name: \"VGG_VOC0712_SSD_300x300_deploy\"\ninput: \"data\"\ninput_shape {\n  dim: 1\n  dim: 3\n  dim: 300\n  dim: 300\n}\nlayer {\n  name: \"conv1_1\"\n  type: \"Convolution\"\n  bottom: \"data\"\n  top: \"conv1_1\"\n  param {\n    lr_mult: 1\n    decay_mult: 1\n  }\n  param {\n    lr_mult: 2\n    decay_mult: 0\n  }\n  convolution_param {\n    num_output: 64\n    pad: 1\n    kernel_size: 3\n    weight_filler {\n      type: \"xavier\"\n    }\n    bias_filler {\n      type: \"constant\"\n      value: 0\n    }\n  }\n}\nlayer {\n  name: \"relu1_1\"\n  type: \"ReLU\"\n  bottom: \"conv1_1\"\n  top: \"conv1_1\"\n}\nlayer {\n  name: \"conv1_2\"\n  type: \"Convolution\"\n  bottom: \"conv1_1\"\n  top: \"conv1_2\"\n  param {\n    lr_mult: 1\n    decay_mult: 1\n  }\n  param {\n    lr_mult: 2\n    decay_mult: 0\n  }\n  convolution_param {\n    num_output: 64\n    pad: 1\n    kernel_size: 3\n    weight_filler {\n      type: \"xavier\"\n    }\n    bias_filler {\n      type: \"constant\"\n      value: 0\n    }\n  }\n}\nlayer {\n  name: \"relu1_2\"\n  type: \"ReLU\"\n  bottom: \"conv1_2\"\n  top: \"conv1_2\"\n}\nlayer {\n  name: \"pool1\"\n  type: \"Pooling\"\n  bottom: \"conv1_2\"\n  top: \"pool1\"\n  pooling_param {\n    pool: MAX\n    kernel_size: 2\n    stride: 2\n  }\n}\nlayer {\n  name: \"conv2_1\"\n  type: \"Convolution\"\n  bottom: \"pool1\"\n  top: \"conv2_1\"\n  param {\n    lr_mult: 1\n    decay_mult: 1\n  }\n  param {\n    lr_mult: 2\n    decay_mult: 0\n  }\n  convolution_param {\n    num_output: 128\n    pad: 1\n    kernel_size: 3\n    weight_filler {\n      type: \"xavier\"\n    }\n    bias_filler {\n      type: \"constant\"\n      value: 0\n    }\n  }\n}\nlayer {\n  name: \"relu2_1\"\n  type: \"ReLU\"\n  bottom: \"conv2_1\"\n  top: \"conv2_1\"\n}\nlayer {\n  name: \"conv2_2\"\n  type: \"Convolution\"\n  bottom: \"conv2_1\"\n  top: \"conv2_2\"\n  param {\n    lr_mult: 1\n    decay_mult: 1\n  }\n  param {\n    lr_mult: 2\n    decay_mult: 0\n  }\n  convolution_param {\n    num_output: 128\n    pad: 1\n    kernel_size: 3\n    weight_filler {\n      type: \"xavier\"\n    }\n    bias_filler {\n      type: \"constant\"\n      value: 0\n    }\n  }\n}\nlayer {\n  name: \"relu2_2\"\n  type: \"ReLU\"\n  bottom: \"conv2_2\"\n  top: \"conv2_2\"\n}\nlayer {\n  name: \"pool2\"\n  type: \"Pooling\"\n  bottom: \"conv2_2\"\n  top: \"pool2\"\n  pooling_param {\n    pool: MAX\n    kernel_size: 2\n    stride: 2\n  }\n}\nlayer {\n  name: \"conv3_1\"\n  type: \"Convolution\"\n  bottom: \"pool2\"\n  top: \"conv3_1\"\n  param {\n    lr_mult: 1\n    decay_mult: 1\n  }\n  param {\n    lr_mult: 2\n    decay_mult: 0\n  }\n  convolution_param {\n    num_output: 256\n    pad: 1\n    kernel_size: 3\n    weight_filler {\n      type: \"xavier\"\n    }\n    bias_filler {\n      type: \"constant\"\n      value: 0\n    }\n  }\n}\nlayer {\n  name: \"relu3_1\"\n  type: \"ReLU\"\n  bottom: \"conv3_1\"\n  top: \"conv3_1\"\n}\nlayer {\n  name: \"conv3_2\"\n  type: \"Convolution\"\n  bottom: \"conv3_1\"\n  top: \"conv3_2\"\n  param {\n    lr_mult: 1\n    decay_mult: 1\n  }\n  param {\n    lr_mult: 2\n    decay_mult: 0\n  }\n  convolution_param {\n    num_output: 256\n    pad: 1\n    kernel_size: 3\n    weight_filler {\n      type: \"xavier\"\n    }\n    bias_filler {\n      type: \"constant\"\n      value: 0\n    }\n  }\n}\nlayer {\n  name: \"relu3_2\"\n  type: \"ReLU\"\n  bottom: \"conv3_2\"\n  top: \"conv3_2\"\n}\nlayer {\n  name: \"conv3_3\"\n  type: \"Convolution\"\n  bottom: \"conv3_2\"\n  top: \"conv3_3\"\n  param {\n    lr_mult: 1\n    decay_mult: 1\n  }\n  param {\n    lr_mult: 2\n    decay_mult: 0\n  }\n  convolution_param {\n    num_output: 256\n    pad: 1\n    kernel_size: 3\n    weight_filler {\n      type: \"xavier\"\n    }\n    bias_filler {\n      type: \"constant\"\n      value: 0\n    }\n  }\n}\nlayer {\n  name: \"relu3_3\"\n  type: \"ReLU\"\n  bottom: \"conv3_3\"\n  top: \"conv3_3\"\n}\nlayer {\n  name: \"pool3\"\n  type: \"Pooling\"\n  bottom: \"conv3_3\"\n  top: \"pool3\"\n  pooling_param {\n    pool: MAX\n    kernel_size: 2\n    stride: 2\n  }\n}\nlayer {\n  name: \"conv4_1\"\n  type: \"Convolution\"\n  bottom: \"pool3\"\n  top: \"conv4_1\"\n  param {\n    lr_mult: 1\n    decay_mult: 1\n  }\n  param {\n    lr_mult: 2\n    decay_mult: 0\n  }\n  convolution_param {\n    num_output: 512\n    pad: 1\n    kernel_size: 3\n    weight_filler {\n      type: \"xavier\"\n    }\n    bias_filler {\n      type: \"constant\"\n      value: 0\n    }\n  }\n}\nlayer {\n  name: \"relu4_1\"\n  type: \"ReLU\"\n  bottom: \"conv4_1\"\n  top: \"conv4_1\"\n}\nlayer {\n  name: \"conv4_2\"\n  type: \"Convolution\"\n  bottom: \"conv4_1\"\n  top: \"conv4_2\"\n  param {\n    lr_mult: 1\n    decay_mult: 1\n  }\n  param {\n    lr_mult: 2\n    decay_mult: 0\n  }\n  convolution_param {\n    num_output: 512\n    pad: 1\n    kernel_size: 3\n    weight_filler {\n      type: \"xavier\"\n    }\n    bias_filler {\n      type: \"constant\"\n      value: 0\n    }\n  }\n}\nlayer {\n  name: \"relu4_2\"\n  type: \"ReLU\"\n  bottom: \"conv4_2\"\n  top: \"conv4_2\"\n}\nlayer {\n  name: \"conv4_3\"\n  type: \"Convolution\"\n  bottom: \"conv4_2\"\n  top: \"conv4_3\"\n  param {\n    lr_mult: 1\n    decay_mult: 1\n  }\n  param {\n    lr_mult: 2\n    decay_mult: 0\n  }\n  convolution_param {\n    num_output: 512\n    pad: 1\n    kernel_size: 3\n    weight_filler {\n      type: \"xavier\"\n    }\n    bias_filler {\n      type: \"constant\"\n      value: 0\n    }\n  }\n}\nlayer {\n  name: \"relu4_3\"\n  type: \"ReLU\"\n  bottom: \"conv4_3\"\n  top: \"conv4_3\"\n}\nlayer {\n  name: \"pool4\"\n  type: \"Pooling\"\n  bottom: \"conv4_3\"\n  top: \"pool4\"\n  pooling_param {\n    pool: MAX\n    kernel_size: 2\n    stride: 2\n  }\n}\nlayer {\n  name: \"conv5_1\"\n  type: \"Convolution\"\n  bottom: \"pool4\"\n  top: \"conv5_1\"\n  param {\n    lr_mult: 1\n    decay_mult: 1\n  }\n  param {\n    lr_mult: 2\n    decay_mult: 0\n  }\n  convolution_param {\n    num_output: 512\n    pad: 1\n    kernel_size: 3\n    weight_filler {\n      type: \"xavier\"\n    }\n    bias_filler {\n      type: \"constant\"\n      value: 0\n    }\n    dilation: 1\n  }\n}\nlayer {\n  name: \"relu5_1\"\n  type: \"ReLU\"\n  bottom: \"conv5_1\"\n  top: \"conv5_1\"\n}\nlayer {\n  name: \"conv5_2\"\n  type: \"Convolution\"\n  bottom: \"conv5_1\"\n  top: \"conv5_2\"\n  param {\n    lr_mult: 1\n    decay_mult: 1\n  }\n  param {\n    lr_mult: 2\n    decay_mult: 0\n  }\n  convolution_param {\n    num_output: 512\n    pad: 1\n    kernel_size: 3\n    weight_filler {\n      type: \"xavier\"\n    }\n    bias_filler {\n      type: \"constant\"\n      value: 0\n    }\n    dilation: 1\n  }\n}\nlayer {\n  name: \"relu5_2\"\n  type: \"ReLU\"\n  bottom: \"conv5_2\"\n  top: \"conv5_2\"\n}\nlayer {\n  name: \"conv5_3\"\n  type: \"Convolution\"\n  bottom: \"conv5_2\"\n  top: \"conv5_3\"\n  param {\n    lr_mult: 1\n    decay_mult: 1\n  }\n  param {\n    lr_mult: 2\n    decay_mult: 0\n  }\n  convolution_param {\n    num_output: 512\n    pad: 1\n    kernel_size: 3\n    weight_filler {\n      type: \"xavier\"\n    }\n    bias_filler {\n      type: \"constant\"\n      value: 0\n    }\n    dilation: 1\n  }\n}\nlayer {\n  name: \"relu5_3\"\n  type: \"ReLU\"\n  bottom: \"conv5_3\"\n  top: \"conv5_3\"\n}\nlayer {\n  name: \"pool5\"\n  type: \"Pooling\"\n  bottom: \"conv5_3\"\n  top: \"pool5\"\n  pooling_param {\n    pool: MAX\n    kernel_size: 3\n    stride: 1\n    pad: 1\n  }\n}\nlayer {\n  name: \"fc6\"\n  type: \"Convolution\"\n  bottom: \"pool5\"\n  top: \"fc6\"\n  param {\n    lr_mult: 1\n    decay_mult: 1\n  }\n  param {\n    lr_mult: 2\n    decay_mult: 0\n  }\n  convolution_param {\n    num_output: 1024\n    pad: 6\n    kernel_size: 3\n    weight_filler {\n      type: \"xavier\"\n    }\n    bias_filler {\n      type: \"constant\"\n      value: 0\n    }\n    dilation: 6\n  }\n}\nlayer {\n  name: \"relu6\"\n  type: \"ReLU\"\n  bottom: \"fc6\"\n  top: \"fc6\"\n}\nlayer {\n  name: \"fc7\"\n  type: \"Convolution\"\n  bottom: \"fc6\"\n  top: \"fc7\"\n  param {\n    lr_mult: 1\n    decay_mult: 1\n  }\n  param {\n    lr_mult: 2\n    decay_mult: 0\n  }\n  convolution_param {\n    num_output: 1024\n    kernel_size: 1\n    weight_filler {\n      type: \"xavier\"\n    }\n    bias_filler {\n      type: \"constant\"\n      value: 0\n    }\n  }\n}\nlayer {\n  name: \"relu7\"\n  type: \"ReLU\"\n  bottom: \"fc7\"\n  top: \"fc7\"\n}\nlayer {\n  name: \"conv6_1\"\n  type: \"Convolution\"\n  bottom: \"fc7\"\n  top: \"conv6_1\"\n  param {\n    lr_mult: 1\n    decay_mult: 1\n  }\n  param {\n    lr_mult: 2\n    decay_mult: 0\n  }\n  convolution_param {\n    num_output: 256\n    pad: 0\n    kernel_size: 1\n    stride: 1\n    weight_filler {\n      type: \"xavier\"\n    }\n    bias_filler {\n      type: \"constant\"\n      value: 0\n    }\n  }\n}\nlayer {\n  name: \"conv6_1_relu\"\n  type: \"ReLU\"\n  bottom: \"conv6_1\"\n  top: \"conv6_1\"\n}\nlayer {\n  name: \"conv6_2\"\n  type: \"Convolution\"\n  bottom: \"conv6_1\"\n  top: \"conv6_2\"\n  param {\n    lr_mult: 1\n    decay_mult: 1\n  }\n  param {\n    lr_mult: 2\n    decay_mult: 0\n  }\n  convolution_param {\n    num_output: 512\n    pad: 1\n    kernel_size: 3\n    stride: 2\n    weight_filler {\n      type: \"xavier\"\n    }\n    bias_filler {\n      type: \"constant\"\n      value: 0\n    }\n  }\n}\nlayer {\n  name: \"conv6_2_relu\"\n  type: \"ReLU\"\n  bottom: \"conv6_2\"\n  top: \"conv6_2\"\n}\nlayer {\n  name: \"conv7_1\"\n  type: \"Convolution\"\n  bottom: \"conv6_2\"\n  top: \"conv7_1\"\n  param {\n    lr_mult: 1\n    decay_mult: 1\n  }\n  param {\n    lr_mult: 2\n    decay_mult: 0\n  }\n  convolution_param {\n    num_output: 128\n    pad: 0\n    kernel_size: 1\n    stride: 1\n    weight_filler {\n      type: \"xavier\"\n    }\n    bias_filler {\n      type: \"constant\"\n      value: 0\n    }\n  }\n}\nlayer {\n  name: \"conv7_1_relu\"\n  type: \"ReLU\"\n  bottom: \"conv7_1\"\n  top: \"conv7_1\"\n}\nlayer {\n  name: \"conv7_2\"\n  type: \"Convolution\"\n  bottom: \"conv7_1\"\n  top: \"conv7_2\"\n  param {\n    lr_mult: 1\n    decay_mult: 1\n  }\n  param {\n    lr_mult: 2\n    decay_mult: 0\n  }\n  convolution_param {\n    num_output: 256\n    pad: 1\n    kernel_size: 3\n    stride: 2\n    weight_filler {\n      type: \"xavier\"\n    }\n    bias_filler {\n      type: \"constant\"\n      value: 0\n    }\n  }\n}\nlayer {\n  name: \"conv7_2_relu\"\n  type: \"ReLU\"\n  bottom: \"conv7_2\"\n  top: \"conv7_2\"\n}\nlayer {\n  name: \"conv8_1\"\n  type: \"Convolution\"\n  bottom: \"conv7_2\"\n  top: \"conv8_1\"\n  param {\n    lr_mult: 1\n    decay_mult: 1\n  }\n  param {\n    lr_mult: 2\n    decay_mult: 0\n  }\n  convolution_param {\n    num_output: 128\n    pad: 0\n    kernel_size: 1\n    stride: 1\n    weight_filler {\n      type: \"xavier\"\n    }\n    bias_filler {\n      type: \"constant\"\n      value: 0\n    }\n  }\n}\nlayer {\n  name: \"conv8_1_relu\"\n  type: \"ReLU\"\n  bottom: \"conv8_1\"\n  top: \"conv8_1\"\n}\nlayer {\n  name: \"conv8_2\"\n  type: \"Convolution\"\n  bottom: \"conv8_1\"\n  top: \"conv8_2\"\n  param {\n    lr_mult: 1\n    decay_mult: 1\n  }\n  param {\n    lr_mult: 2\n    decay_mult: 0\n  }\n  convolution_param {\n    num_output: 256\n    pad: 0\n    kernel_size: 3\n    stride: 1\n    weight_filler {\n      type: \"xavier\"\n    }\n    bias_filler {\n      type: \"constant\"\n      value: 0\n    }\n  }\n}\nlayer {\n  name: \"conv8_2_relu\"\n  type: \"ReLU\"\n  bottom: \"conv8_2\"\n  top: \"conv8_2\"\n}\nlayer {\n  name: \"conv9_1\"\n  type: \"Convolution\"\n  bottom: \"conv8_2\"\n  top: \"conv9_1\"\n  param {\n    lr_mult: 1\n    decay_mult: 1\n  }\n  param {\n    lr_mult: 2\n    decay_mult: 0\n  }\n  convolution_param {\n    num_output: 128\n    pad: 0\n    kernel_size: 1\n    stride: 1\n    weight_filler {\n      type: \"xavier\"\n    }\n    bias_filler {\n      type: \"constant\"\n      value: 0\n    }\n  }\n}\nlayer {\n  name: \"conv9_1_relu\"\n  type: \"ReLU\"\n  bottom: \"conv9_1\"\n  top: \"conv9_1\"\n}\nlayer {\n  name: \"conv9_2\"\n  type: \"Convolution\"\n  bottom: \"conv9_1\"\n  top: \"conv9_2\"\n  param {\n    lr_mult: 1\n    decay_mult: 1\n  }\n  param {\n    lr_mult: 2\n    decay_mult: 0\n  }\n  convolution_param {\n    num_output: 256\n    pad: 0\n    kernel_size: 3\n    stride: 1\n    weight_filler {\n      type: \"xavier\"\n    }\n    bias_filler {\n      type: \"constant\"\n      value: 0\n    }\n  }\n}\nlayer {\n  name: \"conv9_2_relu\"\n  type: \"ReLU\"\n  bottom: \"conv9_2\"\n  top: \"conv9_2\"\n}\nlayer {\n  name: \"conv4_3_norm\"\n  type: \"Normalize\"\n  bottom: \"conv4_3\"\n  top: \"conv4_3_norm\"\n  norm_param {\n    across_spatial: false\n    scale_filler {\n      type: \"constant\"\n      value: 20\n    }\n    channel_shared: false\n  }\n}\nlayer {\n  name: \"conv4_3_norm_mbox_loc\"\n  type: \"Convolution\"\n  bottom: \"conv4_3_norm\"\n  top: \"conv4_3_norm_mbox_loc\"\n  param {\n    lr_mult: 1\n    decay_mult: 1\n  }\n  param {\n    lr_mult: 2\n    decay_mult: 0\n  }\n  convolution_param {\n    num_output: 16\n    pad: 1\n    kernel_size: 3\n    stride: 1\n    weight_filler {\n      type: \"xavier\"\n    }\n    bias_filler {\n      type: \"constant\"\n      value: 0\n    }\n  }\n}\nlayer {\n  name: \"conv4_3_norm_mbox_loc_perm\"\n  type: \"Permute\"\n  bottom: \"conv4_3_norm_mbox_loc\"\n  top: \"conv4_3_norm_mbox_loc_perm\"\n  permute_param {\n    order: 0\n    order: 2\n    order: 3\n    order: 1\n  }\n}\nlayer {\n  name: \"conv4_3_norm_mbox_loc_flat\"\n  type: \"Flatten\"\n  bottom: \"conv4_3_norm_mbox_loc_perm\"\n  top: \"conv4_3_norm_mbox_loc_flat\"\n  flatten_param {\n    axis: 1\n  }\n}\nlayer {\n  name: \"conv4_3_norm_mbox_conf\"\n  type: \"Convolution\"\n  bottom: \"conv4_3_norm\"\n  top: \"conv4_3_norm_mbox_conf\"\n  param {\n    lr_mult: 1\n    decay_mult: 1\n  }\n  param {\n    lr_mult: 2\n    decay_mult: 0\n  }\n  convolution_param {\n    num_output: 84\n    pad: 1\n    kernel_size: 3\n    stride: 1\n    weight_filler {\n      type: \"xavier\"\n    }\n    bias_filler {\n      type: \"constant\"\n      value: 0\n    }\n  }\n}\nlayer {\n  name: \"conv4_3_norm_mbox_conf_perm\"\n  type: \"Permute\"\n  bottom: \"conv4_3_norm_mbox_conf\"\n  top: \"conv4_3_norm_mbox_conf_perm\"\n  permute_param {\n    order: 0\n    order: 2\n    order: 3\n    order: 1\n  }\n}\nlayer {\n  name: \"conv4_3_norm_mbox_conf_flat\"\n  type: \"Flatten\"\n  bottom: \"conv4_3_norm_mbox_conf_perm\"\n  top: \"conv4_3_norm_mbox_conf_flat\"\n  flatten_param {\n    axis: 1\n  }\n}\nlayer {\n  name: \"conv4_3_norm_mbox_priorbox\"\n  type: \"PriorBox\"\n  bottom: \"conv4_3_norm\"\n  bottom: \"data\"\n  top: \"conv4_3_norm_mbox_priorbox\"\n  prior_box_param {\n    min_size: 30.0\n    max_size: 60.0\n    aspect_ratio: 2\n    flip: true\n    clip: false\n    variance: 0.1\n    variance: 0.1\n    variance: 0.2\n    variance: 0.2\n    step: 8\n    offset: 0.5\n  }\n}\nlayer {\n  name: \"fc7_mbox_loc\"\n  type: \"Convolution\"\n  bottom: \"fc7\"\n  top: \"fc7_mbox_loc\"\n  param {\n    lr_mult: 1\n    decay_mult: 1\n  }\n  param {\n    lr_mult: 2\n    decay_mult: 0\n  }\n  convolution_param {\n    num_output: 24\n    pad: 1\n    kernel_size: 3\n    stride: 1\n    weight_filler {\n      type: \"xavier\"\n    }\n    bias_filler {\n      type: \"constant\"\n      value: 0\n    }\n  }\n}\nlayer {\n  name: \"fc7_mbox_loc_perm\"\n  type: \"Permute\"\n  bottom: \"fc7_mbox_loc\"\n  top: \"fc7_mbox_loc_perm\"\n  permute_param {\n    order: 0\n    order: 2\n    order: 3\n    order: 1\n  }\n}\nlayer {\n  name: \"fc7_mbox_loc_flat\"\n  type: \"Flatten\"\n  bottom: \"fc7_mbox_loc_perm\"\n  top: \"fc7_mbox_loc_flat\"\n  flatten_param {\n    axis: 1\n  }\n}\nlayer {\n  name: \"fc7_mbox_conf\"\n  type: \"Convolution\"\n  bottom: \"fc7\"\n  top: \"fc7_mbox_conf\"\n  param {\n    lr_mult: 1\n    decay_mult: 1\n  }\n  param {\n    lr_mult: 2\n    decay_mult: 0\n  }\n  convolution_param {\n    num_output: 126\n    pad: 1\n    kernel_size: 3\n    stride: 1\n    weight_filler {\n      type: \"xavier\"\n    }\n    bias_filler {\n      type: \"constant\"\n      value: 0\n    }\n  }\n}\nlayer {\n  name: \"fc7_mbox_conf_perm\"\n  type: \"Permute\"\n  bottom: \"fc7_mbox_conf\"\n  top: \"fc7_mbox_conf_perm\"\n  permute_param {\n    order: 0\n    order: 2\n    order: 3\n    order: 1\n  }\n}\nlayer {\n  name: \"fc7_mbox_conf_flat\"\n  type: \"Flatten\"\n  bottom: \"fc7_mbox_conf_perm\"\n  top: \"fc7_mbox_conf_flat\"\n  flatten_param {\n    axis: 1\n  }\n}\nlayer {\n  name: \"fc7_mbox_priorbox\"\n  type: \"PriorBox\"\n  bottom: \"fc7\"\n  bottom: \"data\"\n  top: \"fc7_mbox_priorbox\"\n  prior_box_param {\n    min_size: 60.0\n    max_size: 111.0\n    aspect_ratio: 2\n    aspect_ratio: 3\n    flip: true\n    clip: false\n    variance: 0.1\n    variance: 0.1\n    variance: 0.2\n    variance: 0.2\n    step: 16\n    offset: 0.5\n  }\n}\nlayer {\n  name: \"conv6_2_mbox_loc\"\n  type: \"Convolution\"\n  bottom: \"conv6_2\"\n  top: \"conv6_2_mbox_loc\"\n  param {\n    lr_mult: 1\n    decay_mult: 1\n  }\n  param {\n    lr_mult: 2\n    decay_mult: 0\n  }\n  convolution_param {\n    num_output: 24\n    pad: 1\n    kernel_size: 3\n    stride: 1\n    weight_filler {\n      type: \"xavier\"\n    }\n    bias_filler {\n      type: \"constant\"\n      value: 0\n    }\n  }\n}\nlayer {\n  name: \"conv6_2_mbox_loc_perm\"\n  type: \"Permute\"\n  bottom: \"conv6_2_mbox_loc\"\n  top: \"conv6_2_mbox_loc_perm\"\n  permute_param {\n    order: 0\n    order: 2\n    order: 3\n    order: 1\n  }\n}\nlayer {\n  name: \"conv6_2_mbox_loc_flat\"\n  type: \"Flatten\"\n  bottom: \"conv6_2_mbox_loc_perm\"\n  top: \"conv6_2_mbox_loc_flat\"\n  flatten_param {\n    axis: 1\n  }\n}\nlayer {\n  name: \"conv6_2_mbox_conf\"\n  type: \"Convolution\"\n  bottom: \"conv6_2\"\n  top: \"conv6_2_mbox_conf\"\n  param {\n    lr_mult: 1\n    decay_mult: 1\n  }\n  param {\n    lr_mult: 2\n    decay_mult: 0\n  }\n  convolution_param {\n    num_output: 126\n    pad: 1\n    kernel_size: 3\n    stride: 1\n    weight_filler {\n      type: \"xavier\"\n    }\n    bias_filler {\n      type: \"constant\"\n      value: 0\n    }\n  }\n}\nlayer {\n  name: \"conv6_2_mbox_conf_perm\"\n  type: \"Permute\"\n  bottom: \"conv6_2_mbox_conf\"\n  top: \"conv6_2_mbox_conf_perm\"\n  permute_param {\n    order: 0\n    order: 2\n    order: 3\n    order: 1\n  }\n}\nlayer {\n  name: \"conv6_2_mbox_conf_flat\"\n  type: \"Flatten\"\n  bottom: \"conv6_2_mbox_conf_perm\"\n  top: \"conv6_2_mbox_conf_flat\"\n  flatten_param {\n    axis: 1\n  }\n}\nlayer {\n  name: \"conv6_2_mbox_priorbox\"\n  type: \"PriorBox\"\n  bottom: \"conv6_2\"\n  bottom: \"data\"\n  top: \"conv6_2_mbox_priorbox\"\n  prior_box_param {\n    min_size: 111.0\n    max_size: 162.0\n    aspect_ratio: 2\n    aspect_ratio: 3\n    flip: true\n    clip: false\n    variance: 0.1\n    variance: 0.1\n    variance: 0.2\n    variance: 0.2\n    step: 32\n    offset: 0.5\n  }\n}\nlayer {\n  name: \"conv7_2_mbox_loc\"\n  type: \"Convolution\"\n  bottom: \"conv7_2\"\n  top: \"conv7_2_mbox_loc\"\n  param {\n    lr_mult: 1\n    decay_mult: 1\n  }\n  param {\n    lr_mult: 2\n    decay_mult: 0\n  }\n  convolution_param {\n    num_output: 24\n    pad: 1\n    kernel_size: 3\n    stride: 1\n    weight_filler {\n      type: \"xavier\"\n    }\n    bias_filler {\n      type: \"constant\"\n      value: 0\n    }\n  }\n}\nlayer {\n  name: \"conv7_2_mbox_loc_perm\"\n  type: \"Permute\"\n  bottom: \"conv7_2_mbox_loc\"\n  top: \"conv7_2_mbox_loc_perm\"\n  permute_param {\n    order: 0\n    order: 2\n    order: 3\n    order: 1\n  }\n}\nlayer {\n  name: \"conv7_2_mbox_loc_flat\"\n  type: \"Flatten\"\n  bottom: \"conv7_2_mbox_loc_perm\"\n  top: \"conv7_2_mbox_loc_flat\"\n  flatten_param {\n    axis: 1\n  }\n}\nlayer {\n  name: \"conv7_2_mbox_conf\"\n  type: \"Convolution\"\n  bottom: \"conv7_2\"\n  top: \"conv7_2_mbox_conf\"\n  param {\n    lr_mult: 1\n    decay_mult: 1\n  }\n  param {\n    lr_mult: 2\n    decay_mult: 0\n  }\n  convolution_param {\n    num_output: 126\n    pad: 1\n    kernel_size: 3\n    stride: 1\n    weight_filler {\n      type: \"xavier\"\n    }\n    bias_filler {\n      type: \"constant\"\n      value: 0\n    }\n  }\n}\nlayer {\n  name: \"conv7_2_mbox_conf_perm\"\n  type: \"Permute\"\n  bottom: \"conv7_2_mbox_conf\"\n  top: \"conv7_2_mbox_conf_perm\"\n  permute_param {\n    order: 0\n    order: 2\n    order: 3\n    order: 1\n  }\n}\nlayer {\n  name: \"conv7_2_mbox_conf_flat\"\n  type: \"Flatten\"\n  bottom: \"conv7_2_mbox_conf_perm\"\n  top: \"conv7_2_mbox_conf_flat\"\n  flatten_param {\n    axis: 1\n  }\n}\nlayer {\n  name: \"conv7_2_mbox_priorbox\"\n  type: \"PriorBox\"\n  bottom: \"conv7_2\"\n  bottom: \"data\"\n  top: \"conv7_2_mbox_priorbox\"\n  prior_box_param {\n    min_size: 162.0\n    max_size: 213.0\n    aspect_ratio: 2\n    aspect_ratio: 3\n    flip: true\n    clip: false\n    variance: 0.1\n    variance: 0.1\n    variance: 0.2\n    variance: 0.2\n    step: 64\n    offset: 0.5\n  }\n}\nlayer {\n  name: \"conv8_2_mbox_loc\"\n  type: \"Convolution\"\n  bottom: \"conv8_2\"\n  top: \"conv8_2_mbox_loc\"\n  param {\n    lr_mult: 1\n    decay_mult: 1\n  }\n  param {\n    lr_mult: 2\n    decay_mult: 0\n  }\n  convolution_param {\n    num_output: 16\n    pad: 1\n    kernel_size: 3\n    stride: 1\n    weight_filler {\n      type: \"xavier\"\n    }\n    bias_filler {\n      type: \"constant\"\n      value: 0\n    }\n  }\n}\nlayer {\n  name: \"conv8_2_mbox_loc_perm\"\n  type: \"Permute\"\n  bottom: \"conv8_2_mbox_loc\"\n  top: \"conv8_2_mbox_loc_perm\"\n  permute_param {\n    order: 0\n    order: 2\n    order: 3\n    order: 1\n  }\n}\nlayer {\n  name: \"conv8_2_mbox_loc_flat\"\n  type: \"Flatten\"\n  bottom: \"conv8_2_mbox_loc_perm\"\n  top: \"conv8_2_mbox_loc_flat\"\n  flatten_param {\n    axis: 1\n  }\n}\nlayer {\n  name: \"conv8_2_mbox_conf\"\n  type: \"Convolution\"\n  bottom: \"conv8_2\"\n  top: \"conv8_2_mbox_conf\"\n  param {\n    lr_mult: 1\n    decay_mult: 1\n  }\n  param {\n    lr_mult: 2\n    decay_mult: 0\n  }\n  convolution_param {\n    num_output: 84\n    pad: 1\n    kernel_size: 3\n    stride: 1\n    weight_filler {\n      type: \"xavier\"\n    }\n    bias_filler {\n      type: \"constant\"\n      value: 0\n    }\n  }\n}\nlayer {\n  name: \"conv8_2_mbox_conf_perm\"\n  type: \"Permute\"\n  bottom: \"conv8_2_mbox_conf\"\n  top: \"conv8_2_mbox_conf_perm\"\n  permute_param {\n    order: 0\n    order: 2\n    order: 3\n    order: 1\n  }\n}\nlayer {\n  name: \"conv8_2_mbox_conf_flat\"\n  type: \"Flatten\"\n  bottom: \"conv8_2_mbox_conf_perm\"\n  top: \"conv8_2_mbox_conf_flat\"\n  flatten_param {\n    axis: 1\n  }\n}\nlayer {\n  name: \"conv8_2_mbox_priorbox\"\n  type: \"PriorBox\"\n  bottom: \"conv8_2\"\n  bottom: \"data\"\n  top: \"conv8_2_mbox_priorbox\"\n  prior_box_param {\n    min_size: 213.0\n    max_size: 264.0\n    aspect_ratio: 2\n    flip: true\n    clip: false\n    variance: 0.1\n    variance: 0.1\n    variance: 0.2\n    variance: 0.2\n    step: 100\n    offset: 0.5\n  }\n}\nlayer {\n  name: \"conv9_2_mbox_loc\"\n  type: \"Convolution\"\n  bottom: \"conv9_2\"\n  top: \"conv9_2_mbox_loc\"\n  param {\n    lr_mult: 1\n    decay_mult: 1\n  }\n  param {\n    lr_mult: 2\n    decay_mult: 0\n  }\n  convolution_param {\n    num_output: 16\n    pad: 1\n    kernel_size: 3\n    stride: 1\n    weight_filler {\n      type: \"xavier\"\n    }\n    bias_filler {\n      type: \"constant\"\n      value: 0\n    }\n  }\n}\nlayer {\n  name: \"conv9_2_mbox_loc_perm\"\n  type: \"Permute\"\n  bottom: \"conv9_2_mbox_loc\"\n  top: \"conv9_2_mbox_loc_perm\"\n  permute_param {\n    order: 0\n    order: 2\n    order: 3\n    order: 1\n  }\n}\nlayer {\n  name: \"conv9_2_mbox_loc_flat\"\n  type: \"Flatten\"\n  bottom: \"conv9_2_mbox_loc_perm\"\n  top: \"conv9_2_mbox_loc_flat\"\n  flatten_param {\n    axis: 1\n  }\n}\nlayer {\n  name: \"conv9_2_mbox_conf\"\n  type: \"Convolution\"\n  bottom: \"conv9_2\"\n  top: \"conv9_2_mbox_conf\"\n  param {\n    lr_mult: 1\n    decay_mult: 1\n  }\n  param {\n    lr_mult: 2\n    decay_mult: 0\n  }\n  convolution_param {\n    num_output: 84\n    pad: 1\n    kernel_size: 3\n    stride: 1\n    weight_filler {\n      type: \"xavier\"\n    }\n    bias_filler {\n      type: \"constant\"\n      value: 0\n    }\n  }\n}\nlayer {\n  name: \"conv9_2_mbox_conf_perm\"\n  type: \"Permute\"\n  bottom: \"conv9_2_mbox_conf\"\n  top: \"conv9_2_mbox_conf_perm\"\n  permute_param {\n    order: 0\n    order: 2\n    order: 3\n    order: 1\n  }\n}\nlayer {\n  name: \"conv9_2_mbox_conf_flat\"\n  type: \"Flatten\"\n  bottom: \"conv9_2_mbox_conf_perm\"\n  top: \"conv9_2_mbox_conf_flat\"\n  flatten_param {\n    axis: 1\n  }\n}\nlayer {\n  name: \"conv9_2_mbox_priorbox\"\n  type: \"PriorBox\"\n  bottom: \"conv9_2\"\n  bottom: \"data\"\n  top: \"conv9_2_mbox_priorbox\"\n  prior_box_param {\n    min_size: 264.0\n    max_size: 315.0\n    aspect_ratio: 2\n    flip: true\n    clip: false\n    variance: 0.1\n    variance: 0.1\n    variance: 0.2\n    variance: 0.2\n    step: 300\n    offset: 0.5\n  }\n}\nlayer {\n  name: \"mbox_loc\"\n  type: \"Concat\"\n  bottom: \"conv4_3_norm_mbox_loc_flat\"\n  bottom: \"fc7_mbox_loc_flat\"\n  bottom: \"conv6_2_mbox_loc_flat\"\n  bottom: \"conv7_2_mbox_loc_flat\"\n  bottom: \"conv8_2_mbox_loc_flat\"\n  bottom: \"conv9_2_mbox_loc_flat\"\n  top: \"mbox_loc\"\n  concat_param {\n    axis: 1\n  }\n}\nlayer {\n  name: \"mbox_conf\"\n  type: \"Concat\"\n  bottom: \"conv4_3_norm_mbox_conf_flat\"\n  bottom: \"fc7_mbox_conf_flat\"\n  bottom: \"conv6_2_mbox_conf_flat\"\n  bottom: \"conv7_2_mbox_conf_flat\"\n  bottom: \"conv8_2_mbox_conf_flat\"\n  bottom: \"conv9_2_mbox_conf_flat\"\n  top: \"mbox_conf\"\n  concat_param {\n    axis: 1\n  }\n}\nlayer {\n  name: \"mbox_priorbox\"\n  type: \"Concat\"\n  bottom: \"conv4_3_norm_mbox_priorbox\"\n  bottom: \"fc7_mbox_priorbox\"\n  bottom: \"conv6_2_mbox_priorbox\"\n  bottom: \"conv7_2_mbox_priorbox\"\n  bottom: \"conv8_2_mbox_priorbox\"\n  bottom: \"conv9_2_mbox_priorbox\"\n  top: \"mbox_priorbox\"\n  concat_param {\n    axis: 2\n  }\n}\nlayer {\n  name: \"mbox_conf_reshape\"\n  type: \"Reshape\"\n  bottom: \"mbox_conf\"\n  top: \"mbox_conf_reshape\"\n  reshape_param {\n    shape {\n      dim: 0\n      dim: -1\n      dim: 21\n    }\n  }\n}\nlayer {\n  name: \"mbox_conf_softmax\"\n  type: \"Softmax\"\n  bottom: \"mbox_conf_reshape\"\n  top: \"mbox_conf_softmax\"\n  softmax_param {\n    axis: 2\n  }\n}\nlayer {\n  name: \"mbox_conf_flatten\"\n  type: \"Flatten\"\n  bottom: \"mbox_conf_softmax\"\n  top: \"mbox_conf_flatten\"\n  flatten_param {\n    axis: 1\n  }\n}\nlayer {\n  name: \"detection_out\"\n  type: \"DetectionOutput\"\n  bottom: \"mbox_loc\"\n  bottom: \"mbox_conf_flatten\"\n  bottom: \"mbox_priorbox\"\n  top: \"detection_out\"\n  include {\n    phase: TEST\n  }\n  detection_output_param {\n    num_classes: 21\n    share_location: true\n    background_label_id: 0\n    nms_param {\n      nms_threshold: 0.45\n      top_k: 400\n    }\n    save_output_param {\n      output_directory: \"/home-2/wliu/data/VOCdevkit/results/VOC2007/SSD_300x300/Main\"\n      output_name_prefix: \"comp4_det_test_\"\n      output_format: \"VOC\"\n      label_map_file: \"data/VOC0712/labelmap_voc.prototxt\"\n      name_size_file: \"data/VOC0712/test_name_size.txt\"\n      num_test_image: 4952\n    }\n    code_type: CENTER_SIZE\n    keep_top_k: 200\n    confidence_threshold: 0.01\n  }\n}\n\n"
  },
  {
    "path": "presets/YOLO.prototxt",
    "content": "name: \"YOLONet\"\ninput: \"data\"\ninput_shape {\n  dim: 1\n  dim: 3\n  dim: 448\n  dim: 448\n}\n\nlayer {\n  name: \"conv1\"\n  type: \"Convolution\"\n  bottom: \"data\"\n  top: \"conv1\"\n  convolution_param {\n    num_output: 64\n    kernel_size: 7\n    pad: 3\n    stride: 2\n  }\n}\nlayer {\n  name: \"relu1\"\n  type: \"ReLU\"\n  bottom: \"conv1\"\n  top: \"conv1\"\n  relu_param{\n    negative_slope: 0.1\n  }\t\t\n}\nlayer {\n  name: \"pool1\"\n  type: \"Pooling\"\n  bottom: \"conv1\"\n  top: \"pool1\"\n  pooling_param {\n    pool: MAX\n    kernel_size: 2\n    stride: 2\n  }\n}\n\nlayer{\n  name: \"conv2\"\n  type: \"Convolution\"\n  bottom: \"pool1\"\n  top: \"conv2\"\n  convolution_param {\n    num_output: 192\n    kernel_size: 3\n    pad: 1\n    stride: 1\n  }\n}\nlayer {\n  name: \"relu2\"\n  type: \"ReLU\"\n  bottom: \"conv2\"\n  top: \"conv2\"\n  relu_param{\n    negative_slope: 0.1\n  }\t\t\n}\nlayer {\n  name: \"pool2\"\n  type: \"Pooling\"\n  bottom: \"conv2\"\n  top: \"pool2\"\n  pooling_param {\n    pool: MAX\n    kernel_size: 2\n    stride: 2\n  }\n}\n\nlayer{\n  name: \"conv3\"\n  type: \"Convolution\"\n  bottom: \"pool2\"\n  top: \"conv3\"\n  convolution_param {\n    num_output: 128\n    kernel_size: 1\n    pad: 0\n    stride: 1\n  }\n}\nlayer {\n  name: \"relu3\"\n  type: \"ReLU\"\n  bottom: \"conv3\"\n  top: \"conv3\"\n  relu_param{\n    negative_slope: 0.1\n  }\t\t\n}\n\n\nlayer{\n  name: \"conv4\"\n  type: \"Convolution\"\n  bottom: \"conv3\"\n  top: \"conv4\"\n  convolution_param {\n    num_output: 256\n    kernel_size: 3\n    pad: 1\n    stride: 1\n  }\n}\nlayer {\n  name: \"relu4\"\n  type: \"ReLU\"\n  bottom: \"conv4\"\n  top: \"conv4\"\n  relu_param{\n    negative_slope: 0.1\n  }\t\t\n}\n\nlayer{\n  name: \"conv5\"\n  type: \"Convolution\"\n  bottom: \"conv4\"\n  top: \"conv5\"\n  convolution_param {\n    num_output: 256\n    kernel_size: 1\n    pad: 0\n    stride: 1\n  }\n}\nlayer {\n  name: \"relu5\"\n  type: \"ReLU\"\n  bottom: \"conv5\"\n  top: \"conv5\"\n  relu_param{\n    negative_slope: 0.1\n  }\t\t\n}\n\nlayer{\n  name: \"conv6\"\n  type: \"Convolution\"\n  bottom: \"conv5\"\n  top: \"conv6\"\n  convolution_param {\n    num_output: 512\n    kernel_size: 3\n    pad: 1\n    stride: 1\n  }\n}\nlayer {\n  name: \"relu6\"\n  type: \"ReLU\"\n  bottom: \"conv6\"\n  top: \"conv6\"\n  relu_param{\n    negative_slope: 0.1\n  }\t\t\n}\nlayer {\n  name: \"pool6\"\n  type: \"Pooling\"\n  bottom: \"conv6\"\n  top: \"pool6\"\n  pooling_param {\n    pool: MAX\n    kernel_size: 2\n    stride: 2\n  }\n}\n\nlayer{\n  name: \"conv7\"\n  type: \"Convolution\"\n  bottom: \"pool6\"\n  top: \"conv7\"\n  convolution_param {\n    num_output: 256\n    kernel_size: 1\n    pad: 0\n    stride: 1\n  }\n}\nlayer {\n  name: \"relu7\"\n  type: \"ReLU\"\n  bottom: \"conv7\"\n  top: \"conv7\"\n  relu_param{\n    negative_slope: 0.1\n  }\t\t\n}\n\nlayer{\n  name: \"conv8\"\n  type: \"Convolution\"\n  bottom: \"conv7\"\n  top: \"conv8\"\n  convolution_param {\n    num_output: 512\n    kernel_size: 3\n    pad: 1\n    stride: 1\n  }\n}\nlayer {\n  name: \"relu8\"\n  type: \"ReLU\"\n  bottom: \"conv8\"\n  top: \"conv8\"\n  relu_param{\n    negative_slope: 0.1\n  }\t\t\n}\n\nlayer{\n  name: \"conv9\"\n  type: \"Convolution\"\n  bottom: \"conv8\"\n  top: \"conv9\"\n  convolution_param {\n    num_output: 256\n    kernel_size: 1\n    pad: 0\n    stride: 1\n  }\n}\nlayer {\n  name: \"relu9\"\n  type: \"ReLU\"\n  bottom: \"conv9\"\n  top: \"conv9\"\n  relu_param{\n    negative_slope: 0.1\n  }\t\t\n}\n\nlayer{\n  name: \"conv10\"\n  type: \"Convolution\"\n  bottom: \"conv9\"\n  top: \"conv10\"\n  convolution_param {\n    num_output: 512\n    kernel_size: 3\n    pad: 1\n    stride: 1\n  }\n}\nlayer {\n  name: \"relu10\"\n  type: \"ReLU\"\n  bottom: \"conv10\"\n  top: \"conv10\"\n  relu_param{\n    negative_slope: 0.1\n  }\t\t\n}\n\nlayer{\n  name: \"conv11\"\n  type: \"Convolution\"\n  bottom: \"conv10\"\n  top: \"conv11\"\n  convolution_param {\n    num_output: 256\n    kernel_size: 1\n    pad: 0\n    stride: 1\n  }\n}\nlayer {\n  name: \"relu11\"\n  type: \"ReLU\"\n  bottom: \"conv11\"\n  top: \"conv11\"\n  relu_param{\n    negative_slope: 0.1\n  }\t\t\n}\n\n\nlayer{\n  name: \"conv12\"\n  type: \"Convolution\"\n  bottom: \"conv11\"\n  top: \"conv12\"\n  convolution_param {\n    num_output: 512\n    kernel_size: 3\n    pad: 1\n    stride: 1\n  }\n}\nlayer {\n  name: \"relu12\"\n  type: \"ReLU\"\n  bottom: \"conv12\"\n  top: \"conv12\"\n  relu_param{\n    negative_slope: 0.1\n  }\t\t\n}\n\n\nlayer{\n  name: \"conv13\"\n  type: \"Convolution\"\n  bottom: \"conv12\"\n  top: \"conv13\"\n  convolution_param {\n    num_output: 256\n    kernel_size: 1\n    pad: 0\n    stride: 1\n  }\n}\nlayer {\n  name: \"relu13\"\n  type: \"ReLU\"\n  bottom: \"conv13\"\n  top: \"conv13\"\n  relu_param{\n    negative_slope: 0.1\n  }\t\t\n}\n\nlayer{\n  name: \"conv14\"\n  type: \"Convolution\"\n  bottom: \"conv13\"\n  top: \"conv14\"\n  convolution_param {\n    num_output: 512\n    kernel_size: 3\n    pad: 1\n    stride: 1\n  }\n}\nlayer {\n  name: \"relu14\"\n  type: \"ReLU\"\n  bottom: \"conv14\"\n  top: \"conv14\"\n  relu_param{\n    negative_slope: 0.1\n  }\t\t\n}\n\nlayer{\n  name: \"conv15\"\n  type: \"Convolution\"\n  bottom: \"conv14\"\n  top: \"conv15\"\n  convolution_param {\n    num_output: 512\n    kernel_size: 1\n    pad: 0\n    stride: 1\n  }\n}\nlayer {\n  name: \"relu15\"\n  type: \"ReLU\"\n  bottom: \"conv15\"\n  top: \"conv15\"\n  relu_param{\n    negative_slope: 0.1\n  }\t\t\n}\n\n\nlayer{\n  name: \"conv16\"\n  type: \"Convolution\"\n  bottom: \"conv15\"\n  top: \"conv16\"\n  convolution_param {\n    num_output: 1024\n    kernel_size: 3\n    pad: 1\n    stride: 1\n  }\n}\nlayer {\n  name: \"relu16\"\n  type: \"ReLU\"\n  bottom: \"conv16\"\n  top: \"conv16\"\n  relu_param{\n    negative_slope: 0.1\n  }\t\t\n}\n\nlayer {\n  name: \"pool16\"\n  type: \"Pooling\"\n  bottom: \"conv16\"\n  top: \"pool16\"\n  pooling_param {\n    pool: MAX\n    kernel_size: 2\n    stride: 2\n  }\n}\n\n\nlayer{\n  name: \"conv17\"\n  type: \"Convolution\"\n  bottom: \"pool16\"\n  top: \"conv17\"\n  convolution_param {\n    num_output: 512\n    kernel_size: 1\n    pad: 0\n    stride: 1\n  }\n}\nlayer {\n  name: \"relu17\"\n  type: \"ReLU\"\n  bottom: \"conv17\"\n  top: \"conv17\"\n  relu_param{\n    negative_slope: 0.1\n  }\t\t\n}\n\n\nlayer{\n  name: \"conv18\"\n  type: \"Convolution\"\n  bottom: \"conv17\"\n  top: \"conv18\"\n  convolution_param {\n    num_output: 1024\n    kernel_size: 3\n    pad: 1\n    stride: 1\n  }\n}\nlayer {\n  name: \"relu18\"\n  type: \"ReLU\"\n  bottom: \"conv18\"\n  top: \"conv18\"\n  relu_param{\n    negative_slope: 0.1\n  }\t\t\n}\n\n\n\nlayer{\n  name: \"conv19\"\n  type: \"Convolution\"\n  bottom: \"conv18\"\n  top: \"conv19\"\n  convolution_param {\n    num_output: 512\n    kernel_size: 1\n    pad: 0\n    stride: 1\n  }\n}\nlayer {\n  name: \"relu19\"\n  type: \"ReLU\"\n  bottom: \"conv19\"\n  top: \"conv19\"\n  relu_param{\n    negative_slope: 0.1\n  }\t\t\n}\n\n\n\nlayer{\n  name: \"conv20\"\n  type: \"Convolution\"\n  bottom: \"conv19\"\n  top: \"conv20\"\n  convolution_param {\n    num_output: 1024\n    kernel_size: 3\n    pad: 1\n    stride: 1\n  }\n}\nlayer {\n  name: \"relu20\"\n  type: \"ReLU\"\n  bottom: \"conv20\"\n  top: \"conv20\"\n  relu_param{\n    negative_slope: 0.1\n  }\t\t\n}\n\n\n\nlayer{\n  name: \"conv21\"\n  type: \"Convolution\"\n  bottom: \"conv20\"\n  top: \"conv21\"\n  convolution_param {\n    num_output: 1024\n    kernel_size: 3\n    pad: 1\n    stride: 1\n  }\n}\nlayer {\n  name: \"relu21\"\n  type: \"ReLU\"\n  bottom: \"conv21\"\n  top: \"conv21\"\n  relu_param{\n    negative_slope: 0.1\n  }\t\t\n}\n\n\nlayer{\n  name: \"conv22\"\n  type: \"Convolution\"\n  bottom: \"conv21\"\n  top: \"conv22\"\n  convolution_param {\n    num_output: 1024\n    kernel_size: 3\n    pad: 1\n    stride: 2\n  }\n}\nlayer {\n  name: \"relu22\"\n  type: \"ReLU\"\n  bottom: \"conv22\"\n  top: \"conv22\"\n  relu_param{\n    negative_slope: 0.1\n  }\t\t\n}\n\n\n\nlayer{\n  name: \"conv23\"\n  type: \"Convolution\"\n  bottom: \"conv22\"\n  top: \"conv23\"\n  convolution_param {\n    num_output: 1024\n    kernel_size: 3\n    pad: 1\n    stride: 1\n  }\n}\nlayer {\n  name: \"relu23\"\n  type: \"ReLU\"\n  bottom: \"conv23\"\n  top: \"conv23\"\n  relu_param{\n    negative_slope: 0.1\n  }\t\t\n}\n\n\nlayer{\n  name: \"conv24\"\n  type: \"Convolution\"\n  bottom: \"conv23\"\n  top: \"conv24\"\n  convolution_param {\n    num_output: 1024\n    kernel_size: 3\n    pad: 1\n    stride: 1\n  }\n}\nlayer {\n  name: \"relu24\"\n  type: \"ReLU\"\n  bottom: \"conv24\"\n  top: \"conv24\"\n  relu_param{\n    negative_slope: 0.1\n  }\t\t\n}\n\n\n\n\nlayer{\n  name: \"fc25\"\n  type: \"InnerProduct\"\n  bottom: \"conv24\"\n  top: \"fc25\"\n  inner_product_param {\n    num_output: 4096\n  }\n}\nlayer {\n  name: \"relu25\"\n  type: \"ReLU\"\n  bottom: \"fc25\"\n  top: \"fc25\"\n  relu_param{\n    negative_slope: 0.1\n  }\t\t\n}\n\n\nlayer{\n  name: \"fc26\"\n  type: \"InnerProduct\"\n  bottom: \"fc25\"\n  top: \"result\"\n  inner_product_param {\n    num_output: 1470\n  }\n}\n\n"
  },
  {
    "path": "presets/alexnet.prototxt",
    "content": "name: \"AlexNet\"\nlayer {\n  name: \"data\"\n  type: \"Data\"\n  top: \"data\"\n  top: \"label\"\n  include {\n    phase: TRAIN\n  }\n  transform_param {\n    mirror: true\n    crop_size: 227\n    mean_file: \"data/ilsvrc12/imagenet_mean.binaryproto\"\n  }\n  data_param {\n    source: \"examples/imagenet/ilsvrc12_train_lmdb\"\n    batch_size: 256\n    backend: LMDB\n  }\n}\nlayer {\n  name: \"data\"\n  type: \"Data\"\n  top: \"data\"\n  top: \"label\"\n  include {\n    phase: TEST\n  }\n  transform_param {\n    mirror: false\n    crop_size: 227\n    mean_file: \"data/ilsvrc12/imagenet_mean.binaryproto\"\n  }\n  data_param {\n    source: \"examples/imagenet/ilsvrc12_val_lmdb\"\n    batch_size: 50\n    backend: LMDB\n  }\n}\nlayer {\n  name: \"conv1\"\n  type: \"Convolution\"\n  bottom: \"data\"\n  top: \"conv1\"\n  param {\n    lr_mult: 1\n    decay_mult: 1\n  }\n  param {\n    lr_mult: 2\n    decay_mult: 0\n  }\n  convolution_param {\n    num_output: 96\n    kernel_size: 11\n    stride: 4\n    weight_filler {\n      type: \"gaussian\"\n      std: 0.01\n    }\n    bias_filler {\n      type: \"constant\"\n      value: 0\n    }\n  }\n}\nlayer {\n  name: \"relu1\"\n  type: \"ReLU\"\n  bottom: \"conv1\"\n  top: \"conv1\"\n}\nlayer {\n  name: \"norm1\"\n  type: \"LRN\"\n  bottom: \"conv1\"\n  top: \"norm1\"\n  lrn_param {\n    local_size: 5\n    alpha: 0.0001\n    beta: 0.75\n  }\n}\nlayer {\n  name: \"pool1\"\n  type: \"Pooling\"\n  bottom: \"norm1\"\n  top: \"pool1\"\n  pooling_param {\n    pool: MAX\n    kernel_size: 3\n    stride: 2\n  }\n}\nlayer {\n  name: \"conv2\"\n  type: \"Convolution\"\n  bottom: \"pool1\"\n  top: \"conv2\"\n  param {\n    lr_mult: 1\n    decay_mult: 1\n  }\n  param {\n    lr_mult: 2\n    decay_mult: 0\n  }\n  convolution_param {\n    num_output: 256\n    pad: 2\n    kernel_size: 5\n    group: 2\n    weight_filler {\n      type: \"gaussian\"\n      std: 0.01\n    }\n    bias_filler {\n      type: \"constant\"\n      value: 0.1\n    }\n  }\n}\nlayer {\n  name: \"relu2\"\n  type: \"ReLU\"\n  bottom: \"conv2\"\n  top: \"conv2\"\n}\nlayer {\n  name: \"norm2\"\n  type: \"LRN\"\n  bottom: \"conv2\"\n  top: \"norm2\"\n  lrn_param {\n    local_size: 5\n    alpha: 0.0001\n    beta: 0.75\n  }\n}\nlayer {\n  name: \"pool2\"\n  type: \"Pooling\"\n  bottom: \"norm2\"\n  top: \"pool2\"\n  pooling_param {\n    pool: MAX\n    kernel_size: 3\n    stride: 2\n  }\n}\nlayer {\n  name: \"conv3\"\n  type: \"Convolution\"\n  bottom: \"pool2\"\n  top: \"conv3\"\n  param {\n    lr_mult: 1\n    decay_mult: 1\n  }\n  param {\n    lr_mult: 2\n    decay_mult: 0\n  }\n  convolution_param {\n    num_output: 384\n    pad: 1\n    kernel_size: 3\n    weight_filler {\n      type: \"gaussian\"\n      std: 0.01\n    }\n    bias_filler {\n      type: \"constant\"\n      value: 0\n    }\n  }\n}\nlayer {\n  name: \"relu3\"\n  type: \"ReLU\"\n  bottom: \"conv3\"\n  top: \"conv3\"\n}\nlayer {\n  name: \"conv4\"\n  type: \"Convolution\"\n  bottom: \"conv3\"\n  top: \"conv4\"\n  param {\n    lr_mult: 1\n    decay_mult: 1\n  }\n  param {\n    lr_mult: 2\n    decay_mult: 0\n  }\n  convolution_param {\n    num_output: 384\n    pad: 1\n    kernel_size: 3\n    group: 2\n    weight_filler {\n      type: \"gaussian\"\n      std: 0.01\n    }\n    bias_filler {\n      type: \"constant\"\n      value: 0.1\n    }\n  }\n}\nlayer {\n  name: \"relu4\"\n  type: \"ReLU\"\n  bottom: \"conv4\"\n  top: \"conv4\"\n}\nlayer {\n  name: \"conv5\"\n  type: \"Convolution\"\n  bottom: \"conv4\"\n  top: \"conv5\"\n  param {\n    lr_mult: 1\n    decay_mult: 1\n  }\n  param {\n    lr_mult: 2\n    decay_mult: 0\n  }\n  convolution_param {\n    num_output: 256\n    pad: 1\n    kernel_size: 3\n    group: 2\n    weight_filler {\n      type: \"gaussian\"\n      std: 0.01\n    }\n    bias_filler {\n      type: \"constant\"\n      value: 0.1\n    }\n  }\n}\nlayer {\n  name: \"relu5\"\n  type: \"ReLU\"\n  bottom: \"conv5\"\n  top: \"conv5\"\n}\nlayer {\n  name: \"pool5\"\n  type: \"Pooling\"\n  bottom: \"conv5\"\n  top: \"pool5\"\n  pooling_param {\n    pool: MAX\n    kernel_size: 3\n    stride: 2\n  }\n}\nlayer {\n  name: \"fc6\"\n  type: \"InnerProduct\"\n  bottom: \"pool5\"\n  top: \"fc6\"\n  param {\n    lr_mult: 1\n    decay_mult: 1\n  }\n  param {\n    lr_mult: 2\n    decay_mult: 0\n  }\n  inner_product_param {\n    num_output: 4096\n    weight_filler {\n      type: \"gaussian\"\n      std: 0.005\n    }\n    bias_filler {\n      type: \"constant\"\n      value: 0.1\n    }\n  }\n}\nlayer {\n  name: \"relu6\"\n  type: \"ReLU\"\n  bottom: \"fc6\"\n  top: \"fc6\"\n}\nlayer {\n  name: \"drop6\"\n  type: \"Dropout\"\n  bottom: \"fc6\"\n  top: \"fc6\"\n  dropout_param {\n    dropout_ratio: 0.5\n  }\n}\nlayer {\n  name: \"fc7\"\n  type: \"InnerProduct\"\n  bottom: \"fc6\"\n  top: \"fc7\"\n  param {\n    lr_mult: 1\n    decay_mult: 1\n  }\n  param {\n    lr_mult: 2\n    decay_mult: 0\n  }\n  inner_product_param {\n    num_output: 4096\n    weight_filler {\n      type: \"gaussian\"\n      std: 0.005\n    }\n    bias_filler {\n      type: \"constant\"\n      value: 0.1\n    }\n  }\n}\nlayer {\n  name: \"relu7\"\n  type: \"ReLU\"\n  bottom: \"fc7\"\n  top: \"fc7\"\n}\nlayer {\n  name: \"drop7\"\n  type: \"Dropout\"\n  bottom: \"fc7\"\n  top: \"fc7\"\n  dropout_param {\n    dropout_ratio: 0.5\n  }\n}\nlayer {\n  name: \"fc8\"\n  type: \"InnerProduct\"\n  bottom: \"fc7\"\n  top: \"fc8\"\n  param {\n    lr_mult: 1\n    decay_mult: 1\n  }\n  param {\n    lr_mult: 2\n    decay_mult: 0\n  }\n  inner_product_param {\n    num_output: 1000\n    weight_filler {\n      type: \"gaussian\"\n      std: 0.01\n    }\n    bias_filler {\n      type: \"constant\"\n      value: 0\n    }\n  }\n}\nlayer {\n  name: \"accuracy\"\n  type: \"Accuracy\"\n  bottom: \"fc8\"\n  bottom: \"label\"\n  top: \"accuracy\"\n  include {\n    phase: TEST\n  }\n}\nlayer {\n  name: \"loss\"\n  type: \"SoftmaxWithLoss\"\n  bottom: \"fc8\"\n  bottom: \"label\"\n  top: \"loss\"\n}\n"
  },
  {
    "path": "presets/caffenet.prototxt",
    "content": "name: \"CaffeNet\"\nlayer {\n  name: \"data\"\n  type: \"Data\"\n  top: \"data\"\n  top: \"label\"\n  include {\n    phase: TRAIN\n  }\n  transform_param {\n    mirror: true\n    crop_size: 227\n    mean_file: \"data/ilsvrc12/imagenet_mean.binaryproto\"\n  }\n# mean pixel / channel-wise mean instead of mean image\n#  transform_param {\n#    crop_size: 227\n#    mean_value: 104\n#    mean_value: 117\n#    mean_value: 123\n#    mirror: true\n#  }\n  data_param {\n    source: \"examples/imagenet/ilsvrc12_train_lmdb\"\n    batch_size: 256\n    backend: LMDB\n  }\n}\nlayer {\n  name: \"data\"\n  type: \"Data\"\n  top: \"data\"\n  top: \"label\"\n  include {\n    phase: TEST\n  }\n  transform_param {\n    mirror: false\n    crop_size: 227\n    mean_file: \"data/ilsvrc12/imagenet_mean.binaryproto\"\n  }\n# mean pixel / channel-wise mean instead of mean image\n#  transform_param {\n#    crop_size: 227\n#    mean_value: 104\n#    mean_value: 117\n#    mean_value: 123\n#    mirror: true\n#  }\n  data_param {\n    source: \"examples/imagenet/ilsvrc12_val_lmdb\"\n    batch_size: 50\n    backend: LMDB\n  }\n}\nlayer {\n  name: \"conv1\"\n  type: \"Convolution\"\n  bottom: \"data\"\n  top: \"conv1\"\n  param {\n    lr_mult: 1\n    decay_mult: 1\n  }\n  param {\n    lr_mult: 2\n    decay_mult: 0\n  }\n  convolution_param {\n    num_output: 96\n    kernel_size: 11\n    stride: 4\n    weight_filler {\n      type: \"gaussian\"\n      std: 0.01\n    }\n    bias_filler {\n      type: \"constant\"\n      value: 0\n    }\n  }\n}\nlayer {\n  name: \"relu1\"\n  type: \"ReLU\"\n  bottom: \"conv1\"\n  top: \"conv1\"\n}\nlayer {\n  name: \"pool1\"\n  type: \"Pooling\"\n  bottom: \"conv1\"\n  top: \"pool1\"\n  pooling_param {\n    pool: MAX\n    kernel_size: 3\n    stride: 2\n  }\n}\nlayer {\n  name: \"norm1\"\n  type: \"LRN\"\n  bottom: \"pool1\"\n  top: \"norm1\"\n  lrn_param {\n    local_size: 5\n    alpha: 0.0001\n    beta: 0.75\n  }\n}\nlayer {\n  name: \"conv2\"\n  type: \"Convolution\"\n  bottom: \"norm1\"\n  top: \"conv2\"\n  param {\n    lr_mult: 1\n    decay_mult: 1\n  }\n  param {\n    lr_mult: 2\n    decay_mult: 0\n  }\n  convolution_param {\n    num_output: 256\n    pad: 2\n    kernel_size: 5\n    group: 2\n    weight_filler {\n      type: \"gaussian\"\n      std: 0.01\n    }\n    bias_filler {\n      type: \"constant\"\n      value: 1\n    }\n  }\n}\nlayer {\n  name: \"relu2\"\n  type: \"ReLU\"\n  bottom: \"conv2\"\n  top: \"conv2\"\n}\nlayer {\n  name: \"pool2\"\n  type: \"Pooling\"\n  bottom: \"conv2\"\n  top: \"pool2\"\n  pooling_param {\n    pool: MAX\n    kernel_size: 3\n    stride: 2\n  }\n}\nlayer {\n  name: \"norm2\"\n  type: \"LRN\"\n  bottom: \"pool2\"\n  top: \"norm2\"\n  lrn_param {\n    local_size: 5\n    alpha: 0.0001\n    beta: 0.75\n  }\n}\nlayer {\n  name: \"conv3\"\n  type: \"Convolution\"\n  bottom: \"norm2\"\n  top: \"conv3\"\n  param {\n    lr_mult: 1\n    decay_mult: 1\n  }\n  param {\n    lr_mult: 2\n    decay_mult: 0\n  }\n  convolution_param {\n    num_output: 384\n    pad: 1\n    kernel_size: 3\n    weight_filler {\n      type: \"gaussian\"\n      std: 0.01\n    }\n    bias_filler {\n      type: \"constant\"\n      value: 0\n    }\n  }\n}\nlayer {\n  name: \"relu3\"\n  type: \"ReLU\"\n  bottom: \"conv3\"\n  top: \"conv3\"\n}\nlayer {\n  name: \"conv4\"\n  type: \"Convolution\"\n  bottom: \"conv3\"\n  top: \"conv4\"\n  param {\n    lr_mult: 1\n    decay_mult: 1\n  }\n  param {\n    lr_mult: 2\n    decay_mult: 0\n  }\n  convolution_param {\n    num_output: 384\n    pad: 1\n    kernel_size: 3\n    group: 2\n    weight_filler {\n      type: \"gaussian\"\n      std: 0.01\n    }\n    bias_filler {\n      type: \"constant\"\n      value: 1\n    }\n  }\n}\nlayer {\n  name: \"relu4\"\n  type: \"ReLU\"\n  bottom: \"conv4\"\n  top: \"conv4\"\n}\nlayer {\n  name: \"conv5\"\n  type: \"Convolution\"\n  bottom: \"conv4\"\n  top: \"conv5\"\n  param {\n    lr_mult: 1\n    decay_mult: 1\n  }\n  param {\n    lr_mult: 2\n    decay_mult: 0\n  }\n  convolution_param {\n    num_output: 256\n    pad: 1\n    kernel_size: 3\n    group: 2\n    weight_filler {\n      type: \"gaussian\"\n      std: 0.01\n    }\n    bias_filler {\n      type: \"constant\"\n      value: 1\n    }\n  }\n}\nlayer {\n  name: \"relu5\"\n  type: \"ReLU\"\n  bottom: \"conv5\"\n  top: \"conv5\"\n}\nlayer {\n  name: \"pool5\"\n  type: \"Pooling\"\n  bottom: \"conv5\"\n  top: \"pool5\"\n  pooling_param {\n    pool: MAX\n    kernel_size: 3\n    stride: 2\n  }\n}\nlayer {\n  name: \"fc6\"\n  type: \"InnerProduct\"\n  bottom: \"pool5\"\n  top: \"fc6\"\n  param {\n    lr_mult: 1\n    decay_mult: 1\n  }\n  param {\n    lr_mult: 2\n    decay_mult: 0\n  }\n  inner_product_param {\n    num_output: 4096\n    weight_filler {\n      type: \"gaussian\"\n      std: 0.005\n    }\n    bias_filler {\n      type: \"constant\"\n      value: 1\n    }\n  }\n}\nlayer {\n  name: \"relu6\"\n  type: \"ReLU\"\n  bottom: \"fc6\"\n  top: \"fc6\"\n}\nlayer {\n  name: \"drop6\"\n  type: \"Dropout\"\n  bottom: \"fc6\"\n  top: \"fc6\"\n  dropout_param {\n    dropout_ratio: 0.5\n  }\n}\nlayer {\n  name: \"fc7\"\n  type: \"InnerProduct\"\n  bottom: \"fc6\"\n  top: \"fc7\"\n  param {\n    lr_mult: 1\n    decay_mult: 1\n  }\n  param {\n    lr_mult: 2\n    decay_mult: 0\n  }\n  inner_product_param {\n    num_output: 4096\n    weight_filler {\n      type: \"gaussian\"\n      std: 0.005\n    }\n    bias_filler {\n      type: \"constant\"\n      value: 1\n    }\n  }\n}\nlayer {\n  name: \"relu7\"\n  type: \"ReLU\"\n  bottom: \"fc7\"\n  top: \"fc7\"\n}\nlayer {\n  name: \"drop7\"\n  type: \"Dropout\"\n  bottom: \"fc7\"\n  top: \"fc7\"\n  dropout_param {\n    dropout_ratio: 0.5\n  }\n}\nlayer {\n  name: \"fc8\"\n  type: \"InnerProduct\"\n  bottom: \"fc7\"\n  top: \"fc8\"\n  param {\n    lr_mult: 1\n    decay_mult: 1\n  }\n  param {\n    lr_mult: 2\n    decay_mult: 0\n  }\n  inner_product_param {\n    num_output: 1000\n    weight_filler {\n      type: \"gaussian\"\n      std: 0.01\n    }\n    bias_filler {\n      type: \"constant\"\n      value: 0\n    }\n  }\n}\nlayer {\n  name: \"accuracy\"\n  type: \"Accuracy\"\n  bottom: \"fc8\"\n  bottom: \"label\"\n  top: \"accuracy\"\n  include {\n    phase: TEST\n  }\n}\nlayer {\n  name: \"loss\"\n  type: \"SoftmaxWithLoss\"\n  bottom: \"fc8\"\n  bottom: \"label\"\n  top: \"loss\"\n}\n"
  },
  {
    "path": "presets/fasterRCNN_AlexNet.prototxt",
    "content": "name: \"Faster R-CNN (AlexNet)\"\n\ninput: \"data\"\ninput_shape {\n  dim: 1\n  dim: 3\n  dim: 400\n  dim: 500\n}\n\ninput: \"im_info\"\ninput_shape {\n  dim: 1\n  dim: 3\n}\n\n#========= conv1-conv5 ============\n\nlayer {\n\tname: \"conv1\"\n\ttype: \"Convolution\"\n\tbottom: \"data\"\n\ttop: \"conv1\"\n\tconvolution_param {\n\t\tnum_output: 96\n\t\tkernel_size: 7\n\t\tpad: 3\n\t\tstride: 2\n\t}\n}\nlayer {\n\tname: \"relu1\"\n\ttype: \"ReLU\"\n\tbottom: \"conv1\"\n\ttop: \"conv1\"\n}\nlayer {\n\tname: \"norm1\"\n\ttype: \"LRN\"\n\tbottom: \"conv1\"\n\ttop: \"norm1\"\n\tlrn_param {\n\t\tlocal_size: 3\n\t\talpha: 0.00005\n\t\tbeta: 0.75\n\t\tnorm_region: WITHIN_CHANNEL\n    engine: CAFFE\n\t}\n}\nlayer {\n\tname: \"pool1\"\n\ttype: \"Pooling\"\n\tbottom: \"norm1\"\n\ttop: \"pool1\"\n\tpooling_param {\n\t\tkernel_size: 3\n\t\tstride: 2\n\t\tpad: 1\n\t\tpool: MAX\n\t}\n}\nlayer {\n\tname: \"conv2\"\n\ttype: \"Convolution\"\n\tbottom: \"pool1\"\n\ttop: \"conv2\"\n\tconvolution_param {\n\t\tnum_output: 256\n\t\tkernel_size: 5\n\t\tpad: 2\n\t\tstride: 2\n\t}\n}\nlayer {\n\tname: \"relu2\"\n\ttype: \"ReLU\"\n\tbottom: \"conv2\"\n\ttop: \"conv2\"\n}\nlayer {\n\tname: \"norm2\"\n\ttype: \"LRN\"\n\tbottom: \"conv2\"\n\ttop: \"norm2\"\n\tlrn_param {\n\t\tlocal_size: 3\n\t\talpha: 0.00005\n\t\tbeta: 0.75\n\t\tnorm_region: WITHIN_CHANNEL\n    engine: CAFFE\n\t}\n}\nlayer {\n\tname: \"pool2\"\n\ttype: \"Pooling\"\n\tbottom: \"norm2\"\n\ttop: \"pool2\"\n\tpooling_param {\n\t\tkernel_size: 3\n\t\tstride: 2\n\t\tpad: 1\n\t\tpool: MAX\n\t}\n}\nlayer {\n\tname: \"conv3\"\n\ttype: \"Convolution\"\n\tbottom: \"pool2\"\n\ttop: \"conv3\"\n\tconvolution_param {\n\t\tnum_output: 384\n\t\tkernel_size: 3\n\t\tpad: 1\n\t\tstride: 1\n\t}\n}\nlayer {\n\tname: \"relu3\"\n\ttype: \"ReLU\"\n\tbottom: \"conv3\"\n\ttop: \"conv3\"\n}\nlayer {\n\tname: \"conv4\"\n\ttype: \"Convolution\"\n\tbottom: \"conv3\"\n\ttop: \"conv4\"\n\tconvolution_param {\n\t\tnum_output: 384\n\t\tkernel_size: 3\n\t\tpad: 1\n\t\tstride: 1\n\t}\n}\nlayer {\n\tname: \"relu4\"\n\ttype: \"ReLU\"\n\tbottom: \"conv4\"\n\ttop: \"conv4\"\n}\nlayer {\n\tname: \"conv5\"\n\ttype: \"Convolution\"\n\tbottom: \"conv4\"\n\ttop: \"conv5\"\n\tconvolution_param {\n\t\tnum_output: 256\n\t\tkernel_size: 3\n\t\tpad: 1\n\t\tstride: 1\n\t}\n}\nlayer {\n\tname: \"relu5\"\n\ttype: \"ReLU\"\n\tbottom: \"conv5\"\n\ttop: \"conv5\"\n}\n\n#========= RPN ============\n\nlayer {\n  name: \"rpn_conv/3x3\"\n  type: \"Convolution\"\n  bottom: \"conv5\"\n  top: \"rpn_conv/3x3\"\n  convolution_param {\n    num_output: 256\n    kernel_size: 3 pad: 1 stride: 1\n    weight_filler { type: \"gaussian\" std: 0.01 }\n    bias_filler { type: \"constant\" value: 0 }\n  }\n}\nlayer {\n  name: \"rpn_relu/3x3\"\n  type: \"ReLU\"\n  bottom: \"rpn_conv/3x3\"\n  top: \"rpn_conv/3x3\"\n}\n#layer {\n#  name: \"rpn_conv/3x3\"\n#  type: \"Convolution\"\n#  bottom: \"conv5\"\n#  top: \"rpn_conv/3x3\"\n#  param { lr_mult: 1.0 decay_mult: 1.0 }\n#  param { lr_mult: 2.0 decay_mult: 0 }\n#  convolution_param {\n#    num_output: 192\n#    kernel_size: 3 pad: 1 stride: 1\n#    weight_filler { type: \"gaussian\" std: 0.01 }\n#    bias_filler { type: \"constant\" value: 0 }\n#  }\n#}\n#layer {\n#  name: \"rpn_conv/5x5\"\n#  type: \"Convolution\"\n#  bottom: \"conv5\"\n#  top: \"rpn_conv/5x5\"\n#  param { lr_mult: 1.0 decay_mult: 1.0 }\n#  param { lr_mult: 2.0 decay_mult: 0 }\n#  convolution_param {\n#    num_output: 64\n#    kernel_size: 5 pad: 2 stride: 1\n#    weight_filler { type: \"gaussian\" std: 0.0036 }\n#    bias_filler { type: \"constant\" value: 0 }\n#  }\n#}\n#layer {\n#  name: \"rpn/output\"\n#  type: \"Concat\"\n#  bottom: \"rpn_conv/3x3\"\n#  bottom: \"rpn_conv/5x5\"\n#  top: \"rpn/output\"\n#}\n#layer {\n#  name: \"rpn_relu/output\"\n#  type: \"ReLU\"\n#  bottom: \"rpn/output\"\n#  top: \"rpn/output\"\n#}\nlayer {\n  name: \"rpn_cls_score\"\n  type: \"Convolution\"\n  bottom: \"rpn_conv/3x3\"\n  top: \"rpn_cls_score\"\n  convolution_param {\n    num_output: 18   # 2(bg/fg) * 9(anchors)\n    kernel_size: 1 pad: 0 stride: 1\n    weight_filler { type: \"gaussian\" std: 0.01 }\n    bias_filler { type: \"constant\" value: 0 }\n  }\n}\nlayer {\n  name: \"rpn_bbox_pred\"\n  type: \"Convolution\"\n  bottom: \"rpn_conv/3x3\"\n  top: \"rpn_bbox_pred\"\n  convolution_param {\n    num_output: 36   # 4 * 9(anchors)\n    kernel_size: 1 pad: 0 stride: 1\n    weight_filler { type: \"gaussian\" std: 0.01 }\n    bias_filler { type: \"constant\" value: 0 }\n  }\n}\nlayer {\n   bottom: \"rpn_cls_score\"\n   top: \"rpn_cls_score_reshape\"\n   name: \"rpn_cls_score_reshape\"\n   type: \"Reshape\"\n   reshape_param { shape { dim: 0 dim: 2 dim: -1 dim: 0 } }\n}\n\n#========= RoI Proposal ============\n\nlayer {\n  name: \"rpn_cls_prob\"\n  type: \"Softmax\"\n  bottom: \"rpn_cls_score_reshape\"\n  top: \"rpn_cls_prob\"\n}\nlayer {\n  name: 'rpn_cls_prob_reshape'\n  type: 'Reshape'\n  bottom: 'rpn_cls_prob'\n  top: 'rpn_cls_prob_reshape'\n  reshape_param { shape { dim: 0 dim: 18 dim: -1 dim: 0 } }\n}\nlayer {\n  name: 'rpn_proposals'\n  type: 'Python'\n  bottom: 'rpn_cls_prob_reshape'\n  bottom: 'rpn_bbox_pred'\n  bottom: 'im_info'\n  top: 'rpn_proposals'\n  python_param {\n    module: 'rpn.proposal_layer'\n    layer: 'ProposalLayer'\n    param_str: \"'feat_stride': 16\"\n  }\n}\n\n#========= RCNN ============\n\nlayer {\n  name: \"roi_pool_conv5\"\n  type: \"ROIPooling\"\n  bottom: \"conv5\"\n  bottom: \"rpn_proposals\"\n  top: \"roi_pool_conv5\"\n  roi_pooling_param {\n    pooled_w: 6\n    pooled_h: 6\n    spatial_scale: 0.0625 # 1/16\n  }\n}\nlayer {\n  name: \"fc6\"\n  type: \"InnerProduct\"\n  bottom: \"roi_pool_conv5\"\n  top: \"fc6\"\n  inner_product_param {\n    num_output: 4096\n  }\n}\nlayer {\n  name: \"relu6\"\n  type: \"ReLU\"\n  bottom: \"fc6\"\n  top: \"fc6\"\n}\nlayer {\n  name: \"drop6\"\n  type: \"Dropout\"\n  bottom: \"fc6\"\n  top: \"fc6\"\n  dropout_param {\n    dropout_ratio: 0.5\n    scale_train: false\n  }\n}\nlayer {\n  name: \"fc7\"\n  type: \"InnerProduct\"\n  bottom: \"fc6\"\n  top: \"fc7\"\n  inner_product_param {\n    num_output: 4096\n  }\n}\nlayer {\n  name: \"relu7\"\n  type: \"ReLU\"\n  bottom: \"fc7\"\n  top: \"fc7\"\n}\nlayer {\n  name: \"drop7\"\n  type: \"Dropout\"\n  bottom: \"fc7\"\n  top: \"fc7\"\n  dropout_param {\n    dropout_ratio: 0.5\n    scale_train: false\n  }\n}\nlayer {\n  name: \"cls_score\"\n  type: \"InnerProduct\"\n  bottom: \"fc7\"\n  top: \"cls_score\"\n  inner_product_param {\n    num_output: 21\n  }\n}\nlayer {\n  name: \"bbox_pred\"\n  type: \"InnerProduct\"\n  bottom: \"fc7\"\n  top: \"bbox_pred\"\n  inner_product_param {\n    num_output: 84\n  }\n}\nlayer {\n  name: \"bbox_out\"\n  type: \"implicit\"\n  bottom: \"bbox_pred\"\n}\nlayer {\n  name: \"cls_prob\"\n  type: \"Softmax\"\n  bottom: \"cls_score\"\n  top: \"cls_prob\"\n  loss_param {\n    ignore_label: -1\n    normalize: true\n  }\n}\n"
  },
  {
    "path": "presets/fasterRCNN_ResNet.prototxt",
    "content": "name: \"Faster R-CNN (ResNet-50)\"\n\ninput: \"data\"\ninput_shape {\n  dim: 1\n  dim: 3\n  dim: 500\n  dim: 400\n}\n\ninput: \"im_info\"\ninput_shape {\n  dim: 1\n  dim: 3\n}\n\n#========= BASE CNN, FULLY_CONVOLUTIONAL ============\nlayer {\n\tbottom: \"data\"\n\ttop: \"conv1\"\n\tname: \"conv1\"\n\ttype: \"Convolution\"\n\tconvolution_param {\n\t\tnum_output: 64\n\t\tkernel_size: 7\n\t\tpad: 3\n\t\tstride: 2\n\t}\n}\n\nlayer {\n\tbottom: \"conv1\"\n\ttop: \"conv1\"\n\tname: \"bn_conv1\"\n\ttype: \"BatchNorm\"\n\tbatch_norm_param {\n\t\tuse_global_stats: true\n\t}\n}\n\nlayer {\n\tbottom: \"conv1\"\n\ttop: \"conv1\"\n\tname: \"scale_conv1\"\n\ttype: \"Scale\"\n\tscale_param {\n\t\tbias_term: true\n\t}\n}\n\nlayer {\n\tbottom: \"conv1\"\n\ttop: \"conv1\"\n\tname: \"conv1_relu\"\n\ttype: \"ReLU\"\n}\n\nlayer {\n\tbottom: \"conv1\"\n\ttop: \"pool1\"\n\tname: \"pool1\"\n\ttype: \"Pooling\"\n\tpooling_param {\n\t\tkernel_size: 3\n\t\tstride: 2\n\t\tpool: MAX\n\t}\n}\n\nlayer {\n\tbottom: \"pool1\"\n\ttop: \"res2a_branch1\"\n\tname: \"res2a_branch1\"\n\ttype: \"Convolution\"\n\tconvolution_param {\n\t\tnum_output: 256\n\t\tkernel_size: 1\n\t\tpad: 0\n\t\tstride: 1\n\t\tbias_term: false\n\t}\n}\n\nlayer {\n\tbottom: \"res2a_branch1\"\n\ttop: \"res2a_branch1\"\n\tname: \"bn2a_branch1\"\n\ttype: \"BatchNorm\"\n\tbatch_norm_param {\n\t\tuse_global_stats: true\n\t}\n}\n\nlayer {\n\tbottom: \"res2a_branch1\"\n\ttop: \"res2a_branch1\"\n\tname: \"scale2a_branch1\"\n\ttype: \"Scale\"\n\tscale_param {\n\t\tbias_term: true\n\t}\n}\n\nlayer {\n\tbottom: \"pool1\"\n\ttop: \"res2a_branch2a\"\n\tname: \"res2a_branch2a\"\n\ttype: \"Convolution\"\n\tconvolution_param {\n\t\tnum_output: 64\n\t\tkernel_size: 1\n\t\tpad: 0\n\t\tstride: 1\n\t\tbias_term: false\n\t}\n}\n\nlayer {\n\tbottom: \"res2a_branch2a\"\n\ttop: \"res2a_branch2a\"\n\tname: \"bn2a_branch2a\"\n\ttype: \"BatchNorm\"\n\tbatch_norm_param {\n\t\tuse_global_stats: true\n\t}\n}\n\nlayer {\n\tbottom: \"res2a_branch2a\"\n\ttop: \"res2a_branch2a\"\n\tname: \"scale2a_branch2a\"\n\ttype: \"Scale\"\n\tscale_param {\n\t\tbias_term: true\n\t}\n}\n\nlayer {\n\tbottom: \"res2a_branch2a\"\n\ttop: \"res2a_branch2a\"\n\tname: \"res2a_branch2a_relu\"\n\ttype: \"ReLU\"\n}\n\nlayer {\n\tbottom: \"res2a_branch2a\"\n\ttop: \"res2a_branch2b\"\n\tname: \"res2a_branch2b\"\n\ttype: \"Convolution\"\n\tconvolution_param {\n\t\tnum_output: 64\n\t\tkernel_size: 3\n\t\tpad: 1\n\t\tstride: 1\n\t\tbias_term: false\n\t}\n}\n\nlayer {\n\tbottom: \"res2a_branch2b\"\n\ttop: \"res2a_branch2b\"\n\tname: \"bn2a_branch2b\"\n\ttype: \"BatchNorm\"\n\tbatch_norm_param {\n\t\tuse_global_stats: true\n\t}\n}\n\nlayer {\n\tbottom: \"res2a_branch2b\"\n\ttop: \"res2a_branch2b\"\n\tname: \"scale2a_branch2b\"\n\ttype: \"Scale\"\n\tscale_param {\n\t\tbias_term: true\n\t}\n}\n\nlayer {\n\tbottom: \"res2a_branch2b\"\n\ttop: \"res2a_branch2b\"\n\tname: \"res2a_branch2b_relu\"\n\ttype: \"ReLU\"\n}\n\nlayer {\n\tbottom: \"res2a_branch2b\"\n\ttop: \"res2a_branch2c\"\n\tname: \"res2a_branch2c\"\n\ttype: \"Convolution\"\n\tconvolution_param {\n\t\tnum_output: 256\n\t\tkernel_size: 1\n\t\tpad: 0\n\t\tstride: 1\n\t\tbias_term: false\n\t}\n}\n\nlayer {\n\tbottom: \"res2a_branch2c\"\n\ttop: \"res2a_branch2c\"\n\tname: \"bn2a_branch2c\"\n\ttype: \"BatchNorm\"\n\tbatch_norm_param {\n\t\tuse_global_stats: true\n\t}\n}\n\nlayer {\n\tbottom: \"res2a_branch2c\"\n\ttop: \"res2a_branch2c\"\n\tname: \"scale2a_branch2c\"\n\ttype: \"Scale\"\n\tscale_param {\n\t\tbias_term: true\n\t}\n}\n\nlayer {\n\tbottom: \"res2a_branch1\"\n\tbottom: \"res2a_branch2c\"\n\ttop: \"res2a\"\n\tname: \"res2a\"\n\ttype: \"Eltwise\"\n}\n\nlayer {\n\tbottom: \"res2a\"\n\ttop: \"res2a\"\n\tname: \"res2a_relu\"\n\ttype: \"ReLU\"\n}\n\nlayer {\n\tbottom: \"res2a\"\n\ttop: \"res2b_branch2a\"\n\tname: \"res2b_branch2a\"\n\ttype: \"Convolution\"\n\tconvolution_param {\n\t\tnum_output: 64\n\t\tkernel_size: 1\n\t\tpad: 0\n\t\tstride: 1\n\t\tbias_term: false\n\t}\n}\n\nlayer {\n\tbottom: \"res2b_branch2a\"\n\ttop: \"res2b_branch2a\"\n\tname: \"bn2b_branch2a\"\n\ttype: \"BatchNorm\"\n\tbatch_norm_param {\n\t\tuse_global_stats: true\n\t}\n}\n\nlayer {\n\tbottom: \"res2b_branch2a\"\n\ttop: \"res2b_branch2a\"\n\tname: \"scale2b_branch2a\"\n\ttype: \"Scale\"\n\tscale_param {\n\t\tbias_term: true\n\t}\n}\n\nlayer {\n\tbottom: \"res2b_branch2a\"\n\ttop: \"res2b_branch2a\"\n\tname: \"res2b_branch2a_relu\"\n\ttype: \"ReLU\"\n}\n\nlayer {\n\tbottom: \"res2b_branch2a\"\n\ttop: \"res2b_branch2b\"\n\tname: \"res2b_branch2b\"\n\ttype: \"Convolution\"\n\tconvolution_param {\n\t\tnum_output: 64\n\t\tkernel_size: 3\n\t\tpad: 1\n\t\tstride: 1\n\t\tbias_term: false\n\t}\n}\n\nlayer {\n\tbottom: \"res2b_branch2b\"\n\ttop: \"res2b_branch2b\"\n\tname: \"bn2b_branch2b\"\n\ttype: \"BatchNorm\"\n\tbatch_norm_param {\n\t\tuse_global_stats: true\n\t}\n}\n\nlayer {\n\tbottom: \"res2b_branch2b\"\n\ttop: \"res2b_branch2b\"\n\tname: \"scale2b_branch2b\"\n\ttype: \"Scale\"\n\tscale_param {\n\t\tbias_term: true\n\t}\n}\n\nlayer {\n\tbottom: \"res2b_branch2b\"\n\ttop: \"res2b_branch2b\"\n\tname: \"res2b_branch2b_relu\"\n\ttype: \"ReLU\"\n}\n\nlayer {\n\tbottom: \"res2b_branch2b\"\n\ttop: \"res2b_branch2c\"\n\tname: \"res2b_branch2c\"\n\ttype: \"Convolution\"\n\tconvolution_param {\n\t\tnum_output: 256\n\t\tkernel_size: 1\n\t\tpad: 0\n\t\tstride: 1\n\t\tbias_term: false\n\t}\n}\n\nlayer {\n\tbottom: \"res2b_branch2c\"\n\ttop: \"res2b_branch2c\"\n\tname: \"bn2b_branch2c\"\n\ttype: \"BatchNorm\"\n\tbatch_norm_param {\n\t\tuse_global_stats: true\n\t}\n}\n\nlayer {\n\tbottom: \"res2b_branch2c\"\n\ttop: \"res2b_branch2c\"\n\tname: \"scale2b_branch2c\"\n\ttype: \"Scale\"\n\tscale_param {\n\t\tbias_term: true\n\t}\n}\n\nlayer {\n\tbottom: \"res2a\"\n\tbottom: \"res2b_branch2c\"\n\ttop: \"res2b\"\n\tname: \"res2b\"\n\ttype: \"Eltwise\"\n}\n\nlayer {\n\tbottom: \"res2b\"\n\ttop: \"res2b\"\n\tname: \"res2b_relu\"\n\ttype: \"ReLU\"\n}\n\nlayer {\n\tbottom: \"res2b\"\n\ttop: \"res2c_branch2a\"\n\tname: \"res2c_branch2a\"\n\ttype: \"Convolution\"\n\tconvolution_param {\n\t\tnum_output: 64\n\t\tkernel_size: 1\n\t\tpad: 0\n\t\tstride: 1\n\t\tbias_term: false\n\t}\n}\n\nlayer {\n\tbottom: \"res2c_branch2a\"\n\ttop: \"res2c_branch2a\"\n\tname: \"bn2c_branch2a\"\n\ttype: \"BatchNorm\"\n\tbatch_norm_param {\n\t\tuse_global_stats: true\n\t}\n}\n\nlayer {\n\tbottom: \"res2c_branch2a\"\n\ttop: \"res2c_branch2a\"\n\tname: \"scale2c_branch2a\"\n\ttype: \"Scale\"\n\tscale_param {\n\t\tbias_term: true\n\t}\n}\n\nlayer {\n\tbottom: \"res2c_branch2a\"\n\ttop: \"res2c_branch2a\"\n\tname: \"res2c_branch2a_relu\"\n\ttype: \"ReLU\"\n}\n\nlayer {\n\tbottom: \"res2c_branch2a\"\n\ttop: \"res2c_branch2b\"\n\tname: \"res2c_branch2b\"\n\ttype: \"Convolution\"\n\tconvolution_param {\n\t\tnum_output: 64\n\t\tkernel_size: 3\n\t\tpad: 1\n\t\tstride: 1\n\t\tbias_term: false\n\t}\n}\n\nlayer {\n\tbottom: \"res2c_branch2b\"\n\ttop: \"res2c_branch2b\"\n\tname: \"bn2c_branch2b\"\n\ttype: \"BatchNorm\"\n\tbatch_norm_param {\n\t\tuse_global_stats: true\n\t}\n}\n\nlayer {\n\tbottom: \"res2c_branch2b\"\n\ttop: \"res2c_branch2b\"\n\tname: \"scale2c_branch2b\"\n\ttype: \"Scale\"\n\tscale_param {\n\t\tbias_term: true\n\t}\n}\n\nlayer {\n\tbottom: \"res2c_branch2b\"\n\ttop: \"res2c_branch2b\"\n\tname: \"res2c_branch2b_relu\"\n\ttype: \"ReLU\"\n}\n\nlayer {\n\tbottom: \"res2c_branch2b\"\n\ttop: \"res2c_branch2c\"\n\tname: \"res2c_branch2c\"\n\ttype: \"Convolution\"\n\tconvolution_param {\n\t\tnum_output: 256\n\t\tkernel_size: 1\n\t\tpad: 0\n\t\tstride: 1\n\t\tbias_term: false\n\t}\n}\n\nlayer {\n\tbottom: \"res2c_branch2c\"\n\ttop: \"res2c_branch2c\"\n\tname: \"bn2c_branch2c\"\n\ttype: \"BatchNorm\"\n\tbatch_norm_param {\n\t\tuse_global_stats: true\n\t}\n}\n\nlayer {\n\tbottom: \"res2c_branch2c\"\n\ttop: \"res2c_branch2c\"\n\tname: \"scale2c_branch2c\"\n\ttype: \"Scale\"\n\tscale_param {\n\t\tbias_term: true\n\t}\n}\n\nlayer {\n\tbottom: \"res2b\"\n\tbottom: \"res2c_branch2c\"\n\ttop: \"res2c\"\n\tname: \"res2c\"\n\ttype: \"Eltwise\"\n}\n\nlayer {\n\tbottom: \"res2c\"\n\ttop: \"res2c\"\n\tname: \"res2c_relu\"\n\ttype: \"ReLU\"\n}\n\nlayer {\n\tbottom: \"res2c\"\n\ttop: \"res3a_branch1\"\n\tname: \"res3a_branch1\"\n\ttype: \"Convolution\"\n\tconvolution_param {\n\t\tnum_output: 512\n\t\tkernel_size: 1\n\t\tpad: 0\n\t\tstride: 2\n\t\tbias_term: false\n\t}\n}\n\nlayer {\n\tbottom: \"res3a_branch1\"\n\ttop: \"res3a_branch1\"\n\tname: \"bn3a_branch1\"\n\ttype: \"BatchNorm\"\n\tbatch_norm_param {\n\t\tuse_global_stats: true\n\t}\n}\n\nlayer {\n\tbottom: \"res3a_branch1\"\n\ttop: \"res3a_branch1\"\n\tname: \"scale3a_branch1\"\n\ttype: \"Scale\"\n\tscale_param {\n\t\tbias_term: true\n\t}\n}\n\nlayer {\n\tbottom: \"res2c\"\n\ttop: \"res3a_branch2a\"\n\tname: \"res3a_branch2a\"\n\ttype: \"Convolution\"\n\tconvolution_param {\n\t\tnum_output: 128\n\t\tkernel_size: 1\n\t\tpad: 0\n\t\tstride: 2\n\t\tbias_term: false\n\t}\n}\n\nlayer {\n\tbottom: \"res3a_branch2a\"\n\ttop: \"res3a_branch2a\"\n\tname: \"bn3a_branch2a\"\n\ttype: \"BatchNorm\"\n\tbatch_norm_param {\n\t\tuse_global_stats: true\n\t}\n}\n\nlayer {\n\tbottom: \"res3a_branch2a\"\n\ttop: \"res3a_branch2a\"\n\tname: \"scale3a_branch2a\"\n\ttype: \"Scale\"\n\tscale_param {\n\t\tbias_term: true\n\t}\n}\n\nlayer {\n\tbottom: \"res3a_branch2a\"\n\ttop: \"res3a_branch2a\"\n\tname: \"res3a_branch2a_relu\"\n\ttype: \"ReLU\"\n}\n\nlayer {\n\tbottom: \"res3a_branch2a\"\n\ttop: \"res3a_branch2b\"\n\tname: \"res3a_branch2b\"\n\ttype: \"Convolution\"\n\tconvolution_param {\n\t\tnum_output: 128\n\t\tkernel_size: 3\n\t\tpad: 1\n\t\tstride: 1\n\t\tbias_term: false\n\t}\n}\n\nlayer {\n\tbottom: \"res3a_branch2b\"\n\ttop: \"res3a_branch2b\"\n\tname: \"bn3a_branch2b\"\n\ttype: \"BatchNorm\"\n\tbatch_norm_param {\n\t\tuse_global_stats: true\n\t}\n}\n\nlayer {\n\tbottom: \"res3a_branch2b\"\n\ttop: \"res3a_branch2b\"\n\tname: \"scale3a_branch2b\"\n\ttype: \"Scale\"\n\tscale_param {\n\t\tbias_term: true\n\t}\n}\n\nlayer {\n\tbottom: \"res3a_branch2b\"\n\ttop: \"res3a_branch2b\"\n\tname: \"res3a_branch2b_relu\"\n\ttype: \"ReLU\"\n}\n\nlayer {\n\tbottom: \"res3a_branch2b\"\n\ttop: \"res3a_branch2c\"\n\tname: \"res3a_branch2c\"\n\ttype: \"Convolution\"\n\tconvolution_param {\n\t\tnum_output: 512\n\t\tkernel_size: 1\n\t\tpad: 0\n\t\tstride: 1\n\t\tbias_term: false\n\t}\n}\n\nlayer {\n\tbottom: \"res3a_branch2c\"\n\ttop: \"res3a_branch2c\"\n\tname: \"bn3a_branch2c\"\n\ttype: \"BatchNorm\"\n\tbatch_norm_param {\n\t\tuse_global_stats: true\n\t}\n}\n\nlayer {\n\tbottom: \"res3a_branch2c\"\n\ttop: \"res3a_branch2c\"\n\tname: \"scale3a_branch2c\"\n\ttype: \"Scale\"\n\tscale_param {\n\t\tbias_term: true\n\t}\n}\n\nlayer {\n\tbottom: \"res3a_branch1\"\n\tbottom: \"res3a_branch2c\"\n\ttop: \"res3a\"\n\tname: \"res3a\"\n\ttype: \"Eltwise\"\n}\n\nlayer {\n\tbottom: \"res3a\"\n\ttop: \"res3a\"\n\tname: \"res3a_relu\"\n\ttype: \"ReLU\"\n}\n\nlayer {\n\tbottom: \"res3a\"\n\ttop: \"res3b_branch2a\"\n\tname: \"res3b_branch2a\"\n\ttype: \"Convolution\"\n\tconvolution_param {\n\t\tnum_output: 128\n\t\tkernel_size: 1\n\t\tpad: 0\n\t\tstride: 1\n\t\tbias_term: false\n\t}\n}\n\nlayer {\n\tbottom: \"res3b_branch2a\"\n\ttop: \"res3b_branch2a\"\n\tname: \"bn3b_branch2a\"\n\ttype: \"BatchNorm\"\n\tbatch_norm_param {\n\t\tuse_global_stats: true\n\t}\n}\n\nlayer {\n\tbottom: \"res3b_branch2a\"\n\ttop: \"res3b_branch2a\"\n\tname: \"scale3b_branch2a\"\n\ttype: \"Scale\"\n\tscale_param {\n\t\tbias_term: true\n\t}\n}\n\nlayer {\n\tbottom: \"res3b_branch2a\"\n\ttop: \"res3b_branch2a\"\n\tname: \"res3b_branch2a_relu\"\n\ttype: \"ReLU\"\n}\n\nlayer {\n\tbottom: \"res3b_branch2a\"\n\ttop: \"res3b_branch2b\"\n\tname: \"res3b_branch2b\"\n\ttype: \"Convolution\"\n\tconvolution_param {\n\t\tnum_output: 128\n\t\tkernel_size: 3\n\t\tpad: 1\n\t\tstride: 1\n\t\tbias_term: false\n\t}\n}\n\nlayer {\n\tbottom: \"res3b_branch2b\"\n\ttop: \"res3b_branch2b\"\n\tname: \"bn3b_branch2b\"\n\ttype: \"BatchNorm\"\n\tbatch_norm_param {\n\t\tuse_global_stats: true\n\t}\n}\n\nlayer {\n\tbottom: \"res3b_branch2b\"\n\ttop: \"res3b_branch2b\"\n\tname: \"scale3b_branch2b\"\n\ttype: \"Scale\"\n\tscale_param {\n\t\tbias_term: true\n\t}\n}\n\nlayer {\n\tbottom: \"res3b_branch2b\"\n\ttop: \"res3b_branch2b\"\n\tname: \"res3b_branch2b_relu\"\n\ttype: \"ReLU\"\n}\n\nlayer {\n\tbottom: \"res3b_branch2b\"\n\ttop: \"res3b_branch2c\"\n\tname: \"res3b_branch2c\"\n\ttype: \"Convolution\"\n\tconvolution_param {\n\t\tnum_output: 512\n\t\tkernel_size: 1\n\t\tpad: 0\n\t\tstride: 1\n\t\tbias_term: false\n\t}\n}\n\nlayer {\n\tbottom: \"res3b_branch2c\"\n\ttop: \"res3b_branch2c\"\n\tname: \"bn3b_branch2c\"\n\ttype: \"BatchNorm\"\n\tbatch_norm_param {\n\t\tuse_global_stats: true\n\t}\n}\n\nlayer {\n\tbottom: \"res3b_branch2c\"\n\ttop: \"res3b_branch2c\"\n\tname: \"scale3b_branch2c\"\n\ttype: \"Scale\"\n\tscale_param {\n\t\tbias_term: true\n\t}\n}\n\nlayer {\n\tbottom: \"res3a\"\n\tbottom: \"res3b_branch2c\"\n\ttop: \"res3b\"\n\tname: \"res3b\"\n\ttype: \"Eltwise\"\n}\n\nlayer {\n\tbottom: \"res3b\"\n\ttop: \"res3b\"\n\tname: \"res3b_relu\"\n\ttype: \"ReLU\"\n}\n\nlayer {\n\tbottom: \"res3b\"\n\ttop: \"res3c_branch2a\"\n\tname: \"res3c_branch2a\"\n\ttype: \"Convolution\"\n\tconvolution_param {\n\t\tnum_output: 128\n\t\tkernel_size: 1\n\t\tpad: 0\n\t\tstride: 1\n\t\tbias_term: false\n\t}\n}\n\nlayer {\n\tbottom: \"res3c_branch2a\"\n\ttop: \"res3c_branch2a\"\n\tname: \"bn3c_branch2a\"\n\ttype: \"BatchNorm\"\n\tbatch_norm_param {\n\t\tuse_global_stats: true\n\t}\n}\n\nlayer {\n\tbottom: \"res3c_branch2a\"\n\ttop: \"res3c_branch2a\"\n\tname: \"scale3c_branch2a\"\n\ttype: \"Scale\"\n\tscale_param {\n\t\tbias_term: true\n\t}\n}\n\nlayer {\n\tbottom: \"res3c_branch2a\"\n\ttop: \"res3c_branch2a\"\n\tname: \"res3c_branch2a_relu\"\n\ttype: \"ReLU\"\n}\n\nlayer {\n\tbottom: \"res3c_branch2a\"\n\ttop: \"res3c_branch2b\"\n\tname: \"res3c_branch2b\"\n\ttype: \"Convolution\"\n\tconvolution_param {\n\t\tnum_output: 128\n\t\tkernel_size: 3\n\t\tpad: 1\n\t\tstride: 1\n\t\tbias_term: false\n\t}\n}\n\nlayer {\n\tbottom: \"res3c_branch2b\"\n\ttop: \"res3c_branch2b\"\n\tname: \"bn3c_branch2b\"\n\ttype: \"BatchNorm\"\n\tbatch_norm_param {\n\t\tuse_global_stats: true\n\t}\n}\n\nlayer {\n\tbottom: \"res3c_branch2b\"\n\ttop: \"res3c_branch2b\"\n\tname: \"scale3c_branch2b\"\n\ttype: \"Scale\"\n\tscale_param {\n\t\tbias_term: true\n\t}\n}\n\nlayer {\n\tbottom: \"res3c_branch2b\"\n\ttop: \"res3c_branch2b\"\n\tname: \"res3c_branch2b_relu\"\n\ttype: \"ReLU\"\n}\n\nlayer {\n\tbottom: \"res3c_branch2b\"\n\ttop: \"res3c_branch2c\"\n\tname: \"res3c_branch2c\"\n\ttype: \"Convolution\"\n\tconvolution_param {\n\t\tnum_output: 512\n\t\tkernel_size: 1\n\t\tpad: 0\n\t\tstride: 1\n\t\tbias_term: false\n\t}\n}\n\nlayer {\n\tbottom: \"res3c_branch2c\"\n\ttop: \"res3c_branch2c\"\n\tname: \"bn3c_branch2c\"\n\ttype: \"BatchNorm\"\n\tbatch_norm_param {\n\t\tuse_global_stats: true\n\t}\n}\n\nlayer {\n\tbottom: \"res3c_branch2c\"\n\ttop: \"res3c_branch2c\"\n\tname: \"scale3c_branch2c\"\n\ttype: \"Scale\"\n\tscale_param {\n\t\tbias_term: true\n\t}\n}\n\nlayer {\n\tbottom: \"res3b\"\n\tbottom: \"res3c_branch2c\"\n\ttop: \"res3c\"\n\tname: \"res3c\"\n\ttype: \"Eltwise\"\n}\n\nlayer {\n\tbottom: \"res3c\"\n\ttop: \"res3c\"\n\tname: \"res3c_relu\"\n\ttype: \"ReLU\"\n}\n\nlayer {\n\tbottom: \"res3c\"\n\ttop: \"res3d_branch2a\"\n\tname: \"res3d_branch2a\"\n\ttype: \"Convolution\"\n\tconvolution_param {\n\t\tnum_output: 128\n\t\tkernel_size: 1\n\t\tpad: 0\n\t\tstride: 1\n\t\tbias_term: false\n\t}\n}\n\nlayer {\n\tbottom: \"res3d_branch2a\"\n\ttop: \"res3d_branch2a\"\n\tname: \"bn3d_branch2a\"\n\ttype: \"BatchNorm\"\n\tbatch_norm_param {\n\t\tuse_global_stats: true\n\t}\n}\n\nlayer {\n\tbottom: \"res3d_branch2a\"\n\ttop: \"res3d_branch2a\"\n\tname: \"scale3d_branch2a\"\n\ttype: \"Scale\"\n\tscale_param {\n\t\tbias_term: true\n\t}\n}\n\nlayer {\n\tbottom: \"res3d_branch2a\"\n\ttop: \"res3d_branch2a\"\n\tname: \"res3d_branch2a_relu\"\n\ttype: \"ReLU\"\n}\n\nlayer {\n\tbottom: \"res3d_branch2a\"\n\ttop: \"res3d_branch2b\"\n\tname: \"res3d_branch2b\"\n\ttype: \"Convolution\"\n\tconvolution_param {\n\t\tnum_output: 128\n\t\tkernel_size: 3\n\t\tpad: 1\n\t\tstride: 1\n\t\tbias_term: false\n\t}\n}\n\nlayer {\n\tbottom: \"res3d_branch2b\"\n\ttop: \"res3d_branch2b\"\n\tname: \"bn3d_branch2b\"\n\ttype: \"BatchNorm\"\n\tbatch_norm_param {\n\t\tuse_global_stats: true\n\t}\n}\n\nlayer {\n\tbottom: \"res3d_branch2b\"\n\ttop: \"res3d_branch2b\"\n\tname: \"scale3d_branch2b\"\n\ttype: \"Scale\"\n\tscale_param {\n\t\tbias_term: true\n\t}\n}\n\nlayer {\n\tbottom: \"res3d_branch2b\"\n\ttop: \"res3d_branch2b\"\n\tname: \"res3d_branch2b_relu\"\n\ttype: \"ReLU\"\n}\n\nlayer {\n\tbottom: \"res3d_branch2b\"\n\ttop: \"res3d_branch2c\"\n\tname: \"res3d_branch2c\"\n\ttype: \"Convolution\"\n\tconvolution_param {\n\t\tnum_output: 512\n\t\tkernel_size: 1\n\t\tpad: 0\n\t\tstride: 1\n\t\tbias_term: false\n\t}\n}\n\nlayer {\n\tbottom: \"res3d_branch2c\"\n\ttop: \"res3d_branch2c\"\n\tname: \"bn3d_branch2c\"\n\ttype: \"BatchNorm\"\n\tbatch_norm_param {\n\t\tuse_global_stats: true\n\t}\n}\n\nlayer {\n\tbottom: \"res3d_branch2c\"\n\ttop: \"res3d_branch2c\"\n\tname: \"scale3d_branch2c\"\n\ttype: \"Scale\"\n\tscale_param {\n\t\tbias_term: true\n\t}\n}\n\nlayer {\n\tbottom: \"res3c\"\n\tbottom: \"res3d_branch2c\"\n\ttop: \"res3d\"\n\tname: \"res3d\"\n\ttype: \"Eltwise\"\n}\n\nlayer {\n\tbottom: \"res3d\"\n\ttop: \"res3d\"\n\tname: \"res3d_relu\"\n\ttype: \"ReLU\"\n}\n\nlayer {\n\tbottom: \"res3d\"\n\ttop: \"res4a_branch1\"\n\tname: \"res4a_branch1\"\n\ttype: \"Convolution\"\n\tconvolution_param {\n\t\tnum_output: 1024\n\t\tkernel_size: 1\n\t\tpad: 0\n\t\tstride: 2\n\t\tbias_term: false\n\t}\n}\n\nlayer {\n\tbottom: \"res4a_branch1\"\n\ttop: \"res4a_branch1\"\n\tname: \"bn4a_branch1\"\n\ttype: \"BatchNorm\"\n\tbatch_norm_param {\n\t\tuse_global_stats: true\n\t}\n}\n\nlayer {\n\tbottom: \"res4a_branch1\"\n\ttop: \"res4a_branch1\"\n\tname: \"scale4a_branch1\"\n\ttype: \"Scale\"\n\tscale_param {\n\t\tbias_term: true\n\t}\n}\n\nlayer {\n\tbottom: \"res3d\"\n\ttop: \"res4a_branch2a\"\n\tname: \"res4a_branch2a\"\n\ttype: \"Convolution\"\n\tconvolution_param {\n\t\tnum_output: 256\n\t\tkernel_size: 1\n\t\tpad: 0\n\t\tstride: 2\n\t\tbias_term: false\n\t}\n}\n\nlayer {\n\tbottom: \"res4a_branch2a\"\n\ttop: \"res4a_branch2a\"\n\tname: \"bn4a_branch2a\"\n\ttype: \"BatchNorm\"\n\tbatch_norm_param {\n\t\tuse_global_stats: true\n\t}\n}\n\nlayer {\n\tbottom: \"res4a_branch2a\"\n\ttop: \"res4a_branch2a\"\n\tname: \"scale4a_branch2a\"\n\ttype: \"Scale\"\n\tscale_param {\n\t\tbias_term: true\n\t}\n}\n\nlayer {\n\tbottom: \"res4a_branch2a\"\n\ttop: \"res4a_branch2a\"\n\tname: \"res4a_branch2a_relu\"\n\ttype: \"ReLU\"\n}\n\nlayer {\n\tbottom: \"res4a_branch2a\"\n\ttop: \"res4a_branch2b\"\n\tname: \"res4a_branch2b\"\n\ttype: \"Convolution\"\n\tconvolution_param {\n\t\tnum_output: 256\n\t\tkernel_size: 3\n\t\tpad: 1\n\t\tstride: 1\n\t\tbias_term: false\n\t}\n}\n\nlayer {\n\tbottom: \"res4a_branch2b\"\n\ttop: \"res4a_branch2b\"\n\tname: \"bn4a_branch2b\"\n\ttype: \"BatchNorm\"\n\tbatch_norm_param {\n\t\tuse_global_stats: true\n\t}\n}\n\nlayer {\n\tbottom: \"res4a_branch2b\"\n\ttop: \"res4a_branch2b\"\n\tname: \"scale4a_branch2b\"\n\ttype: \"Scale\"\n\tscale_param {\n\t\tbias_term: true\n\t}\n}\n\nlayer {\n\tbottom: \"res4a_branch2b\"\n\ttop: \"res4a_branch2b\"\n\tname: \"res4a_branch2b_relu\"\n\ttype: \"ReLU\"\n}\n\nlayer {\n\tbottom: \"res4a_branch2b\"\n\ttop: \"res4a_branch2c\"\n\tname: \"res4a_branch2c\"\n\ttype: \"Convolution\"\n\tconvolution_param {\n\t\tnum_output: 1024\n\t\tkernel_size: 1\n\t\tpad: 0\n\t\tstride: 1\n\t\tbias_term: false\n\t}\n}\n\nlayer {\n\tbottom: \"res4a_branch2c\"\n\ttop: \"res4a_branch2c\"\n\tname: \"bn4a_branch2c\"\n\ttype: \"BatchNorm\"\n\tbatch_norm_param {\n\t\tuse_global_stats: true\n\t}\n}\n\nlayer {\n\tbottom: \"res4a_branch2c\"\n\ttop: \"res4a_branch2c\"\n\tname: \"scale4a_branch2c\"\n\ttype: \"Scale\"\n\tscale_param {\n\t\tbias_term: true\n\t}\n}\n\nlayer {\n\tbottom: \"res4a_branch1\"\n\tbottom: \"res4a_branch2c\"\n\ttop: \"res4a\"\n\tname: \"res4a\"\n\ttype: \"Eltwise\"\n}\n\nlayer {\n\tbottom: \"res4a\"\n\ttop: \"res4a\"\n\tname: \"res4a_relu\"\n\ttype: \"ReLU\"\n}\n\nlayer {\n\tbottom: \"res4a\"\n\ttop: \"res4b_branch2a\"\n\tname: \"res4b_branch2a\"\n\ttype: \"Convolution\"\n\tconvolution_param {\n\t\tnum_output: 256\n\t\tkernel_size: 1\n\t\tpad: 0\n\t\tstride: 1\n\t\tbias_term: false\n\t}\n}\n\nlayer {\n\tbottom: \"res4b_branch2a\"\n\ttop: \"res4b_branch2a\"\n\tname: \"bn4b_branch2a\"\n\ttype: \"BatchNorm\"\n\tbatch_norm_param {\n\t\tuse_global_stats: true\n\t}\n}\n\nlayer {\n\tbottom: \"res4b_branch2a\"\n\ttop: \"res4b_branch2a\"\n\tname: \"scale4b_branch2a\"\n\ttype: \"Scale\"\n\tscale_param {\n\t\tbias_term: true\n\t}\n}\n\nlayer {\n\tbottom: \"res4b_branch2a\"\n\ttop: \"res4b_branch2a\"\n\tname: \"res4b_branch2a_relu\"\n\ttype: \"ReLU\"\n}\n\nlayer {\n\tbottom: \"res4b_branch2a\"\n\ttop: \"res4b_branch2b\"\n\tname: \"res4b_branch2b\"\n\ttype: \"Convolution\"\n\tconvolution_param {\n\t\tnum_output: 256\n\t\tkernel_size: 3\n\t\tpad: 1\n\t\tstride: 1\n\t\tbias_term: false\n\t}\n}\n\nlayer {\n\tbottom: \"res4b_branch2b\"\n\ttop: \"res4b_branch2b\"\n\tname: \"bn4b_branch2b\"\n\ttype: \"BatchNorm\"\n\tbatch_norm_param {\n\t\tuse_global_stats: true\n\t}\n}\n\nlayer {\n\tbottom: \"res4b_branch2b\"\n\ttop: \"res4b_branch2b\"\n\tname: \"scale4b_branch2b\"\n\ttype: \"Scale\"\n\tscale_param {\n\t\tbias_term: true\n\t}\n}\n\nlayer {\n\tbottom: \"res4b_branch2b\"\n\ttop: \"res4b_branch2b\"\n\tname: \"res4b_branch2b_relu\"\n\ttype: \"ReLU\"\n}\n\nlayer {\n\tbottom: \"res4b_branch2b\"\n\ttop: \"res4b_branch2c\"\n\tname: \"res4b_branch2c\"\n\ttype: \"Convolution\"\n\tconvolution_param {\n\t\tnum_output: 1024\n\t\tkernel_size: 1\n\t\tpad: 0\n\t\tstride: 1\n\t\tbias_term: false\n\t}\n}\n\nlayer {\n\tbottom: \"res4b_branch2c\"\n\ttop: \"res4b_branch2c\"\n\tname: \"bn4b_branch2c\"\n\ttype: \"BatchNorm\"\n\tbatch_norm_param {\n\t\tuse_global_stats: true\n\t}\n}\n\nlayer {\n\tbottom: \"res4b_branch2c\"\n\ttop: \"res4b_branch2c\"\n\tname: \"scale4b_branch2c\"\n\ttype: \"Scale\"\n\tscale_param {\n\t\tbias_term: true\n\t}\n}\n\nlayer {\n\tbottom: \"res4a\"\n\tbottom: \"res4b_branch2c\"\n\ttop: \"res4b\"\n\tname: \"res4b\"\n\ttype: \"Eltwise\"\n}\n\nlayer {\n\tbottom: \"res4b\"\n\ttop: \"res4b\"\n\tname: \"res4b_relu\"\n\ttype: \"ReLU\"\n}\n\nlayer {\n\tbottom: \"res4b\"\n\ttop: \"res4c_branch2a\"\n\tname: \"res4c_branch2a\"\n\ttype: \"Convolution\"\n\tconvolution_param {\n\t\tnum_output: 256\n\t\tkernel_size: 1\n\t\tpad: 0\n\t\tstride: 1\n\t\tbias_term: false\n\t}\n}\n\nlayer {\n\tbottom: \"res4c_branch2a\"\n\ttop: \"res4c_branch2a\"\n\tname: \"bn4c_branch2a\"\n\ttype: \"BatchNorm\"\n\tbatch_norm_param {\n\t\tuse_global_stats: true\n\t}\n}\n\nlayer {\n\tbottom: \"res4c_branch2a\"\n\ttop: \"res4c_branch2a\"\n\tname: \"scale4c_branch2a\"\n\ttype: \"Scale\"\n\tscale_param {\n\t\tbias_term: true\n\t}\n}\n\nlayer {\n\tbottom: \"res4c_branch2a\"\n\ttop: \"res4c_branch2a\"\n\tname: \"res4c_branch2a_relu\"\n\ttype: \"ReLU\"\n}\n\nlayer {\n\tbottom: \"res4c_branch2a\"\n\ttop: \"res4c_branch2b\"\n\tname: \"res4c_branch2b\"\n\ttype: \"Convolution\"\n\tconvolution_param {\n\t\tnum_output: 256\n\t\tkernel_size: 3\n\t\tpad: 1\n\t\tstride: 1\n\t\tbias_term: false\n\t}\n}\n\nlayer {\n\tbottom: \"res4c_branch2b\"\n\ttop: \"res4c_branch2b\"\n\tname: \"bn4c_branch2b\"\n\ttype: \"BatchNorm\"\n\tbatch_norm_param {\n\t\tuse_global_stats: true\n\t}\n}\n\nlayer {\n\tbottom: \"res4c_branch2b\"\n\ttop: \"res4c_branch2b\"\n\tname: \"scale4c_branch2b\"\n\ttype: \"Scale\"\n\tscale_param {\n\t\tbias_term: true\n\t}\n}\n\nlayer {\n\tbottom: \"res4c_branch2b\"\n\ttop: \"res4c_branch2b\"\n\tname: \"res4c_branch2b_relu\"\n\ttype: \"ReLU\"\n}\n\nlayer {\n\tbottom: \"res4c_branch2b\"\n\ttop: \"res4c_branch2c\"\n\tname: \"res4c_branch2c\"\n\ttype: \"Convolution\"\n\tconvolution_param {\n\t\tnum_output: 1024\n\t\tkernel_size: 1\n\t\tpad: 0\n\t\tstride: 1\n\t\tbias_term: false\n\t}\n}\n\nlayer {\n\tbottom: \"res4c_branch2c\"\n\ttop: \"res4c_branch2c\"\n\tname: \"bn4c_branch2c\"\n\ttype: \"BatchNorm\"\n\tbatch_norm_param {\n\t\tuse_global_stats: true\n\t}\n}\n\nlayer {\n\tbottom: \"res4c_branch2c\"\n\ttop: \"res4c_branch2c\"\n\tname: \"scale4c_branch2c\"\n\ttype: \"Scale\"\n\tscale_param {\n\t\tbias_term: true\n\t}\n}\n\nlayer {\n\tbottom: \"res4b\"\n\tbottom: \"res4c_branch2c\"\n\ttop: \"res4c\"\n\tname: \"res4c\"\n\ttype: \"Eltwise\"\n}\n\nlayer {\n\tbottom: \"res4c\"\n\ttop: \"res4c\"\n\tname: \"res4c_relu\"\n\ttype: \"ReLU\"\n}\n\nlayer {\n\tbottom: \"res4c\"\n\ttop: \"res4d_branch2a\"\n\tname: \"res4d_branch2a\"\n\ttype: \"Convolution\"\n\tconvolution_param {\n\t\tnum_output: 256\n\t\tkernel_size: 1\n\t\tpad: 0\n\t\tstride: 1\n\t\tbias_term: false\n\t}\n}\n\nlayer {\n\tbottom: \"res4d_branch2a\"\n\ttop: \"res4d_branch2a\"\n\tname: \"bn4d_branch2a\"\n\ttype: \"BatchNorm\"\n\tbatch_norm_param {\n\t\tuse_global_stats: true\n\t}\n}\n\nlayer {\n\tbottom: \"res4d_branch2a\"\n\ttop: \"res4d_branch2a\"\n\tname: \"scale4d_branch2a\"\n\ttype: \"Scale\"\n\tscale_param {\n\t\tbias_term: true\n\t}\n}\n\nlayer {\n\tbottom: \"res4d_branch2a\"\n\ttop: \"res4d_branch2a\"\n\tname: \"res4d_branch2a_relu\"\n\ttype: \"ReLU\"\n}\n\nlayer {\n\tbottom: \"res4d_branch2a\"\n\ttop: \"res4d_branch2b\"\n\tname: \"res4d_branch2b\"\n\ttype: \"Convolution\"\n\tconvolution_param {\n\t\tnum_output: 256\n\t\tkernel_size: 3\n\t\tpad: 1\n\t\tstride: 1\n\t\tbias_term: false\n\t}\n}\n\nlayer {\n\tbottom: \"res4d_branch2b\"\n\ttop: \"res4d_branch2b\"\n\tname: \"bn4d_branch2b\"\n\ttype: \"BatchNorm\"\n\tbatch_norm_param {\n\t\tuse_global_stats: true\n\t}\n}\n\nlayer {\n\tbottom: \"res4d_branch2b\"\n\ttop: \"res4d_branch2b\"\n\tname: \"scale4d_branch2b\"\n\ttype: \"Scale\"\n\tscale_param {\n\t\tbias_term: true\n\t}\n}\n\nlayer {\n\tbottom: \"res4d_branch2b\"\n\ttop: \"res4d_branch2b\"\n\tname: \"res4d_branch2b_relu\"\n\ttype: \"ReLU\"\n}\n\nlayer {\n\tbottom: \"res4d_branch2b\"\n\ttop: \"res4d_branch2c\"\n\tname: \"res4d_branch2c\"\n\ttype: \"Convolution\"\n\tconvolution_param {\n\t\tnum_output: 1024\n\t\tkernel_size: 1\n\t\tpad: 0\n\t\tstride: 1\n\t\tbias_term: false\n\t}\n}\n\nlayer {\n\tbottom: \"res4d_branch2c\"\n\ttop: \"res4d_branch2c\"\n\tname: \"bn4d_branch2c\"\n\ttype: \"BatchNorm\"\n\tbatch_norm_param {\n\t\tuse_global_stats: true\n\t}\n}\n\nlayer {\n\tbottom: \"res4d_branch2c\"\n\ttop: \"res4d_branch2c\"\n\tname: \"scale4d_branch2c\"\n\ttype: \"Scale\"\n\tscale_param {\n\t\tbias_term: true\n\t}\n}\n\nlayer {\n\tbottom: \"res4c\"\n\tbottom: \"res4d_branch2c\"\n\ttop: \"res4d\"\n\tname: \"res4d\"\n\ttype: \"Eltwise\"\n}\n\nlayer {\n\tbottom: \"res4d\"\n\ttop: \"res4d\"\n\tname: \"res4d_relu\"\n\ttype: \"ReLU\"\n}\n\nlayer {\n\tbottom: \"res4d\"\n\ttop: \"res4e_branch2a\"\n\tname: \"res4e_branch2a\"\n\ttype: \"Convolution\"\n\tconvolution_param {\n\t\tnum_output: 256\n\t\tkernel_size: 1\n\t\tpad: 0\n\t\tstride: 1\n\t\tbias_term: false\n\t}\n}\n\nlayer {\n\tbottom: \"res4e_branch2a\"\n\ttop: \"res4e_branch2a\"\n\tname: \"bn4e_branch2a\"\n\ttype: \"BatchNorm\"\n\tbatch_norm_param {\n\t\tuse_global_stats: true\n\t}\n}\n\nlayer {\n\tbottom: \"res4e_branch2a\"\n\ttop: \"res4e_branch2a\"\n\tname: \"scale4e_branch2a\"\n\ttype: \"Scale\"\n\tscale_param {\n\t\tbias_term: true\n\t}\n}\n\nlayer {\n\tbottom: \"res4e_branch2a\"\n\ttop: \"res4e_branch2a\"\n\tname: \"res4e_branch2a_relu\"\n\ttype: \"ReLU\"\n}\n\nlayer {\n\tbottom: \"res4e_branch2a\"\n\ttop: \"res4e_branch2b\"\n\tname: \"res4e_branch2b\"\n\ttype: \"Convolution\"\n\tconvolution_param {\n\t\tnum_output: 256\n\t\tkernel_size: 3\n\t\tpad: 1\n\t\tstride: 1\n\t\tbias_term: false\n\t}\n}\n\nlayer {\n\tbottom: \"res4e_branch2b\"\n\ttop: \"res4e_branch2b\"\n\tname: \"bn4e_branch2b\"\n\ttype: \"BatchNorm\"\n\tbatch_norm_param {\n\t\tuse_global_stats: true\n\t}\n}\n\nlayer {\n\tbottom: \"res4e_branch2b\"\n\ttop: \"res4e_branch2b\"\n\tname: \"scale4e_branch2b\"\n\ttype: \"Scale\"\n\tscale_param {\n\t\tbias_term: true\n\t}\n}\n\nlayer {\n\tbottom: \"res4e_branch2b\"\n\ttop: \"res4e_branch2b\"\n\tname: \"res4e_branch2b_relu\"\n\ttype: \"ReLU\"\n}\n\nlayer {\n\tbottom: \"res4e_branch2b\"\n\ttop: \"res4e_branch2c\"\n\tname: \"res4e_branch2c\"\n\ttype: \"Convolution\"\n\tconvolution_param {\n\t\tnum_output: 1024\n\t\tkernel_size: 1\n\t\tpad: 0\n\t\tstride: 1\n\t\tbias_term: false\n\t}\n}\n\nlayer {\n\tbottom: \"res4e_branch2c\"\n\ttop: \"res4e_branch2c\"\n\tname: \"bn4e_branch2c\"\n\ttype: \"BatchNorm\"\n\tbatch_norm_param {\n\t\tuse_global_stats: true\n\t}\n}\n\nlayer {\n\tbottom: \"res4e_branch2c\"\n\ttop: \"res4e_branch2c\"\n\tname: \"scale4e_branch2c\"\n\ttype: \"Scale\"\n\tscale_param {\n\t\tbias_term: true\n\t}\n}\n\nlayer {\n\tbottom: \"res4d\"\n\tbottom: \"res4e_branch2c\"\n\ttop: \"res4e\"\n\tname: \"res4e\"\n\ttype: \"Eltwise\"\n}\n\nlayer {\n\tbottom: \"res4e\"\n\ttop: \"res4e\"\n\tname: \"res4e_relu\"\n\ttype: \"ReLU\"\n}\n\nlayer {\n\tbottom: \"res4e\"\n\ttop: \"res4f_branch2a\"\n\tname: \"res4f_branch2a\"\n\ttype: \"Convolution\"\n\tconvolution_param {\n\t\tnum_output: 256\n\t\tkernel_size: 1\n\t\tpad: 0\n\t\tstride: 1\n\t\tbias_term: false\n\t}\n}\n\nlayer {\n\tbottom: \"res4f_branch2a\"\n\ttop: \"res4f_branch2a\"\n\tname: \"bn4f_branch2a\"\n\ttype: \"BatchNorm\"\n\tbatch_norm_param {\n\t\tuse_global_stats: true\n\t}\n}\n\nlayer {\n\tbottom: \"res4f_branch2a\"\n\ttop: \"res4f_branch2a\"\n\tname: \"scale4f_branch2a\"\n\ttype: \"Scale\"\n\tscale_param {\n\t\tbias_term: true\n\t}\n}\n\nlayer {\n\tbottom: \"res4f_branch2a\"\n\ttop: \"res4f_branch2a\"\n\tname: \"res4f_branch2a_relu\"\n\ttype: \"ReLU\"\n}\n\nlayer {\n\tbottom: \"res4f_branch2a\"\n\ttop: \"res4f_branch2b\"\n\tname: \"res4f_branch2b\"\n\ttype: \"Convolution\"\n\tconvolution_param {\n\t\tnum_output: 256\n\t\tkernel_size: 3\n\t\tpad: 1\n\t\tstride: 1\n\t\tbias_term: false\n\t}\n}\n\nlayer {\n\tbottom: \"res4f_branch2b\"\n\ttop: \"res4f_branch2b\"\n\tname: \"bn4f_branch2b\"\n\ttype: \"BatchNorm\"\n\tbatch_norm_param {\n\t\tuse_global_stats: true\n\t}\n}\n\nlayer {\n\tbottom: \"res4f_branch2b\"\n\ttop: \"res4f_branch2b\"\n\tname: \"scale4f_branch2b\"\n\ttype: \"Scale\"\n\tscale_param {\n\t\tbias_term: true\n\t}\n}\n\nlayer {\n\tbottom: \"res4f_branch2b\"\n\ttop: \"res4f_branch2b\"\n\tname: \"res4f_branch2b_relu\"\n\ttype: \"ReLU\"\n}\n\nlayer {\n\tbottom: \"res4f_branch2b\"\n\ttop: \"res4f_branch2c\"\n\tname: \"res4f_branch2c\"\n\ttype: \"Convolution\"\n\tconvolution_param {\n\t\tnum_output: 1024\n\t\tkernel_size: 1\n\t\tpad: 0\n\t\tstride: 1\n\t\tbias_term: false\n\t}\n}\n\nlayer {\n\tbottom: \"res4f_branch2c\"\n\ttop: \"res4f_branch2c\"\n\tname: \"bn4f_branch2c\"\n\ttype: \"BatchNorm\"\n\tbatch_norm_param {\n\t\tuse_global_stats: true\n\t}\n}\n\nlayer {\n\tbottom: \"res4f_branch2c\"\n\ttop: \"res4f_branch2c\"\n\tname: \"scale4f_branch2c\"\n\ttype: \"Scale\"\n\tscale_param {\n\t\tbias_term: true\n\t}\n}\n\nlayer {\n\tbottom: \"res4e\"\n\tbottom: \"res4f_branch2c\"\n\ttop: \"res4f\"\n\tname: \"res4f\"\n\ttype: \"Eltwise\"\n}\n\nlayer {\n\tbottom: \"res4f\"\n\ttop: \"res4f\"\n\tname: \"res4f_relu\"\n\ttype: \"ReLU\"\n}\n\n\nlayer {\n\tbottom: \"res4f\"\n\ttop: \"res5a_branch1\"\n\tname: \"res5a_branch1\"\n\ttype: \"Convolution\"\n\tconvolution_param {\n\t\tnum_output: 2048\n\t\tkernel_size: 1\n\t\tpad: 0\n\t\tstride: 2\n\t\tbias_term: false\n\t}\n}\n\nlayer {\n\tbottom: \"res5a_branch1\"\n\ttop: \"res5a_branch1\"\n\tname: \"bn5a_branch1\"\n\ttype: \"BatchNorm\"\n\tbatch_norm_param {\n\t\tuse_global_stats: true\n\t}\n}\n\nlayer {\n\tbottom: \"res5a_branch1\"\n\ttop: \"res5a_branch1\"\n\tname: \"scale5a_branch1\"\n\ttype: \"Scale\"\n\tscale_param {\n\t\tbias_term: true\n\t}\n}\n\nlayer {\n\tbottom: \"res4f\"\n\ttop: \"res5a_branch2a\"\n\tname: \"res5a_branch2a\"\n\ttype: \"Convolution\"\n\tconvolution_param {\n\t\tnum_output: 512\n\t\tkernel_size: 1\n\t\tpad: 0\n\t\tstride: 2\n\t\tbias_term: false\n\t}\n}\n\nlayer {\n\tbottom: \"res5a_branch2a\"\n\ttop: \"res5a_branch2a\"\n\tname: \"bn5a_branch2a\"\n\ttype: \"BatchNorm\"\n\tbatch_norm_param {\n\t\tuse_global_stats: true\n\t}\n}\n\nlayer {\n\tbottom: \"res5a_branch2a\"\n\ttop: \"res5a_branch2a\"\n\tname: \"scale5a_branch2a\"\n\ttype: \"Scale\"\n\tscale_param {\n\t\tbias_term: true\n\t}\n}\n\nlayer {\n\tbottom: \"res5a_branch2a\"\n\ttop: \"res5a_branch2a\"\n\tname: \"res5a_branch2a_relu\"\n\ttype: \"ReLU\"\n}\n\nlayer {\n\tbottom: \"res5a_branch2a\"\n\ttop: \"res5a_branch2b\"\n\tname: \"res5a_branch2b\"\n\ttype: \"Convolution\"\n\tconvolution_param {\n\t\tnum_output: 512\n\t\tkernel_size: 3\n\t\tpad: 1\n\t\tstride: 1\n\t\tbias_term: false\n\t}\n}\n\nlayer {\n\tbottom: \"res5a_branch2b\"\n\ttop: \"res5a_branch2b\"\n\tname: \"bn5a_branch2b\"\n\ttype: \"BatchNorm\"\n\tbatch_norm_param {\n\t\tuse_global_stats: true\n\t}\n}\n\nlayer {\n\tbottom: \"res5a_branch2b\"\n\ttop: \"res5a_branch2b\"\n\tname: \"scale5a_branch2b\"\n\ttype: \"Scale\"\n\tscale_param {\n\t\tbias_term: true\n\t}\n}\n\nlayer {\n\tbottom: \"res5a_branch2b\"\n\ttop: \"res5a_branch2b\"\n\tname: \"res5a_branch2b_relu\"\n\ttype: \"ReLU\"\n}\n\nlayer {\n\tbottom: \"res5a_branch2b\"\n\ttop: \"res5a_branch2c\"\n\tname: \"res5a_branch2c\"\n\ttype: \"Convolution\"\n\tconvolution_param {\n\t\tnum_output: 2048\n\t\tkernel_size: 1\n\t\tpad: 0\n\t\tstride: 1\n\t\tbias_term: false\n\t}\n}\n\nlayer {\n\tbottom: \"res5a_branch2c\"\n\ttop: \"res5a_branch2c\"\n\tname: \"bn5a_branch2c\"\n\ttype: \"BatchNorm\"\n\tbatch_norm_param {\n\t\tuse_global_stats: true\n\t}\n}\n\nlayer {\n\tbottom: \"res5a_branch2c\"\n\ttop: \"res5a_branch2c\"\n\tname: \"scale5a_branch2c\"\n\ttype: \"Scale\"\n\tscale_param {\n\t\tbias_term: true\n\t}\n}\n\nlayer {\n\tbottom: \"res5a_branch1\"\n\tbottom: \"res5a_branch2c\"\n\ttop: \"res5a\"\n\tname: \"res5a\"\n\ttype: \"Eltwise\"\n}\n\nlayer {\n\tbottom: \"res5a\"\n\ttop: \"res5a\"\n\tname: \"res5a_relu\"\n\ttype: \"ReLU\"\n}\n\nlayer {\n\tbottom: \"res5a\"\n\ttop: \"res5b_branch2a\"\n\tname: \"res5b_branch2a\"\n\ttype: \"Convolution\"\n\tconvolution_param {\n\t\tnum_output: 512\n\t\tkernel_size: 1\n\t\tpad: 0\n\t\tstride: 1\n\t\tbias_term: false\n\t}\n}\n\nlayer {\n\tbottom: \"res5b_branch2a\"\n\ttop: \"res5b_branch2a\"\n\tname: \"bn5b_branch2a\"\n\ttype: \"BatchNorm\"\n\tbatch_norm_param {\n\t\tuse_global_stats: true\n\t}\n}\n\nlayer {\n\tbottom: \"res5b_branch2a\"\n\ttop: \"res5b_branch2a\"\n\tname: \"scale5b_branch2a\"\n\ttype: \"Scale\"\n\tscale_param {\n\t\tbias_term: true\n\t}\n}\n\nlayer {\n\tbottom: \"res5b_branch2a\"\n\ttop: \"res5b_branch2a\"\n\tname: \"res5b_branch2a_relu\"\n\ttype: \"ReLU\"\n}\n\nlayer {\n\tbottom: \"res5b_branch2a\"\n\ttop: \"res5b_branch2b\"\n\tname: \"res5b_branch2b\"\n\ttype: \"Convolution\"\n\tconvolution_param {\n\t\tnum_output: 512\n\t\tkernel_size: 3\n\t\tpad: 1\n\t\tstride: 1\n\t\tbias_term: false\n\t}\n}\n\nlayer {\n\tbottom: \"res5b_branch2b\"\n\ttop: \"res5b_branch2b\"\n\tname: \"bn5b_branch2b\"\n\ttype: \"BatchNorm\"\n\tbatch_norm_param {\n\t\tuse_global_stats: true\n\t}\n}\n\nlayer {\n\tbottom: \"res5b_branch2b\"\n\ttop: \"res5b_branch2b\"\n\tname: \"scale5b_branch2b\"\n\ttype: \"Scale\"\n\tscale_param {\n\t\tbias_term: true\n\t}\n}\n\nlayer {\n\tbottom: \"res5b_branch2b\"\n\ttop: \"res5b_branch2b\"\n\tname: \"res5b_branch2b_relu\"\n\ttype: \"ReLU\"\n}\n\nlayer {\n\tbottom: \"res5b_branch2b\"\n\ttop: \"res5b_branch2c\"\n\tname: \"res5b_branch2c\"\n\ttype: \"Convolution\"\n\tconvolution_param {\n\t\tnum_output: 2048\n\t\tkernel_size: 1\n\t\tpad: 0\n\t\tstride: 1\n\t\tbias_term: false\n\t}\n}\n\nlayer {\n\tbottom: \"res5b_branch2c\"\n\ttop: \"res5b_branch2c\"\n\tname: \"bn5b_branch2c\"\n\ttype: \"BatchNorm\"\n\tbatch_norm_param {\n\t\tuse_global_stats: true\n\t}\n}\n\nlayer {\n\tbottom: \"res5b_branch2c\"\n\ttop: \"res5b_branch2c\"\n\tname: \"scale5b_branch2c\"\n\ttype: \"Scale\"\n\tscale_param {\n\t\tbias_term: true\n\t}\n}\n\nlayer {\n\tbottom: \"res5a\"\n\tbottom: \"res5b_branch2c\"\n\ttop: \"res5b\"\n\tname: \"res5b\"\n\ttype: \"Eltwise\"\n}\n\nlayer {\n\tbottom: \"res5b\"\n\ttop: \"res5b\"\n\tname: \"res5b_relu\"\n\ttype: \"ReLU\"\n}\n\nlayer {\n\tbottom: \"res5b\"\n\ttop: \"res5c_branch2a\"\n\tname: \"res5c_branch2a\"\n\ttype: \"Convolution\"\n\tconvolution_param {\n\t\tnum_output: 512\n\t\tkernel_size: 1\n\t\tpad: 0\n\t\tstride: 1\n\t\tbias_term: false\n\t}\n}\n\nlayer {\n\tbottom: \"res5c_branch2a\"\n\ttop: \"res5c_branch2a\"\n\tname: \"bn5c_branch2a\"\n\ttype: \"BatchNorm\"\n\tbatch_norm_param {\n\t\tuse_global_stats: true\n\t}\n}\n\nlayer {\n\tbottom: \"res5c_branch2a\"\n\ttop: \"res5c_branch2a\"\n\tname: \"scale5c_branch2a\"\n\ttype: \"Scale\"\n\tscale_param {\n\t\tbias_term: true\n\t}\n}\n\nlayer {\n\tbottom: \"res5c_branch2a\"\n\ttop: \"res5c_branch2a\"\n\tname: \"res5c_branch2a_relu\"\n\ttype: \"ReLU\"\n}\n\nlayer {\n\tbottom: \"res5c_branch2a\"\n\ttop: \"res5c_branch2b\"\n\tname: \"res5c_branch2b\"\n\ttype: \"Convolution\"\n\tconvolution_param {\n\t\tnum_output: 512\n\t\tkernel_size: 3\n\t\tpad: 1\n\t\tstride: 1\n\t\tbias_term: false\n\t}\n}\n\nlayer {\n\tbottom: \"res5c_branch2b\"\n\ttop: \"res5c_branch2b\"\n\tname: \"bn5c_branch2b\"\n\ttype: \"BatchNorm\"\n\tbatch_norm_param {\n\t\tuse_global_stats: true\n\t}\n}\n\nlayer {\n\tbottom: \"res5c_branch2b\"\n\ttop: \"res5c_branch2b\"\n\tname: \"scale5c_branch2b\"\n\ttype: \"Scale\"\n\tscale_param {\n\t\tbias_term: true\n\t}\n}\n\nlayer {\n\tbottom: \"res5c_branch2b\"\n\ttop: \"res5c_branch2b\"\n\tname: \"res5c_branch2b_relu\"\n\ttype: \"ReLU\"\n}\n\nlayer {\n\tbottom: \"res5c_branch2b\"\n\ttop: \"res5c_branch2c\"\n\tname: \"res5c_branch2c\"\n\ttype: \"Convolution\"\n\tconvolution_param {\n\t\tnum_output: 2048\n\t\tkernel_size: 1\n\t\tpad: 0\n\t\tstride: 1\n\t\tbias_term: false\n\t}\n}\n\nlayer {\n\tbottom: \"res5c_branch2c\"\n\ttop: \"res5c_branch2c\"\n\tname: \"bn5c_branch2c\"\n\ttype: \"BatchNorm\"\n\tbatch_norm_param {\n\t\tuse_global_stats: true\n\t}\n}\n\nlayer {\n\tbottom: \"res5c_branch2c\"\n\ttop: \"res5c_branch2c\"\n\tname: \"scale5c_branch2c\"\n\ttype: \"Scale\"\n\tscale_param {\n\t\tbias_term: true\n\t}\n}\n\nlayer {\n\tbottom: \"res5b\"\n\tbottom: \"res5c_branch2c\"\n\ttop: \"res5c\"\n\tname: \"res5c\"\n\ttype: \"Eltwise\"\n}\n\nlayer {\n\tbottom: \"res5c\"\n\ttop: \"res5c\"\n\tname: \"res5c_relu\"\n\ttype: \"ReLU\"\n}\n\n\n#========= RPN ============\n\nlayer {\n  name: \"rpn_conv/3x3/output\"\n  type: \"Convolution\"\n  bottom: \"res5c\"\n  top: \"rpn_conv/3x3/output\"\n  convolution_param {\n    num_output: 256\n    kernel_size: 3 pad: 1 stride: 1\n    weight_filler { type: \"gaussian\" std: 0.01 }\n    bias_filler { type: \"constant\" value: 0 }\n  }\n}\nlayer {\n  name: \"rpn_relu/3x3\"\n  type: \"ReLU\"\n  bottom: \"rpn_conv/3x3/output\"\n  top: \"rpn_conv/3x3/output\"\n}\nlayer {\n  name: \"rpn_cls_score\"\n  type: \"Convolution\"\n  bottom: \"rpn_conv/3x3/output\"\n  top: \"rpn_cls_score\"\n  convolution_param {\n    num_output: 18   # 2(bg/fg) * 9(anchors)\n    kernel_size: 1 pad: 0 stride: 1\n    weight_filler { type: \"gaussian\" std: 0.01 }\n    bias_filler { type: \"constant\" value: 0 }\n  }\n}\nlayer {\n  name: \"rpn_bbox_pred\"\n  type: \"Convolution\"\n  bottom: \"rpn_conv/3x3/output\"\n  top: \"rpn_bbox_pred\"\n  convolution_param {\n    num_output: 36   # 4 * 9(anchors)\n    kernel_size: 1 pad: 0 stride: 1\n    weight_filler { type: \"gaussian\" std: 0.01 }\n    bias_filler { type: \"constant\" value: 0 }\n  }\n}\nlayer {\n   bottom: \"rpn_cls_score\"\n   top: \"rpn_cls_score_reshape\"\n   name: \"rpn_cls_score_reshape\"\n   type: \"Reshape\"\n   reshape_param { shape { dim: 0 dim: 2 dim: -1 dim: 0 } }\n}\n\n#========= RoI Proposal ============\n\nlayer {\n  name: \"rpn_cls_prob\"\n  type: \"Softmax\"\n  bottom: \"rpn_cls_score_reshape\"\n  top: \"rpn_cls_prob\"\n}\nlayer {\n  name: 'rpn_cls_prob_reshape'\n  type: 'Reshape'\n  bottom: 'rpn_cls_prob'\n  top: 'rpn_cls_prob_reshape'\n  reshape_param { shape { dim: 0 dim: 18 dim: -1 dim: 0 } }\n}\nlayer {\n  name: 'rpn_proposals'\n  type: 'Python'\n  bottom: 'rpn_cls_prob_reshape'\n  bottom: 'rpn_bbox_pred'\n  bottom: 'im_info'\n  top: 'rpn_proposals'\n  python_param {\n    module: 'rpn.proposal_layer'\n    layer: 'ProposalLayer'\n    param_str: \"'feat_stride': 16\"\n  }\n}\n\n#========= ROI POOLING ============\n\nlayer {\n  name: \"roi_pool\"\n  type: \"ROIPooling\"\n  bottom: \"res5c\"\n  bottom: \"rpn_proposals\"\n  top: \"roi_pool\"\n  roi_pooling_param {\n    pooled_w: 6\n    pooled_h: 6\n    spatial_scale: 0.0625 # 1/16\n  }\n}\n\n# ====== BASE CNN, PART B =======\n\nlayer {\n\tbottom: \"roi_pool\"\n\ttop: \"pool5\"\n\tname: \"pool5\"\n\ttype: \"Pooling\"\n\tpooling_param {\n\t#\tglobal_pooling: 1\n    kernel_size: 6\n\t\tstride: 1\n\t\tpool: AVE\n\t}\n}\n\nlayer {\n\tbottom: \"pool5\"\n\ttop: \"fc1000\"\n\tname: \"fc1000\"\n\ttype: \"InnerProduct\"\n\tinner_product_param {\n\t\tnum_output: 1000\n\t}\n}\n\n# ====== CLASSIFICATION =======\n\nlayer {\n  name: \"cls_score\"\n  type: \"InnerProduct\"\n  bottom: \"fc1000\"\n  top: \"cls_score\"\n  inner_product_param {\n    num_output: 21\n  }\n}\nlayer {\n  name: \"bbox_pred\"\n  type: \"InnerProduct\"\n  bottom: \"fc1000\"\n  top: \"bbox_pred\"\n  inner_product_param {\n    num_output: 84\n  }\n}\nlayer {\n  name: \"bbox_out\"\n  type: \"implicit\"\n  bottom: \"bbox_pred\"\n}\nlayer {\n  name: \"cls_prob\"\n  type: \"Softmax\"\n  bottom: \"cls_score\"\n  top: \"cls_prob\"\n  loss_param {\n    ignore_label: -1\n    normalize: true\n  }\n}\n"
  },
  {
    "path": "presets/fasterRCNN_VGG.prototxt",
    "content": "name: \"Faster R-CNN (VGG16)\"\n\ninput: \"data\"\ninput_shape {\n  dim: 1\n  dim: 3\n  dim: 400\n  dim: 500\n}\n\ninput: \"im_info\"\ninput_shape {\n  dim: 1\n  dim: 3\n}\n\nlayer {\n  name: \"conv1_1\"\n  type: \"Convolution\"\n  bottom: \"data\"\n  top: \"conv1_1\"\n  param {\n    lr_mult: 0\n    decay_mult: 0\n  }\n  param {\n    lr_mult: 0\n    decay_mult: 0\n  }\n  convolution_param {\n    num_output: 64\n    pad: 1\n    kernel_size: 3\n  }\n}\nlayer {\n  name: \"relu1_1\"\n  type: \"ReLU\"\n  bottom: \"conv1_1\"\n  top: \"conv1_1\"\n}\nlayer {\n  name: \"conv1_2\"\n  type: \"Convolution\"\n  bottom: \"conv1_1\"\n  top: \"conv1_2\"\n  param {\n    lr_mult: 0\n    decay_mult: 0\n  }\n  param {\n    lr_mult: 0\n    decay_mult: 0\n  }\n  convolution_param {\n    num_output: 64\n    pad: 1\n    kernel_size: 3\n  }\n}\nlayer {\n  name: \"relu1_2\"\n  type: \"ReLU\"\n  bottom: \"conv1_2\"\n  top: \"conv1_2\"\n}\nlayer {\n  name: \"pool1\"\n  type: \"Pooling\"\n  bottom: \"conv1_2\"\n  top: \"pool1\"\n  pooling_param {\n    pool: MAX\n    kernel_size: 2\n    stride: 2\n  }\n}\nlayer {\n  name: \"conv2_1\"\n  type: \"Convolution\"\n  bottom: \"pool1\"\n  top: \"conv2_1\"\n  param {\n    lr_mult: 0\n    decay_mult: 0\n  }\n  param {\n    lr_mult: 0\n    decay_mult: 0\n  }\n  convolution_param {\n    num_output: 128\n    pad: 1\n    kernel_size: 3\n  }\n}\nlayer {\n  name: \"relu2_1\"\n  type: \"ReLU\"\n  bottom: \"conv2_1\"\n  top: \"conv2_1\"\n}\nlayer {\n  name: \"conv2_2\"\n  type: \"Convolution\"\n  bottom: \"conv2_1\"\n  top: \"conv2_2\"\n  param {\n    lr_mult: 0\n    decay_mult: 0\n  }\n  param {\n    lr_mult: 0\n    decay_mult: 0\n  }\n  convolution_param {\n    num_output: 128\n    pad: 1\n    kernel_size: 3\n  }\n}\nlayer {\n  name: \"relu2_2\"\n  type: \"ReLU\"\n  bottom: \"conv2_2\"\n  top: \"conv2_2\"\n}\nlayer {\n  name: \"pool2\"\n  type: \"Pooling\"\n  bottom: \"conv2_2\"\n  top: \"pool2\"\n  pooling_param {\n    pool: MAX\n    kernel_size: 2\n    stride: 2\n  }\n}\nlayer {\n  name: \"conv3_1\"\n  type: \"Convolution\"\n  bottom: \"pool2\"\n  top: \"conv3_1\"\n  param {\n    lr_mult: 1\n    decay_mult: 1\n  }\n  param {\n    lr_mult: 2\n    decay_mult: 0\n  }\n  convolution_param {\n    num_output: 256\n    pad: 1\n    kernel_size: 3\n  }\n}\nlayer {\n  name: \"relu3_1\"\n  type: \"ReLU\"\n  bottom: \"conv3_1\"\n  top: \"conv3_1\"\n}\nlayer {\n  name: \"conv3_2\"\n  type: \"Convolution\"\n  bottom: \"conv3_1\"\n  top: \"conv3_2\"\n  param {\n    lr_mult: 1\n    decay_mult: 1\n  }\n  param {\n    lr_mult: 2\n    decay_mult: 0\n  }\n  convolution_param {\n    num_output: 256\n    pad: 1\n    kernel_size: 3\n  }\n}\nlayer {\n  name: \"relu3_2\"\n  type: \"ReLU\"\n  bottom: \"conv3_2\"\n  top: \"conv3_2\"\n}\nlayer {\n  name: \"conv3_3\"\n  type: \"Convolution\"\n  bottom: \"conv3_2\"\n  top: \"conv3_3\"\n  param {\n    lr_mult: 1\n    decay_mult: 1\n  }\n  param {\n    lr_mult: 2\n    decay_mult: 0\n  }\n  convolution_param {\n    num_output: 256\n    pad: 1\n    kernel_size: 3\n  }\n}\nlayer {\n  name: \"relu3_3\"\n  type: \"ReLU\"\n  bottom: \"conv3_3\"\n  top: \"conv3_3\"\n}\nlayer {\n  name: \"pool3\"\n  type: \"Pooling\"\n  bottom: \"conv3_3\"\n  top: \"pool3\"\n  pooling_param {\n    pool: MAX\n    kernel_size: 2\n    stride: 2\n  }\n}\nlayer {\n  name: \"conv4_1\"\n  type: \"Convolution\"\n  bottom: \"pool3\"\n  top: \"conv4_1\"\n  param {\n    lr_mult: 1\n    decay_mult: 1\n  }\n  param {\n    lr_mult: 2\n    decay_mult: 0\n  }\n  convolution_param {\n    num_output: 512\n    pad: 1\n    kernel_size: 3\n  }\n}\nlayer {\n  name: \"relu4_1\"\n  type: \"ReLU\"\n  bottom: \"conv4_1\"\n  top: \"conv4_1\"\n}\nlayer {\n  name: \"conv4_2\"\n  type: \"Convolution\"\n  bottom: \"conv4_1\"\n  top: \"conv4_2\"\n  param {\n    lr_mult: 1\n    decay_mult: 1\n  }\n  param {\n    lr_mult: 2\n    decay_mult: 0\n  }\n  convolution_param {\n    num_output: 512\n    pad: 1\n    kernel_size: 3\n  }\n}\nlayer {\n  name: \"relu4_2\"\n  type: \"ReLU\"\n  bottom: \"conv4_2\"\n  top: \"conv4_2\"\n}\nlayer {\n  name: \"conv4_3\"\n  type: \"Convolution\"\n  bottom: \"conv4_2\"\n  top: \"conv4_3\"\n  param {\n    lr_mult: 1\n    decay_mult: 1\n  }\n  param {\n    lr_mult: 2\n    decay_mult: 0\n  }\n  convolution_param {\n    num_output: 512\n    pad: 1\n    kernel_size: 3\n  }\n}\nlayer {\n  name: \"relu4_3\"\n  type: \"ReLU\"\n  bottom: \"conv4_3\"\n  top: \"conv4_3\"\n}\nlayer {\n  name: \"pool4\"\n  type: \"Pooling\"\n  bottom: \"conv4_3\"\n  top: \"pool4\"\n  pooling_param {\n    pool: MAX\n    kernel_size: 2\n    stride: 2\n  }\n}\nlayer {\n  name: \"conv5_1\"\n  type: \"Convolution\"\n  bottom: \"pool4\"\n  top: \"conv5_1\"\n  param {\n    lr_mult: 1\n    decay_mult: 1\n  }\n  param {\n    lr_mult: 2\n    decay_mult: 0\n  }\n  convolution_param {\n    num_output: 512\n    pad: 1\n    kernel_size: 3\n  }\n}\nlayer {\n  name: \"relu5_1\"\n  type: \"ReLU\"\n  bottom: \"conv5_1\"\n  top: \"conv5_1\"\n}\nlayer {\n  name: \"conv5_2\"\n  type: \"Convolution\"\n  bottom: \"conv5_1\"\n  top: \"conv5_2\"\n  param {\n    lr_mult: 1\n    decay_mult: 1\n  }\n  param {\n    lr_mult: 2\n    decay_mult: 0\n  }\n  convolution_param {\n    num_output: 512\n    pad: 1\n    kernel_size: 3\n  }\n}\nlayer {\n  name: \"relu5_2\"\n  type: \"ReLU\"\n  bottom: \"conv5_2\"\n  top: \"conv5_2\"\n}\nlayer {\n  name: \"conv5_3\"\n  type: \"Convolution\"\n  bottom: \"conv5_2\"\n  top: \"conv5_3\"\n  param {\n    lr_mult: 1\n    decay_mult: 1\n  }\n  param {\n    lr_mult: 2\n    decay_mult: 0\n  }\n  convolution_param {\n    num_output: 512\n    pad: 1\n    kernel_size: 3\n  }\n}\nlayer {\n  name: \"relu5_3\"\n  type: \"ReLU\"\n  bottom: \"conv5_3\"\n  top: \"conv5_3\"\n}\n\n#========= RPN ============\n\nlayer {\n  name: \"rpn/conv3x3/output\"\n  type: \"Convolution\"\n  bottom: \"conv5_3\"\n  top: \"rpn/conv3x3/output\"\n  param { lr_mult: 1.0 decay_mult: 1.0 }\n  param { lr_mult: 2.0 decay_mult: 0 }\n  convolution_param {\n    num_output: 512\n    kernel_size: 3 pad: 1 stride: 1\n    weight_filler { type: \"gaussian\" std: 0.01 }\n    bias_filler { type: \"constant\" value: 0 }\n  }\n}\nlayer {\n  name: \"rpn_relu/3x3\"\n  type: \"ReLU\"\n  bottom: \"rpn/conv3x3/output\"\n  top: \"rpn/conv3x3/output\"\n}\n\nlayer {\n  name: \"rpn_cls_score\"\n  type: \"Convolution\"\n  bottom: \"rpn/conv3x3/output\"\n  top: \"rpn_cls_score\"\n  param { lr_mult: 1.0 decay_mult: 1.0 }\n  param { lr_mult: 2.0 decay_mult: 0 }\n  convolution_param {\n    num_output: 18   # 2(bg/fg) * 9(anchors)\n    kernel_size: 1 pad: 0 stride: 1\n    weight_filler { type: \"gaussian\" std: 0.01 }\n    bias_filler { type: \"constant\" value: 0 }\n  }\n}\nlayer {\n  name: \"rpn_bbox_pred\"\n  type: \"Convolution\"\n  bottom: \"rpn/conv3x3/output\"\n  top: \"rpn_bbox_pred\"\n  param { lr_mult: 1.0 decay_mult: 1.0 }\n  param { lr_mult: 2.0 decay_mult: 0 }\n  convolution_param {\n    num_output: 36   # 4 * 9(anchors)\n    kernel_size: 1 pad: 0 stride: 1\n    weight_filler { type: \"gaussian\" std: 0.01 }\n    bias_filler { type: \"constant\" value: 0 }\n  }\n}\nlayer {\n   bottom: \"rpn_cls_score\"\n   top: \"rpn_cls_score_reshape\"\n   name: \"rpn_cls_score_reshape\"\n   type: \"Reshape\"\n   reshape_param { shape { dim: 0 dim: 2 dim: -1 dim: 0 } }\n}\n\n#========= RoI Proposal ============\n\nlayer {\n  name: \"rpn_cls_prob\"\n  type: \"Softmax\"\n  bottom: \"rpn_cls_score_reshape\"\n  top: \"rpn_cls_prob\"\n}\nlayer {\n  name: \"rpn_cls_prob_reshape\"\n  type: \"Reshape\"\n  bottom: \"rpn_cls_prob\"\n  top: \"rpn_cls_prob_reshape\"\n  reshape_param { shape { dim: 0 dim: 18 dim: -1 dim: 0 } }\n}\nlayer {\n  name: \"roi_proposals\"\n  type: \"Python\"\n  bottom: \"rpn_cls_prob_reshape\"\n  bottom: \"rpn_bbox_pred\"\n  bottom: \"im_info\"\n  top: \"roi_proposals\"\n  python_param {\n    module: \"rpn.proposal_layer\"\n    layer: \"ProposalLayer\"\n    param_str: \"'feat_stride': 16\"\n  }\n}\n\n#========= RCNN ============\n\nlayer {\n  name: \"roi_pool5\"\n  type: \"ROIPooling\"\n  bottom: \"conv5_3\"\n  bottom: \"roi_proposals\"\n  top: \"roi_pool5\"\n  roi_pooling_param {\n    pooled_w: 7\n    pooled_h: 7\n    spatial_scale: 0.0625 # 1/16\n  }\n}\nlayer {\n  name: \"fc6\"\n  type: \"InnerProduct\"\n  bottom: \"roi_pool5\"\n  top: \"fc6\"\n  param {\n    lr_mult: 1\n    decay_mult: 1\n  }\n  param {\n    lr_mult: 2\n    decay_mult: 0\n  }\n  inner_product_param {\n    num_output: 4096\n  }\n}\nlayer {\n  name: \"relu6\"\n  type: \"ReLU\"\n  bottom: \"fc6\"\n  top: \"fc6\"\n}\nlayer {\n  name: \"drop6\"\n  type: \"Dropout\"\n  bottom: \"fc6\"\n  top: \"fc6\"\n  dropout_param {\n    dropout_ratio: 0.5\n  }\n}\nlayer {\n  name: \"fc7\"\n  type: \"InnerProduct\"\n  bottom: \"fc6\"\n  top: \"fc7\"\n  param {\n    lr_mult: 1\n    decay_mult: 1\n  }\n  param {\n    lr_mult: 2\n    decay_mult: 0\n  }\n  inner_product_param {\n    num_output: 4096\n  }\n}\nlayer {\n  name: \"relu7\"\n  type: \"ReLU\"\n  bottom: \"fc7\"\n  top: \"fc7\"\n}\nlayer {\n  name: \"drop7\"\n  type: \"Dropout\"\n  bottom: \"fc7\"\n  top: \"fc7\"\n  dropout_param {\n    dropout_ratio: 0.5\n  }\n}\nlayer {\n  name: \"cls_score\"\n  type: \"InnerProduct\"\n  bottom: \"fc7\"\n  top: \"cls_score\"\n  param {\n    lr_mult: 1\n    decay_mult: 1\n  }\n  param {\n    lr_mult: 2\n    decay_mult: 0\n  }\n  inner_product_param {\n    num_output: 21\n    weight_filler {\n      type: \"gaussian\"\n      std: 0.01\n    }\n    bias_filler {\n      type: \"constant\"\n      value: 0\n    }\n  }\n}\nlayer {\n  name: \"bbox_pred\"\n  type: \"InnerProduct\"\n  bottom: \"fc7\"\n  top: \"bbox_pred\"\n  param {\n    lr_mult: 1\n    decay_mult: 1\n  }\n  param {\n    lr_mult: 2\n    decay_mult: 0\n  }\n  inner_product_param {\n    num_output: 84\n    weight_filler {\n      type: \"gaussian\"\n      std: 0.001\n    }\n    bias_filler {\n      type: \"constant\"\n      value: 0\n    }\n  }\n}\nlayer {\n  name: \"bbox_out\"\n  type: \"implicit\"\n  bottom: \"bbox_pred\"\n}\nlayer {\n  name: \"cls_prob\"\n  type: \"Softmax\"\n  bottom: \"cls_score\"\n  top: \"cls_prob\"\n}\n"
  },
  {
    "path": "presets/fasterRCNN_ZynqNet.prototxt",
    "content": "name: \"Faster R-CNN (ZynqNet)\"\n\ninput: \"data\"\ninput_shape {\n  dim: 1\n  dim: 3\n  dim: 500\n  dim: 400\n}\n\ninput: \"im_info\"\ninput_shape {\n  dim: 1\n  dim: 3\n}\n\n#========= BASE CNN, FULLY_CONVOLUTIONAL ============\n\nlayer {\n  name: \"conv1\"\n  type: \"Convolution\"\n  bottom: \"data\"\n  top: \"conv1\"\n  convolution_param {\n    num_output: 64\n    kernel_size: 3\n    stride: 2\n    pad: 1\n    weight_filler {\n      type: \"xavier\"\n    }\n  }\n}\nlayer {\n  name: \"relu_conv1\"\n  type: \"ReLU\"\n  bottom: \"conv1\"\n  top: \"conv1\"\n}\nlayer {\n  name: \"fire2/squeeze3x3\"\n  type: \"Convolution\"\n  bottom: \"conv1\"\n  top: \"fire2/squeeze3x3\"\n  convolution_param {\n    num_output: 16\n    kernel_size: 3\n    stride: 2\n    pad: 1\n    weight_filler {\n      type: \"xavier\"\n    }\n  }\n}\nlayer {\n  name: \"fire2/relu_squeeze3x3\"\n  type: \"ReLU\"\n  bottom: \"fire2/squeeze3x3\"\n  top: \"fire2/squeeze3x3\"\n}\nlayer {\n  name: \"fire2/expand1x1\"\n  type: \"Convolution\"\n  bottom: \"fire2/squeeze3x3\"\n  top: \"fire2/expand1x1\"\n  convolution_param {\n    num_output: 64\n    kernel_size: 1\n    weight_filler {\n      type: \"xavier\"\n    }\n  }\n}\nlayer {\n  name: \"fire2/relu_expand1x1\"\n  type: \"ReLU\"\n  bottom: \"fire2/expand1x1\"\n  top: \"fire2/expand1x1\"\n}\nlayer {\n  name: \"fire2/expand3x3\"\n  type: \"Convolution\"\n  bottom: \"fire2/squeeze3x3\"\n  top: \"fire2/expand3x3\"\n  convolution_param {\n    num_output: 64\n    pad: 1\n    kernel_size: 3\n    weight_filler {\n      type: \"xavier\"\n    }\n  }\n}\nlayer {\n  name: \"fire2/relu_expand3x3\"\n  type: \"ReLU\"\n  bottom: \"fire2/expand3x3\"\n  top: \"fire2/expand3x3\"\n}\nlayer {\n  name: \"fire2/concat\"\n  type: \"Concat\"\n  bottom: \"fire2/expand1x1\"\n  bottom: \"fire2/expand3x3\"\n  top: \"fire2/concat\"\n}\nlayer {\n  name: \"fire3/squeeze1x1\"\n  type: \"Convolution\"\n  bottom: \"fire2/concat\"\n  top: \"fire3/squeeze1x1\"\n  convolution_param {\n    num_output: 16\n    kernel_size: 1\n    weight_filler {\n      type: \"xavier\"\n    }\n  }\n}\nlayer {\n  name: \"fire3/relu_squeeze1x1\"\n  type: \"ReLU\"\n  bottom: \"fire3/squeeze1x1\"\n  top: \"fire3/squeeze1x1\"\n}\nlayer {\n  name: \"fire3/expand1x1\"\n  type: \"Convolution\"\n  bottom: \"fire3/squeeze1x1\"\n  top: \"fire3/expand1x1\"\n  convolution_param {\n    num_output: 64\n    kernel_size: 1\n    weight_filler {\n      type: \"xavier\"\n    }\n  }\n}\nlayer {\n  name: \"fire3/relu_expand1x1\"\n  type: \"ReLU\"\n  bottom: \"fire3/expand1x1\"\n  top: \"fire3/expand1x1\"\n}\nlayer {\n  name: \"fire3/expand3x3\"\n  type: \"Convolution\"\n  bottom: \"fire3/squeeze1x1\"\n  top: \"fire3/expand3x3\"\n  convolution_param {\n    num_output: 64\n    kernel_size: 3\n    pad: 1\n    weight_filler {\n      type: \"xavier\"\n    }\n  }\n}\nlayer {\n  name: \"fire3/relu_expand3x3\"\n  type: \"ReLU\"\n  bottom: \"fire3/expand3x3\"\n  top: \"fire3/expand3x3\"\n}\nlayer {\n  name: \"fire3/concat\"\n  type: \"Concat\"\n  bottom: \"fire3/expand1x1\"\n  bottom: \"fire3/expand3x3\"\n  top: \"fire3/concat\"\n}\nlayer {\n  name: \"fire4/squeeze3x3\"\n  type: \"Convolution\"\n  bottom: \"fire3/concat\"\n  top: \"fire4/squeeze3x3\"\n  convolution_param {\n    num_output: 32\n    kernel_size: 3\n    stride: 2\n    pad: 1\n    weight_filler {\n      type: \"xavier\"\n    }\n  }\n}\nlayer {\n  name: \"fire4/relu_squeeze3x3\"\n  type: \"ReLU\"\n  bottom: \"fire4/squeeze3x3\"\n  top: \"fire4/squeeze3x3\"\n}\nlayer {\n  name: \"fire4/expand1x1\"\n  type: \"Convolution\"\n  bottom: \"fire4/squeeze3x3\"\n  top: \"fire4/expand1x1\"\n  convolution_param {\n    num_output: 128\n    kernel_size: 1\n    weight_filler {\n      type: \"xavier\"\n    }\n  }\n}\nlayer {\n  name: \"fire4/relu_expand1x1\"\n  type: \"ReLU\"\n  bottom: \"fire4/expand1x1\"\n  top: \"fire4/expand1x1\"\n}\nlayer {\n  name: \"fire4/expand3x3\"\n  type: \"Convolution\"\n  bottom: \"fire4/squeeze3x3\"\n  top: \"fire4/expand3x3\"\n  convolution_param {\n    num_output: 128\n    kernel_size: 3\n    pad: 1\n    weight_filler {\n      type: \"xavier\"\n    }\n  }\n}\nlayer {\n  name: \"fire4/relu_expand3x3\"\n  type: \"ReLU\"\n  bottom: \"fire4/expand3x3\"\n  top: \"fire4/expand3x3\"\n}\nlayer {\n  name: \"fire4/concat\"\n  type: \"Concat\"\n  bottom: \"fire4/expand1x1\"\n  bottom: \"fire4/expand3x3\"\n  top: \"fire4/concat\"\n}\nlayer {\n  name: \"fire5/squeeze1x1\"\n  type: \"Convolution\"\n  bottom: \"fire4/concat\"\n  top: \"fire5/squeeze1x1\"\n  convolution_param {\n    num_output: 32\n    kernel_size: 1\n    weight_filler {\n      type: \"xavier\"\n    }\n  }\n}\nlayer {\n  name: \"fire5/relu_squeeze1x1\"\n  type: \"ReLU\"\n  bottom: \"fire5/squeeze1x1\"\n  top: \"fire5/squeeze1x1\"\n}\nlayer {\n  name: \"fire5/expand1x1\"\n  type: \"Convolution\"\n  bottom: \"fire5/squeeze1x1\"\n  top: \"fire5/expand1x1\"\n  convolution_param {\n    num_output: 128\n    kernel_size: 1\n    weight_filler {\n      type: \"xavier\"\n    }\n  }\n}\nlayer {\n  name: \"fire5/relu_expand1x1\"\n  type: \"ReLU\"\n  bottom: \"fire5/expand1x1\"\n  top: \"fire5/expand1x1\"\n}\nlayer {\n  name: \"fire5/expand3x3\"\n  type: \"Convolution\"\n  bottom: \"fire5/squeeze1x1\"\n  top: \"fire5/expand3x3\"\n  convolution_param {\n    num_output: 128\n    kernel_size: 3\n    pad: 1\n    weight_filler {\n      type: \"xavier\"\n    }\n  }\n}\nlayer {\n  name: \"fire5/relu_expand3x3\"\n  type: \"ReLU\"\n  bottom: \"fire5/expand3x3\"\n  top: \"fire5/expand3x3\"\n}\nlayer {\n  name: \"fire5/concat\"\n  type: \"Concat\"\n  bottom: \"fire5/expand1x1\"\n  bottom: \"fire5/expand3x3\"\n  top: \"fire5/concat\"\n}\nlayer {\n  name: \"fire6/squeeze3x3\"\n  type: \"Convolution\"\n  bottom: \"fire5/concat\"\n  top: \"fire6/squeeze3x3\"\n  convolution_param {\n    num_output: 64\n    kernel_size: 3\n    stride: 2\n    pad: 1\n    weight_filler {\n      type: \"xavier\"\n    }\n  }\n}\nlayer {\n  name: \"fire6/relu_squeeze3x3\"\n  type: \"ReLU\"\n  bottom: \"fire6/squeeze3x3\"\n  top: \"fire6/squeeze3x3\"\n}\nlayer {\n  name: \"fire6/expand1x1\"\n  type: \"Convolution\"\n  bottom: \"fire6/squeeze3x3\"\n  top: \"fire6/expand1x1\"\n  convolution_param {\n    num_output: 256\n    kernel_size: 1\n    weight_filler {\n      type: \"xavier\"\n    }\n  }\n}\nlayer {\n  name: \"fire6/relu_expand1x1\"\n  type: \"ReLU\"\n  bottom: \"fire6/expand1x1\"\n  top: \"fire6/expand1x1\"\n}\nlayer {\n  name: \"fire6/expand3x3\"\n  type: \"Convolution\"\n  bottom: \"fire6/squeeze3x3\"\n  top: \"fire6/expand3x3\"\n  convolution_param {\n    num_output: 256\n    kernel_size: 3\n    pad: 1\n    weight_filler {\n      type: \"xavier\"\n    }\n  }\n}\nlayer {\n  name: \"fire6/relu_expand3x3\"\n  type: \"ReLU\"\n  bottom: \"fire6/expand3x3\"\n  top: \"fire6/expand3x3\"\n}\nlayer {\n  name: \"fire6/concat\"\n  type: \"Concat\"\n  bottom: \"fire6/expand1x1\"\n  bottom: \"fire6/expand3x3\"\n  top: \"fire6/concat\"\n}\nlayer {\n  name: \"fire7/squeeze1x1\"\n  type: \"Convolution\"\n  bottom: \"fire6/concat\"\n  top: \"fire7/squeeze1x1\"\n  convolution_param {\n    num_output: 64\n    kernel_size: 1\n    weight_filler {\n      type: \"xavier\"\n    }\n  }\n}\nlayer {\n  name: \"fire7/relu_squeeze1x1\"\n  type: \"ReLU\"\n  bottom: \"fire7/squeeze1x1\"\n  top: \"fire7/squeeze1x1\"\n}\nlayer {\n  name: \"fire7/expand1x1\"\n  type: \"Convolution\"\n  bottom: \"fire7/squeeze1x1\"\n  top: \"fire7/expand1x1\"\n  convolution_param {\n    num_output: 192\n    kernel_size: 1\n    weight_filler {\n      type: \"xavier\"\n    }\n  }\n}\nlayer {\n  name: \"fire7/relu_expand1x1\"\n  type: \"ReLU\"\n  bottom: \"fire7/expand1x1\"\n  top: \"fire7/expand1x1\"\n}\nlayer {\n  name: \"fire7/expand3x3\"\n  type: \"Convolution\"\n  bottom: \"fire7/squeeze1x1\"\n  top: \"fire7/expand3x3\"\n  convolution_param {\n    num_output: 192\n    kernel_size: 3\n    pad: 1\n    weight_filler {\n      type: \"xavier\"\n    }\n  }\n}\nlayer {\n  name: \"fire7/relu_expand3x3\"\n  type: \"ReLU\"\n  bottom: \"fire7/expand3x3\"\n  top: \"fire7/expand3x3\"\n}\nlayer {\n  name: \"fire7/concat\"\n  type: \"Concat\"\n  bottom: \"fire7/expand1x1\"\n  bottom: \"fire7/expand3x3\"\n  top: \"fire7/concat\"\n}\nlayer {\n  name: \"fire8/squeeze3x3\"\n  type: \"Convolution\"\n  bottom: \"fire7/concat\"\n  top: \"fire8/squeeze3x3\"\n  convolution_param {\n    num_output: 112\n    kernel_size: 3\n    pad: 1\n    stride: 2\n    weight_filler {\n      type: \"xavier\"\n    }\n  }\n}\nlayer {\n  name: \"fire8/relu_squeeze3x3\"\n  type: \"ReLU\"\n  bottom: \"fire8/squeeze3x3\"\n  top: \"fire8/squeeze3x3\"\n}\nlayer {\n  name: \"fire8/expand1x1\"\n  type: \"Convolution\"\n  bottom: \"fire8/squeeze3x3\"\n  top: \"fire8/expand1x1\"\n  convolution_param {\n    num_output: 256\n    kernel_size: 1\n    weight_filler {\n      type: \"xavier\"\n    }\n  }\n}\nlayer {\n  name: \"fire8/relu_expand1x1\"\n  type: \"ReLU\"\n  bottom: \"fire8/expand1x1\"\n  top: \"fire8/expand1x1\"\n}\nlayer {\n  name: \"fire8/expand3x3\"\n  type: \"Convolution\"\n  bottom: \"fire8/squeeze3x3\"\n  top: \"fire8/expand3x3\"\n  convolution_param {\n    num_output: 256\n    kernel_size: 3\n    pad: 1\n    weight_filler {\n      type: \"xavier\"\n    }\n  }\n}\nlayer {\n  name: \"fire8/relu_expand3x3\"\n  type: \"ReLU\"\n  bottom: \"fire8/expand3x3\"\n  top: \"fire8/expand3x3\"\n}\nlayer {\n  name: \"fire8/concat\"\n  type: \"Concat\"\n  bottom: \"fire8/expand1x1\"\n  bottom: \"fire8/expand3x3\"\n  top: \"fire8/concat\"\n}\n\nlayer {\n  name: \"fire9/squeeze1x1\"\n  type: \"Convolution\"\n  bottom: \"fire8/concat\"\n  top: \"fire9/squeeze1x1\"\n  convolution_param {\n    num_output: 112\n    kernel_size: 1\n    weight_filler {\n      type: \"xavier\"\n    }\n  }\n}\nlayer {\n  name: \"fire9/relu_squeeze1x1\"\n  type: \"ReLU\"\n  bottom: \"fire9/squeeze1x1\"\n  top: \"fire9/squeeze1x1\"\n}\nlayer {\n  name: \"fire9/expand1x1\"\n  type: \"Convolution\"\n  bottom: \"fire9/squeeze1x1\"\n  top: \"fire9/expand1x1\"\n  convolution_param {\n    num_output: 368\n    kernel_size: 1\n    weight_filler {\n      type: \"xavier\"\n    }\n  }\n}\nlayer {\n  name: \"fire9/relu_expand1x1\"\n  type: \"ReLU\"\n  bottom: \"fire9/expand1x1\"\n  top: \"fire9/expand1x1\"\n}\nlayer {\n  name: \"fire9/expand3x3\"\n  type: \"Convolution\"\n  bottom: \"fire9/squeeze1x1\"\n  top: \"fire9/expand3x3\"\n  convolution_param {\n    num_output: 368\n    kernel_size: 3\n    pad: 1\n    weight_filler {\n      type: \"xavier\"\n    }\n  }\n}\nlayer {\n  name: \"fire9/relu_expand3x3\"\n  type: \"ReLU\"\n  bottom: \"fire9/expand3x3\"\n  top: \"fire9/expand3x3\"\n}\nlayer {\n  name: \"fire9/concat\"\n  type: \"Concat\"\n  bottom: \"fire9/expand1x1\"\n  bottom: \"fire9/expand3x3\"\n  top: \"fire9/concat\"\n}\nlayer {\n  name: \"drop9\"\n  type: \"Dropout\"\n  bottom: \"fire9/concat\"\n  top: \"fire9/concat\"\n  dropout_param {\n    dropout_ratio: 0.5\n  }\n}\n\n#========= RPN ============\n\nlayer {\n  name: \"rpn_conv/3x3/output\"\n  type: \"Convolution\"\n  bottom: \"fire9/concat\"\n  top: \"rpn_conv/3x3/output\"\n  convolution_param {\n    num_output: 256\n    kernel_size: 3 pad: 1 stride: 1\n    weight_filler { type: \"gaussian\" std: 0.01 }\n    bias_filler { type: \"constant\" value: 0 }\n  }\n}\nlayer {\n  name: \"rpn_relu/3x3\"\n  type: \"ReLU\"\n  bottom: \"rpn_conv/3x3/output\"\n  top: \"rpn_conv/3x3/output\"\n}\nlayer {\n  name: \"rpn_cls_score\"\n  type: \"Convolution\"\n  bottom: \"rpn_conv/3x3/output\"\n  top: \"rpn_cls_score\"\n  convolution_param {\n    num_output: 18   # 2(bg/fg) * 9(anchors)\n    kernel_size: 1 pad: 0 stride: 1\n    weight_filler { type: \"gaussian\" std: 0.01 }\n    bias_filler { type: \"constant\" value: 0 }\n  }\n}\nlayer {\n  name: \"rpn_bbox_pred\"\n  type: \"Convolution\"\n  bottom: \"rpn_conv/3x3/output\"\n  top: \"rpn_bbox_pred\"\n  convolution_param {\n    num_output: 36   # 4 * 9(anchors)\n    kernel_size: 1 pad: 0 stride: 1\n    weight_filler { type: \"gaussian\" std: 0.01 }\n    bias_filler { type: \"constant\" value: 0 }\n  }\n}\nlayer {\n   bottom: \"rpn_cls_score\"\n   top: \"rpn_cls_score_reshape\"\n   name: \"rpn_cls_score_reshape\"\n   type: \"Reshape\"\n   reshape_param { shape { dim: 0 dim: 2 dim: -1 dim: 0 } }\n}\n\n#========= RoI Proposal ============\n\nlayer {\n  name: \"rpn_cls_prob\"\n  type: \"Softmax\"\n  bottom: \"rpn_cls_score_reshape\"\n  top: \"rpn_cls_prob\"\n}\nlayer {\n  name: 'rpn_cls_prob_reshape'\n  type: 'Reshape'\n  bottom: 'rpn_cls_prob'\n  top: 'rpn_cls_prob_reshape'\n  reshape_param { shape { dim: 0 dim: 18 dim: -1 dim: 0 } }\n}\nlayer {\n  name: 'rpn_proposals'\n  type: 'Python'\n  bottom: 'rpn_cls_prob_reshape'\n  bottom: 'rpn_bbox_pred'\n  bottom: 'im_info'\n  top: 'rpn_proposals'\n  python_param {\n    module: 'rpn.proposal_layer'\n    layer: 'ProposalLayer'\n    param_str: \"'feat_stride': 16\"\n  }\n}\n\n#========= ROI POOLING ============\n\nlayer {\n  name: \"roi_pool\"\n  type: \"ROIPooling\"\n  bottom: \"fire9/concat\"\n  bottom: \"rpn_proposals\"\n  top: \"roi_pool\"\n  roi_pooling_param {\n    pooled_w: 6\n    pooled_h: 6\n    spatial_scale: 0.0625 # 1/16\n  }\n}\n\n# ====== BASE CNN, PART B =======\n\nlayer {\n  name: \"conv10\"\n  type: \"Convolution\"\n  bottom: \"roi_pool\"\n  top: \"conv10\"\n  convolution_param {\n    num_output: 1024\n    kernel_size: 1\n    weight_filler {\n      type: \"gaussian\"\n      mean: 0.0\n      std: 0.01\n    }\n  }\n}\n\n# ====== CLASSIFICATION =======\n\nlayer {\n  name: \"cls_score\"\n  type: \"InnerProduct\"\n  bottom: \"conv10\"\n  top: \"cls_score\"\n  inner_product_param {\n    num_output: 21\n  }\n}\nlayer {\n  name: \"bbox_pred\"\n  type: \"InnerProduct\"\n  bottom: \"conv10\"\n  top: \"bbox_pred\"\n  inner_product_param {\n    num_output: 84\n  }\n}\nlayer {\n  name: \"bbox_out\"\n  type: \"implicit\"\n  bottom: \"bbox_pred\"\n}\nlayer {\n  name: \"cls_prob\"\n  type: \"Softmax\"\n  bottom: \"cls_score\"\n  top: \"cls_prob\"\n  loss_param {\n    ignore_label: -1\n    normalize: true\n  }\n}\n"
  },
  {
    "path": "presets/fcn-16s.prototxt",
    "content": "name: 'FCN 16s'\n\nlayer {\n    type: 'data'\n    name: 'data'\n    top: 'data'\n    input_param {\n        shape {\n           dim: 1\n           dim: 3\n           dim: 500\n           dim: 500\n        }\n    }\nforce_backward: true\n}\n\nlayers { bottom: 'data' top: 'conv1_1' name: 'conv1_1' type: CONVOLUTION\n  blobs_lr: 1 blobs_lr: 2 weight_decay: 1 weight_decay: 0\n  convolution_param { engine: CAFFE num_output: 64 pad: 1 kernel_size: 3 } }\nlayers { bottom: 'conv1_1' top: 'conv1_1' name: 'relu1_1' type: RELU }\nlayers { bottom: 'conv1_1' top: 'conv1_2' name: 'conv1_2' type: CONVOLUTION\n  blobs_lr: 1 blobs_lr: 2 weight_decay: 1 weight_decay: 0\n  convolution_param { engine: CAFFE num_output: 64 pad: 1 kernel_size: 3 } }\nlayers { bottom: 'conv1_2' top: 'conv1_2' name: 'relu1_2' type: RELU }\nlayers { name: 'pool1' bottom: 'conv1_2' top: 'pool1' type: POOLING\n  pooling_param { pool: MAX kernel_size: 2 stride: 2 } }\nlayers { name: 'conv2_1' bottom: 'pool1' top: 'conv2_1' type: CONVOLUTION\n  blobs_lr: 1 blobs_lr: 2 weight_decay: 1 weight_decay: 0\n  convolution_param { engine: CAFFE num_output: 128 pad: 1 kernel_size: 3 } }\nlayers { bottom: 'conv2_1' top: 'conv2_1' name: 'relu2_1' type: RELU }\nlayers { bottom: 'conv2_1' top: 'conv2_2' name: 'conv2_2' type: CONVOLUTION\n  blobs_lr: 1 blobs_lr: 2 weight_decay: 1 weight_decay: 0\n  convolution_param { engine: CAFFE num_output: 128 pad: 1 kernel_size: 3 } }\nlayers { bottom: 'conv2_2' top: 'conv2_2' name: 'relu2_2' type: RELU }\nlayers { bottom: 'conv2_2' top: 'pool2' name: 'pool2' type: POOLING\n  pooling_param { pool: MAX kernel_size: 2 stride: 2 } }\nlayers { bottom: 'pool2' top: 'conv3_1' name: 'conv3_1' type: CONVOLUTION\n  blobs_lr: 1 blobs_lr: 2 weight_decay: 1 weight_decay: 0\n  convolution_param { engine: CAFFE num_output: 256 pad: 1 kernel_size: 3 } }\nlayers { bottom: 'conv3_1' top: 'conv3_1' name: 'relu3_1' type: RELU }\nlayers { bottom: 'conv3_1' top: 'conv3_2' name: 'conv3_2' type: CONVOLUTION\n  blobs_lr: 1 blobs_lr: 2 weight_decay: 1 weight_decay: 0\n  convolution_param { engine: CAFFE num_output: 256 pad: 1 kernel_size: 3 } }\nlayers { bottom: 'conv3_2' top: 'conv3_2' name: 'relu3_2' type: RELU }\nlayers { bottom: 'conv3_2' top: 'conv3_3' name: 'conv3_3' type: CONVOLUTION\n  blobs_lr: 1 blobs_lr: 2 weight_decay: 1 weight_decay: 0\n  convolution_param { engine: CAFFE num_output: 256 pad: 1 kernel_size: 3 } }\nlayers { bottom: 'conv3_3' top: 'conv3_3' name: 'relu3_3' type: RELU }\nlayers { bottom: 'conv3_3' top: 'pool3' name: 'pool3' type: POOLING\n  pooling_param { pool: MAX kernel_size: 2 stride: 2 } }\nlayers { bottom: 'pool3' top: 'conv4_1' name: 'conv4_1' type: CONVOLUTION\n  blobs_lr: 1 blobs_lr: 2 weight_decay: 1 weight_decay: 0\n  convolution_param { engine: CAFFE num_output: 512 pad: 1 kernel_size: 3 } }\nlayers { bottom: 'conv4_1' top: 'conv4_1' name: 'relu4_1' type: RELU }\nlayers { bottom: 'conv4_1' top: 'conv4_2' name: 'conv4_2' type: CONVOLUTION\n  blobs_lr: 1 blobs_lr: 2 weight_decay: 1 weight_decay: 0\n  convolution_param { engine: CAFFE num_output: 512 pad: 1 kernel_size: 3 } }\nlayers { bottom: 'conv4_2' top: 'conv4_2' name: 'relu4_2' type: RELU }\nlayers { bottom: 'conv4_2' top: 'conv4_3' name: 'conv4_3' type: CONVOLUTION\n  blobs_lr: 1 blobs_lr: 2 weight_decay: 1 weight_decay: 0\n  convolution_param { engine: CAFFE num_output: 512 pad: 1 kernel_size: 3 } }\nlayers { bottom: 'conv4_3' top: 'conv4_3' name: 'relu4_3' type: RELU }\nlayers { bottom: 'conv4_3' top: 'pool4' name: 'pool4' type: POOLING\n  pooling_param { pool: MAX kernel_size: 2 stride: 2 } }\nlayers { bottom: 'pool4' top: 'conv5_1' name: 'conv5_1' type: CONVOLUTION\n  blobs_lr: 1 blobs_lr: 2 weight_decay: 1 weight_decay: 0\n  convolution_param { engine: CAFFE num_output: 512 pad: 1 kernel_size: 3 } }\nlayers { bottom: 'conv5_1' top: 'conv5_1' name: 'relu5_1' type: RELU }\nlayers { bottom: 'conv5_1' top: 'conv5_2' name: 'conv5_2' type: CONVOLUTION\n  blobs_lr: 1 blobs_lr: 2 weight_decay: 1 weight_decay: 0\n  convolution_param { engine: CAFFE num_output: 512 pad: 1 kernel_size: 3 } }\nlayers { bottom: 'conv5_2' top: 'conv5_2' name: 'relu5_2' type: RELU }\nlayers { bottom: 'conv5_2' top: 'conv5_3' name: 'conv5_3' type: CONVOLUTION\n  blobs_lr: 1 blobs_lr: 2 weight_decay: 1 weight_decay: 0\n  convolution_param { engine: CAFFE num_output: 512 pad: 1 kernel_size: 3 } }\nlayers { bottom: 'conv5_3' top: 'conv5_3' name: 'relu5_3' type: RELU }\nlayers { bottom: 'conv5_3' top: 'pool5' name: 'pool5' type: POOLING\n  pooling_param { pool: MAX kernel_size: 2 stride: 2 } }\nlayers { bottom: 'pool5' top: 'fc6' name: 'fc6' type: CONVOLUTION\n  blobs_lr: 1 blobs_lr: 2 weight_decay: 1 weight_decay: 0\n  convolution_param { engine: CAFFE kernel_size: 7 num_output: 4096 } }\nlayers { bottom: 'fc6' top: 'fc6' name: 'relu6' type: RELU }\nlayers { bottom: 'fc6' top: 'fc6' name: 'drop6' type: DROPOUT\n  dropout_param { dropout_ratio: 0.5 } }\nlayers { bottom: 'fc6' top: 'fc7' name: 'fc7' type: CONVOLUTION\n  blobs_lr: 1 blobs_lr: 2 weight_decay: 1 weight_decay: 0\n  convolution_param { engine: CAFFE kernel_size: 1 num_output: 4096 } }\nlayers { bottom: 'fc7' top: 'fc7' name: 'relu7' type: RELU }\nlayers { bottom: 'fc7' top: 'fc7' name: 'drop7' type: DROPOUT\n  dropout_param { dropout_ratio: 0.5 } }\nlayers { name: 'score' type: CONVOLUTION bottom: 'fc7' top: 'score'\n  blobs_lr: 1 blobs_lr: 2 weight_decay: 1 weight_decay: 0\n  convolution_param { engine: CAFFE num_output: 21 kernel_size: 1 } }\nlayers { type: DECONVOLUTION name: 'score2' bottom: 'score' top: 'score2'\n  blobs_lr: 1 blobs_lr: 2 weight_decay: 1 weight_decay: 0\n  convolution_param { kernel_size: 4 stride: 2 num_output: 21 } }\n  \n\nlayers { name: 'score-pool4' type: CONVOLUTION bottom: 'pool4' top: 'score-pool4'\n  blobs_lr: 1 blobs_lr: 2 weight_decay: 1 weight_decay: 0\n  convolution_param { engine: CAFFE num_output: 21 kernel_size: 1 } }\n\nlayers { type: CROP name: 'score-pool4c' bottom: 'score-pool4' top: 'score-pool44c' bottom: 'score2' }\n  \nlayers { type: ELTWISE name: 'score-fuse' bottom: 'score2' bottom: 'score-pool4c' top: 'score-fuse'\neltwise_param { operation: SUM } }\n\nlayers { type: DECONVOLUTION name: 'bigscore'\n  bottom: 'score-fuse' top: 'bigscore'\n  blobs_lr: 0 blobs_lr: 0\n  convolution_param { num_output: 21 kernel_size: 32 stride: 16 } }\n\nlayers { type: CROP name: 'upscore' bottom: 'bigscore' bottom: 'data' top: 'upscore' }\n\nlayers { type: SOFTMAX name: 'output' bottom: 'upscore'}"
  },
  {
    "path": "presets/fcn-8s-pascal.prototxt",
    "content": "name: 'FCN'\n\ninput: 'data'\ninput_dim: 1\ninput_dim: 3\ninput_dim: 500\ninput_dim: 500\nforce_backward: true\n\nlayers { bottom: 'data' top: 'conv1_1' name: 'conv1_1' type: CONVOLUTION\n  blobs_lr: 1 blobs_lr: 2 weight_decay: 1 weight_decay: 0\n  convolution_param { engine: CAFFE num_output: 64 pad: 100 kernel_size: 3 } }\nlayers { bottom: 'conv1_1' top: 'conv1_1' name: 'relu1_1' type: RELU }\nlayers { bottom: 'conv1_1' top: 'conv1_2' name: 'conv1_2' type: CONVOLUTION\n  blobs_lr: 1 blobs_lr: 2 weight_decay: 1 weight_decay: 0\n  convolution_param { engine: CAFFE num_output: 64 pad: 1 kernel_size: 3 } }\nlayers { bottom: 'conv1_2' top: 'conv1_2' name: 'relu1_2' type: RELU }\nlayers { name: 'pool1' bottom: 'conv1_2' top: 'pool1' type: POOLING\n  pooling_param { pool: MAX kernel_size: 2 stride: 2 } }\nlayers { name: 'conv2_1' bottom: 'pool1' top: 'conv2_1' type: CONVOLUTION\n  blobs_lr: 1 blobs_lr: 2 weight_decay: 1 weight_decay: 0\n  convolution_param { engine: CAFFE num_output: 128 pad: 1 kernel_size: 3 } }\nlayers { bottom: 'conv2_1' top: 'conv2_1' name: 'relu2_1' type: RELU }\nlayers { bottom: 'conv2_1' top: 'conv2_2' name: 'conv2_2' type: CONVOLUTION\n  blobs_lr: 1 blobs_lr: 2 weight_decay: 1 weight_decay: 0\n  convolution_param { engine: CAFFE num_output: 128 pad: 1 kernel_size: 3 } }\nlayers { bottom: 'conv2_2' top: 'conv2_2' name: 'relu2_2' type: RELU }\nlayers { bottom: 'conv2_2' top: 'pool2' name: 'pool2' type: POOLING\n  pooling_param { pool: MAX kernel_size: 2 stride: 2 } }\nlayers { bottom: 'pool2' top: 'conv3_1' name: 'conv3_1' type: CONVOLUTION\n  blobs_lr: 1 blobs_lr: 2 weight_decay: 1 weight_decay: 0\n  convolution_param { engine: CAFFE num_output: 256 pad: 1 kernel_size: 3 } }\nlayers { bottom: 'conv3_1' top: 'conv3_1' name: 'relu3_1' type: RELU }\nlayers { bottom: 'conv3_1' top: 'conv3_2' name: 'conv3_2' type: CONVOLUTION\n  blobs_lr: 1 blobs_lr: 2 weight_decay: 1 weight_decay: 0\n  convolution_param { engine: CAFFE num_output: 256 pad: 1 kernel_size: 3 } }\nlayers { bottom: 'conv3_2' top: 'conv3_2' name: 'relu3_2' type: RELU }\nlayers { bottom: 'conv3_2' top: 'conv3_3' name: 'conv3_3' type: CONVOLUTION\n  blobs_lr: 1 blobs_lr: 2 weight_decay: 1 weight_decay: 0\n  convolution_param { engine: CAFFE num_output: 256 pad: 1 kernel_size: 3 } }\nlayers { bottom: 'conv3_3' top: 'conv3_3' name: 'relu3_3' type: RELU }\nlayers { bottom: 'conv3_3' top: 'pool3' name: 'pool3' type: POOLING\n  pooling_param { pool: MAX kernel_size: 2 stride: 2 } }\nlayers { bottom: 'pool3' top: 'conv4_1' name: 'conv4_1' type: CONVOLUTION\n  blobs_lr: 1 blobs_lr: 2 weight_decay: 1 weight_decay: 0\n  convolution_param { engine: CAFFE num_output: 512 pad: 1 kernel_size: 3 } }\nlayers { bottom: 'conv4_1' top: 'conv4_1' name: 'relu4_1' type: RELU }\nlayers { bottom: 'conv4_1' top: 'conv4_2' name: 'conv4_2' type: CONVOLUTION\n  blobs_lr: 1 blobs_lr: 2 weight_decay: 1 weight_decay: 0\n  convolution_param { engine: CAFFE num_output: 512 pad: 1 kernel_size: 3 } }\nlayers { bottom: 'conv4_2' top: 'conv4_2' name: 'relu4_2' type: RELU }\nlayers { bottom: 'conv4_2' top: 'conv4_3' name: 'conv4_3' type: CONVOLUTION\n  blobs_lr: 1 blobs_lr: 2 weight_decay: 1 weight_decay: 0\n  convolution_param { engine: CAFFE num_output: 512 pad: 1 kernel_size: 3 } }\nlayers { bottom: 'conv4_3' top: 'conv4_3' name: 'relu4_3' type: RELU }\nlayers { bottom: 'conv4_3' top: 'pool4' name: 'pool4' type: POOLING\n  pooling_param { pool: MAX kernel_size: 2 stride: 2 } }\nlayers { bottom: 'pool4' top: 'conv5_1' name: 'conv5_1' type: CONVOLUTION\n  blobs_lr: 1 blobs_lr: 2 weight_decay: 1 weight_decay: 0\n  convolution_param { engine: CAFFE num_output: 512 pad: 1 kernel_size: 3 } }\nlayers { bottom: 'conv5_1' top: 'conv5_1' name: 'relu5_1' type: RELU }\nlayers { bottom: 'conv5_1' top: 'conv5_2' name: 'conv5_2' type: CONVOLUTION\n  blobs_lr: 1 blobs_lr: 2 weight_decay: 1 weight_decay: 0\n  convolution_param { engine: CAFFE num_output: 512 pad: 1 kernel_size: 3 } }\nlayers { bottom: 'conv5_2' top: 'conv5_2' name: 'relu5_2' type: RELU }\nlayers { bottom: 'conv5_2' top: 'conv5_3' name: 'conv5_3' type: CONVOLUTION\n  blobs_lr: 1 blobs_lr: 2 weight_decay: 1 weight_decay: 0\n  convolution_param { engine: CAFFE num_output: 512 pad: 1 kernel_size: 3 } }\nlayers { bottom: 'conv5_3' top: 'conv5_3' name: 'relu5_3' type: RELU }\nlayers { bottom: 'conv5_3' top: 'pool5' name: 'pool5' type: POOLING\n  pooling_param { pool: MAX kernel_size: 2 stride: 2 } }\nlayers { bottom: 'pool5' top: 'fc6' name: 'fc6' type: CONVOLUTION\n  blobs_lr: 1 blobs_lr: 2 weight_decay: 1 weight_decay: 0\n  convolution_param { engine: CAFFE kernel_size: 7 num_output: 4096 } }\nlayers { bottom: 'fc6' top: 'fc6' name: 'relu6' type: RELU }\nlayers { bottom: 'fc6' top: 'fc6' name: 'drop6' type: DROPOUT\n  dropout_param { dropout_ratio: 0.5 } }\nlayers { bottom: 'fc6' top: 'fc7' name: 'fc7' type: CONVOLUTION\n  blobs_lr: 1 blobs_lr: 2 weight_decay: 1 weight_decay: 0\n  convolution_param { engine: CAFFE kernel_size: 1 num_output: 4096 } }\nlayers { bottom: 'fc7' top: 'fc7' name: 'relu7' type: RELU }\nlayers { bottom: 'fc7' top: 'fc7' name: 'drop7' type: DROPOUT\n  dropout_param { dropout_ratio: 0.5 } }\nlayers { name: 'score-fr' type: CONVOLUTION bottom: 'fc7' top: 'score'\n  blobs_lr: 1 blobs_lr: 2 weight_decay: 1 weight_decay: 0\n  convolution_param { engine: CAFFE num_output: 21 kernel_size: 1 } }\n\nlayers { type: DECONVOLUTION name: 'score2' bottom: 'score' top: 'score2'\n  blobs_lr: 1 blobs_lr: 2 weight_decay: 1 weight_decay: 0\n  convolution_param { kernel_size: 4 stride: 2 num_output: 21 } }\n\nlayers { name: 'score-pool4' type: CONVOLUTION bottom: 'pool4' top: 'score-pool4'\n  blobs_lr: 1 blobs_lr: 2 weight_decay: 1 weight_decay: 0\n  convolution_param { engine: CAFFE num_output: 21 kernel_size: 1 } }\n\nlayers { type: CROP name: 'crop' bottom: 'score-pool4' bottom: 'score2'\n  top: 'score-pool4c' }\n\nlayers { type: ELTWISE name: 'fuse' bottom: 'score2' bottom: 'score-pool4c'\n  top: 'score-fused'\n  eltwise_param { operation: SUM } }\n\nlayers { type: DECONVOLUTION name: 'score4' bottom: 'score-fused'\n  top: 'score4'\n  blobs_lr: 1 weight_decay: 1\n  convolution_param { bias_term: false kernel_size: 4 stride: 2 num_output: 21 } }\n\nlayers { name: 'score-pool3' type: CONVOLUTION bottom: 'pool3' top: 'score-pool3'\n  blobs_lr: 1 blobs_lr: 2 weight_decay: 1 weight_decay: 0\n  convolution_param { engine: CAFFE num_output: 21 kernel_size: 1 } }\n\nlayers { type: CROP name: 'crop' bottom: 'score-pool3' bottom: 'score4'\n  top: 'score-pool3c' }\n\nlayers { type: ELTWISE name: 'fuse' bottom: 'score4' bottom: 'score-pool3c'\n  top: 'score-final'\n  eltwise_param { operation: SUM } }\n\nlayers { type: DECONVOLUTION name: 'upsample'\n  bottom: 'score-final' top: 'bigscore'\n  blobs_lr: 0\n  convolution_param { bias_term: false num_output: 21 kernel_size: 16 stride: 8 } }\n\nlayers { type: CROP name: 'crop' bottom: 'bigscore' bottom: 'data' top: 'upscore' }\n"
  },
  {
    "path": "presets/googlenet.prototxt",
    "content": "name: \"GoogleNet\"\nlayer {\n  name: \"data\"\n  type: \"Data\"\n  top: \"data\"\n  input_param {\n      shape: {\n          dim: 10\n          dim: 3\n          dim: 227\n          dim: 227\n      }\n  }\n}\nlayer {\n  name: \"conv1/7x7_s2\"\n  type: \"Convolution\"\n  bottom: \"data\"\n  top: \"conv1/7x7_s2\"\n  param {\n    lr_mult: 1\n    decay_mult: 1\n  }\n  param {\n    lr_mult: 2\n    decay_mult: 0\n  }\n  convolution_param {\n    num_output: 64\n    pad: 3\n    kernel_size: 7\n    stride: 2\n    weight_filler {\n      type: \"xavier\"\n      std: 0.1\n    }\n    bias_filler {\n      type: \"constant\"\n      value: 0.2\n    }\n  }\n}\nlayer {\n  name: \"conv1/relu_7x7\"\n  type: \"ReLU\"\n  bottom: \"conv1/7x7_s2\"\n  top: \"conv1/7x7_s2\"\n}\nlayer {\n  name: \"pool1/3x3_s2\"\n  type: \"Pooling\"\n  bottom: \"conv1/7x7_s2\"\n  top: \"pool1/3x3_s2\"\n  pooling_param {\n    pool: MAX\n    kernel_size: 3\n    stride: 2\n  }\n}\nlayer {\n  name: \"pool1/norm1\"\n  type: \"LRN\"\n  bottom: \"pool1/3x3_s2\"\n  top: \"pool1/norm1\"\n  lrn_param {\n    local_size: 5\n    alpha: 0.0001\n    beta: 0.75\n  }\n}\nlayer {\n  name: \"conv2/3x3_reduce\"\n  type: \"Convolution\"\n  bottom: \"pool1/norm1\"\n  top: \"conv2/3x3_reduce\"\n  param {\n    lr_mult: 1\n    decay_mult: 1\n  }\n  param {\n    lr_mult: 2\n    decay_mult: 0\n  }\n  convolution_param {\n    num_output: 64\n    kernel_size: 1\n    weight_filler {\n      type: \"xavier\"\n      std: 0.1\n    }\n    bias_filler {\n      type: \"constant\"\n      value: 0.2\n    }\n  }\n}\nlayer {\n  name: \"conv2/relu_3x3_reduce\"\n  type: \"ReLU\"\n  bottom: \"conv2/3x3_reduce\"\n  top: \"conv2/3x3_reduce\"\n}\nlayer {\n  name: \"conv2/3x3\"\n  type: \"Convolution\"\n  bottom: \"conv2/3x3_reduce\"\n  top: \"conv2/3x3\"\n  param {\n    lr_mult: 1\n    decay_mult: 1\n  }\n  param {\n    lr_mult: 2\n    decay_mult: 0\n  }\n  convolution_param {\n    num_output: 192\n    pad: 1\n    kernel_size: 3\n    weight_filler {\n      type: \"xavier\"\n      std: 0.03\n    }\n    bias_filler {\n      type: \"constant\"\n      value: 0.2\n    }\n  }\n}\nlayer {\n  name: \"conv2/relu_3x3\"\n  type: \"ReLU\"\n  bottom: \"conv2/3x3\"\n  top: \"conv2/3x3\"\n}\nlayer {\n  name: \"conv2/norm2\"\n  type: \"LRN\"\n  bottom: \"conv2/3x3\"\n  top: \"conv2/norm2\"\n  lrn_param {\n    local_size: 5\n    alpha: 0.0001\n    beta: 0.75\n  }\n}\nlayer {\n  name: \"pool2/3x3_s2\"\n  type: \"Pooling\"\n  bottom: \"conv2/norm2\"\n  top: \"pool2/3x3_s2\"\n  pooling_param {\n    pool: MAX\n    kernel_size: 3\n    stride: 2\n  }\n}\nlayer {\n  name: \"inception_3a/1x1\"\n  type: \"Convolution\"\n  bottom: \"pool2/3x3_s2\"\n  top: \"inception_3a/1x1\"\n  param {\n    lr_mult: 1\n    decay_mult: 1\n  }\n  param {\n    lr_mult: 2\n    decay_mult: 0\n  }\n  convolution_param {\n    num_output: 64\n    kernel_size: 1\n    weight_filler {\n      type: \"xavier\"\n      std: 0.03\n    }\n    bias_filler {\n      type: \"constant\"\n      value: 0.2\n    }\n  }\n}\nlayer {\n  name: \"inception_3a/relu_1x1\"\n  type: \"ReLU\"\n  bottom: \"inception_3a/1x1\"\n  top: \"inception_3a/1x1\"\n}\nlayer {\n  name: \"inception_3a/3x3_reduce\"\n  type: \"Convolution\"\n  bottom: \"pool2/3x3_s2\"\n  top: \"inception_3a/3x3_reduce\"\n  param {\n    lr_mult: 1\n    decay_mult: 1\n  }\n  param {\n    lr_mult: 2\n    decay_mult: 0\n  }\n  convolution_param {\n    num_output: 96\n    kernel_size: 1\n    weight_filler {\n      type: \"xavier\"\n      std: 0.09\n    }\n    bias_filler {\n      type: \"constant\"\n      value: 0.2\n    }\n  }\n}\nlayer {\n  name: \"inception_3a/relu_3x3_reduce\"\n  type: \"ReLU\"\n  bottom: \"inception_3a/3x3_reduce\"\n  top: \"inception_3a/3x3_reduce\"\n}\nlayer {\n  name: \"inception_3a/3x3\"\n  type: \"Convolution\"\n  bottom: \"inception_3a/3x3_reduce\"\n  top: \"inception_3a/3x3\"\n  param {\n    lr_mult: 1\n    decay_mult: 1\n  }\n  param {\n    lr_mult: 2\n    decay_mult: 0\n  }\n  convolution_param {\n    num_output: 128\n    pad: 1\n    kernel_size: 3\n    weight_filler {\n      type: \"xavier\"\n      std: 0.03\n    }\n    bias_filler {\n      type: \"constant\"\n      value: 0.2\n    }\n  }\n}\nlayer {\n  name: \"inception_3a/relu_3x3\"\n  type: \"ReLU\"\n  bottom: \"inception_3a/3x3\"\n  top: \"inception_3a/3x3\"\n}\nlayer {\n  name: \"inception_3a/5x5_reduce\"\n  type: \"Convolution\"\n  bottom: \"pool2/3x3_s2\"\n  top: \"inception_3a/5x5_reduce\"\n  param {\n    lr_mult: 1\n    decay_mult: 1\n  }\n  param {\n    lr_mult: 2\n    decay_mult: 0\n  }\n  convolution_param {\n    num_output: 16\n    kernel_size: 1\n    weight_filler {\n      type: \"xavier\"\n      std: 0.2\n    }\n    bias_filler {\n      type: \"constant\"\n      value: 0.2\n    }\n  }\n}\nlayer {\n  name: \"inception_3a/relu_5x5_reduce\"\n  type: \"ReLU\"\n  bottom: \"inception_3a/5x5_reduce\"\n  top: \"inception_3a/5x5_reduce\"\n}\nlayer {\n  name: \"inception_3a/5x5\"\n  type: \"Convolution\"\n  bottom: \"inception_3a/5x5_reduce\"\n  top: \"inception_3a/5x5\"\n  param {\n    lr_mult: 1\n    decay_mult: 1\n  }\n  param {\n    lr_mult: 2\n    decay_mult: 0\n  }\n  convolution_param {\n    num_output: 32\n    pad: 2\n    kernel_size: 5\n    weight_filler {\n      type: \"xavier\"\n      std: 0.03\n    }\n    bias_filler {\n      type: \"constant\"\n      value: 0.2\n    }\n  }\n}\nlayer {\n  name: \"inception_3a/relu_5x5\"\n  type: \"ReLU\"\n  bottom: \"inception_3a/5x5\"\n  top: \"inception_3a/5x5\"\n}\nlayer {\n  name: \"inception_3a/pool\"\n  type: \"Pooling\"\n  bottom: \"pool2/3x3_s2\"\n  top: \"inception_3a/pool\"\n  pooling_param {\n    pool: MAX\n    kernel_size: 3\n    stride: 1\n    pad: 1\n  }\n}\nlayer {\n  name: \"inception_3a/pool_proj\"\n  type: \"Convolution\"\n  bottom: \"inception_3a/pool\"\n  top: \"inception_3a/pool_proj\"\n  param {\n    lr_mult: 1\n    decay_mult: 1\n  }\n  param {\n    lr_mult: 2\n    decay_mult: 0\n  }\n  convolution_param {\n    num_output: 32\n    kernel_size: 1\n    weight_filler {\n      type: \"xavier\"\n      std: 0.1\n    }\n    bias_filler {\n      type: \"constant\"\n      value: 0.2\n    }\n  }\n}\nlayer {\n  name: \"inception_3a/relu_pool_proj\"\n  type: \"ReLU\"\n  bottom: \"inception_3a/pool_proj\"\n  top: \"inception_3a/pool_proj\"\n}\nlayer {\n  name: \"inception_3a/output\"\n  type: \"Concat\"\n  bottom: \"inception_3a/1x1\"\n  bottom: \"inception_3a/3x3\"\n  bottom: \"inception_3a/5x5\"\n  bottom: \"inception_3a/pool_proj\"\n  top: \"inception_3a/output\"\n}\nlayer {\n  name: \"inception_3b/1x1\"\n  type: \"Convolution\"\n  bottom: \"inception_3a/output\"\n  top: \"inception_3b/1x1\"\n  param {\n    lr_mult: 1\n    decay_mult: 1\n  }\n  param {\n    lr_mult: 2\n    decay_mult: 0\n  }\n  convolution_param {\n    num_output: 128\n    kernel_size: 1\n    weight_filler {\n      type: \"xavier\"\n      std: 0.03\n    }\n    bias_filler {\n      type: \"constant\"\n      value: 0.2\n    }\n  }\n}\nlayer {\n  name: \"inception_3b/relu_1x1\"\n  type: \"ReLU\"\n  bottom: \"inception_3b/1x1\"\n  top: \"inception_3b/1x1\"\n}\nlayer {\n  name: \"inception_3b/3x3_reduce\"\n  type: \"Convolution\"\n  bottom: \"inception_3a/output\"\n  top: \"inception_3b/3x3_reduce\"\n  param {\n    lr_mult: 1\n    decay_mult: 1\n  }\n  param {\n    lr_mult: 2\n    decay_mult: 0\n  }\n  convolution_param {\n    num_output: 128\n    kernel_size: 1\n    weight_filler {\n      type: \"xavier\"\n      std: 0.09\n    }\n    bias_filler {\n      type: \"constant\"\n      value: 0.2\n    }\n  }\n}\nlayer {\n  name: \"inception_3b/relu_3x3_reduce\"\n  type: \"ReLU\"\n  bottom: \"inception_3b/3x3_reduce\"\n  top: \"inception_3b/3x3_reduce\"\n}\nlayer {\n  name: \"inception_3b/3x3\"\n  type: \"Convolution\"\n  bottom: \"inception_3b/3x3_reduce\"\n  top: \"inception_3b/3x3\"\n  param {\n    lr_mult: 1\n    decay_mult: 1\n  }\n  param {\n    lr_mult: 2\n    decay_mult: 0\n  }\n  convolution_param {\n    num_output: 192\n    pad: 1\n    kernel_size: 3\n    weight_filler {\n      type: \"xavier\"\n      std: 0.03\n    }\n    bias_filler {\n      type: \"constant\"\n      value: 0.2\n    }\n  }\n}\nlayer {\n  name: \"inception_3b/relu_3x3\"\n  type: \"ReLU\"\n  bottom: \"inception_3b/3x3\"\n  top: \"inception_3b/3x3\"\n}\nlayer {\n  name: \"inception_3b/5x5_reduce\"\n  type: \"Convolution\"\n  bottom: \"inception_3a/output\"\n  top: \"inception_3b/5x5_reduce\"\n  param {\n    lr_mult: 1\n    decay_mult: 1\n  }\n  param {\n    lr_mult: 2\n    decay_mult: 0\n  }\n  convolution_param {\n    num_output: 32\n    kernel_size: 1\n    weight_filler {\n      type: \"xavier\"\n      std: 0.2\n    }\n    bias_filler {\n      type: \"constant\"\n      value: 0.2\n    }\n  }\n}\nlayer {\n  name: \"inception_3b/relu_5x5_reduce\"\n  type: \"ReLU\"\n  bottom: \"inception_3b/5x5_reduce\"\n  top: \"inception_3b/5x5_reduce\"\n}\nlayer {\n  name: \"inception_3b/5x5\"\n  type: \"Convolution\"\n  bottom: \"inception_3b/5x5_reduce\"\n  top: \"inception_3b/5x5\"\n  param {\n    lr_mult: 1\n    decay_mult: 1\n  }\n  param {\n    lr_mult: 2\n    decay_mult: 0\n  }\n  convolution_param {\n    num_output: 96\n    pad: 2\n    kernel_size: 5\n    weight_filler {\n      type: \"xavier\"\n      std: 0.03\n    }\n    bias_filler {\n      type: \"constant\"\n      value: 0.2\n    }\n  }\n}\nlayer {\n  name: \"inception_3b/relu_5x5\"\n  type: \"ReLU\"\n  bottom: \"inception_3b/5x5\"\n  top: \"inception_3b/5x5\"\n}\nlayer {\n  name: \"inception_3b/pool\"\n  type: \"Pooling\"\n  bottom: \"inception_3a/output\"\n  top: \"inception_3b/pool\"\n  pooling_param {\n    pool: MAX\n    kernel_size: 3\n    stride: 1\n    pad: 1\n  }\n}\nlayer {\n  name: \"inception_3b/pool_proj\"\n  type: \"Convolution\"\n  bottom: \"inception_3b/pool\"\n  top: \"inception_3b/pool_proj\"\n  param {\n    lr_mult: 1\n    decay_mult: 1\n  }\n  param {\n    lr_mult: 2\n    decay_mult: 0\n  }\n  convolution_param {\n    num_output: 64\n    kernel_size: 1\n    weight_filler {\n      type: \"xavier\"\n      std: 0.1\n    }\n    bias_filler {\n      type: \"constant\"\n      value: 0.2\n    }\n  }\n}\nlayer {\n  name: \"inception_3b/relu_pool_proj\"\n  type: \"ReLU\"\n  bottom: \"inception_3b/pool_proj\"\n  top: \"inception_3b/pool_proj\"\n}\nlayer {\n  name: \"inception_3b/output\"\n  type: \"Concat\"\n  bottom: \"inception_3b/1x1\"\n  bottom: \"inception_3b/3x3\"\n  bottom: \"inception_3b/5x5\"\n  bottom: \"inception_3b/pool_proj\"\n  top: \"inception_3b/output\"\n}\nlayer {\n  name: \"pool3/3x3_s2\"\n  type: \"Pooling\"\n  bottom: \"inception_3b/output\"\n  top: \"pool3/3x3_s2\"\n  pooling_param {\n    pool: MAX\n    kernel_size: 3\n    stride: 2\n  }\n}\nlayer {\n  name: \"inception_4a/1x1\"\n  type: \"Convolution\"\n  bottom: \"pool3/3x3_s2\"\n  top: \"inception_4a/1x1\"\n  param {\n    lr_mult: 1\n    decay_mult: 1\n  }\n  param {\n    lr_mult: 2\n    decay_mult: 0\n  }\n  convolution_param {\n    num_output: 192\n    kernel_size: 1\n    weight_filler {\n      type: \"xavier\"\n      std: 0.03\n    }\n    bias_filler {\n      type: \"constant\"\n      value: 0.2\n    }\n  }\n}\nlayer {\n  name: \"inception_4a/relu_1x1\"\n  type: \"ReLU\"\n  bottom: \"inception_4a/1x1\"\n  top: \"inception_4a/1x1\"\n}\nlayer {\n  name: \"inception_4a/3x3_reduce\"\n  type: \"Convolution\"\n  bottom: \"pool3/3x3_s2\"\n  top: \"inception_4a/3x3_reduce\"\n  param {\n    lr_mult: 1\n    decay_mult: 1\n  }\n  param {\n    lr_mult: 2\n    decay_mult: 0\n  }\n  convolution_param {\n    num_output: 96\n    kernel_size: 1\n    weight_filler {\n      type: \"xavier\"\n      std: 0.09\n    }\n    bias_filler {\n      type: \"constant\"\n      value: 0.2\n    }\n  }\n}\nlayer {\n  name: \"inception_4a/relu_3x3_reduce\"\n  type: \"ReLU\"\n  bottom: \"inception_4a/3x3_reduce\"\n  top: \"inception_4a/3x3_reduce\"\n}\nlayer {\n  name: \"inception_4a/3x3\"\n  type: \"Convolution\"\n  bottom: \"inception_4a/3x3_reduce\"\n  top: \"inception_4a/3x3\"\n  param {\n    lr_mult: 1\n    decay_mult: 1\n  }\n  param {\n    lr_mult: 2\n    decay_mult: 0\n  }\n  convolution_param {\n    num_output: 208\n    pad: 1\n    kernel_size: 3\n    weight_filler {\n      type: \"xavier\"\n      std: 0.03\n    }\n    bias_filler {\n      type: \"constant\"\n      value: 0.2\n    }\n  }\n}\nlayer {\n  name: \"inception_4a/relu_3x3\"\n  type: \"ReLU\"\n  bottom: \"inception_4a/3x3\"\n  top: \"inception_4a/3x3\"\n}\nlayer {\n  name: \"inception_4a/5x5_reduce\"\n  type: \"Convolution\"\n  bottom: \"pool3/3x3_s2\"\n  top: \"inception_4a/5x5_reduce\"\n  param {\n    lr_mult: 1\n    decay_mult: 1\n  }\n  param {\n    lr_mult: 2\n    decay_mult: 0\n  }\n  convolution_param {\n    num_output: 16\n    kernel_size: 1\n    weight_filler {\n      type: \"xavier\"\n      std: 0.2\n    }\n    bias_filler {\n      type: \"constant\"\n      value: 0.2\n    }\n  }\n}\nlayer {\n  name: \"inception_4a/relu_5x5_reduce\"\n  type: \"ReLU\"\n  bottom: \"inception_4a/5x5_reduce\"\n  top: \"inception_4a/5x5_reduce\"\n}\nlayer {\n  name: \"inception_4a/5x5\"\n  type: \"Convolution\"\n  bottom: \"inception_4a/5x5_reduce\"\n  top: \"inception_4a/5x5\"\n  param {\n    lr_mult: 1\n    decay_mult: 1\n  }\n  param {\n    lr_mult: 2\n    decay_mult: 0\n  }\n  convolution_param {\n    num_output: 48\n    pad: 2\n    kernel_size: 5\n    weight_filler {\n      type: \"xavier\"\n      std: 0.03\n    }\n    bias_filler {\n      type: \"constant\"\n      value: 0.2\n    }\n  }\n}\nlayer {\n  name: \"inception_4a/relu_5x5\"\n  type: \"ReLU\"\n  bottom: \"inception_4a/5x5\"\n  top: \"inception_4a/5x5\"\n}\nlayer {\n  name: \"inception_4a/pool\"\n  type: \"Pooling\"\n  bottom: \"pool3/3x3_s2\"\n  top: \"inception_4a/pool\"\n  pooling_param {\n    pool: MAX\n    kernel_size: 3\n    stride: 1\n    pad: 1\n  }\n}\nlayer {\n  name: \"inception_4a/pool_proj\"\n  type: \"Convolution\"\n  bottom: \"inception_4a/pool\"\n  top: \"inception_4a/pool_proj\"\n  param {\n    lr_mult: 1\n    decay_mult: 1\n  }\n  param {\n    lr_mult: 2\n    decay_mult: 0\n  }\n  convolution_param {\n    num_output: 64\n    kernel_size: 1\n    weight_filler {\n      type: \"xavier\"\n      std: 0.1\n    }\n    bias_filler {\n      type: \"constant\"\n      value: 0.2\n    }\n  }\n}\nlayer {\n  name: \"inception_4a/relu_pool_proj\"\n  type: \"ReLU\"\n  bottom: \"inception_4a/pool_proj\"\n  top: \"inception_4a/pool_proj\"\n}\nlayer {\n  name: \"inception_4a/output\"\n  type: \"Concat\"\n  bottom: \"inception_4a/1x1\"\n  bottom: \"inception_4a/3x3\"\n  bottom: \"inception_4a/5x5\"\n  bottom: \"inception_4a/pool_proj\"\n  top: \"inception_4a/output\"\n}\nlayer {\n  name: \"inception_4b/1x1\"\n  type: \"Convolution\"\n  bottom: \"inception_4a/output\"\n  top: \"inception_4b/1x1\"\n  param {\n    lr_mult: 1\n    decay_mult: 1\n  }\n  param {\n    lr_mult: 2\n    decay_mult: 0\n  }\n  convolution_param {\n    num_output: 160\n    kernel_size: 1\n    weight_filler {\n      type: \"xavier\"\n      std: 0.03\n    }\n    bias_filler {\n      type: \"constant\"\n      value: 0.2\n    }\n  }\n}\nlayer {\n  name: \"inception_4b/relu_1x1\"\n  type: \"ReLU\"\n  bottom: \"inception_4b/1x1\"\n  top: \"inception_4b/1x1\"\n}\nlayer {\n  name: \"inception_4b/3x3_reduce\"\n  type: \"Convolution\"\n  bottom: \"inception_4a/output\"\n  top: \"inception_4b/3x3_reduce\"\n  param {\n    lr_mult: 1\n    decay_mult: 1\n  }\n  param {\n    lr_mult: 2\n    decay_mult: 0\n  }\n  convolution_param {\n    num_output: 112\n    kernel_size: 1\n    weight_filler {\n      type: \"xavier\"\n      std: 0.09\n    }\n    bias_filler {\n      type: \"constant\"\n      value: 0.2\n    }\n  }\n}\nlayer {\n  name: \"inception_4b/relu_3x3_reduce\"\n  type: \"ReLU\"\n  bottom: \"inception_4b/3x3_reduce\"\n  top: \"inception_4b/3x3_reduce\"\n}\nlayer {\n  name: \"inception_4b/3x3\"\n  type: \"Convolution\"\n  bottom: \"inception_4b/3x3_reduce\"\n  top: \"inception_4b/3x3\"\n  param {\n    lr_mult: 1\n    decay_mult: 1\n  }\n  param {\n    lr_mult: 2\n    decay_mult: 0\n  }\n  convolution_param {\n    num_output: 224\n    pad: 1\n    kernel_size: 3\n    weight_filler {\n      type: \"xavier\"\n      std: 0.03\n    }\n    bias_filler {\n      type: \"constant\"\n      value: 0.2\n    }\n  }\n}\nlayer {\n  name: \"inception_4b/relu_3x3\"\n  type: \"ReLU\"\n  bottom: \"inception_4b/3x3\"\n  top: \"inception_4b/3x3\"\n}\nlayer {\n  name: \"inception_4b/5x5_reduce\"\n  type: \"Convolution\"\n  bottom: \"inception_4a/output\"\n  top: \"inception_4b/5x5_reduce\"\n  param {\n    lr_mult: 1\n    decay_mult: 1\n  }\n  param {\n    lr_mult: 2\n    decay_mult: 0\n  }\n  convolution_param {\n    num_output: 24\n    kernel_size: 1\n    weight_filler {\n      type: \"xavier\"\n      std: 0.2\n    }\n    bias_filler {\n      type: \"constant\"\n      value: 0.2\n    }\n  }\n}\nlayer {\n  name: \"inception_4b/relu_5x5_reduce\"\n  type: \"ReLU\"\n  bottom: \"inception_4b/5x5_reduce\"\n  top: \"inception_4b/5x5_reduce\"\n}\nlayer {\n  name: \"inception_4b/5x5\"\n  type: \"Convolution\"\n  bottom: \"inception_4b/5x5_reduce\"\n  top: \"inception_4b/5x5\"\n  param {\n    lr_mult: 1\n    decay_mult: 1\n  }\n  param {\n    lr_mult: 2\n    decay_mult: 0\n  }\n  convolution_param {\n    num_output: 64\n    pad: 2\n    kernel_size: 5\n    weight_filler {\n      type: \"xavier\"\n      std: 0.03\n    }\n    bias_filler {\n      type: \"constant\"\n      value: 0.2\n    }\n  }\n}\nlayer {\n  name: \"inception_4b/relu_5x5\"\n  type: \"ReLU\"\n  bottom: \"inception_4b/5x5\"\n  top: \"inception_4b/5x5\"\n}\nlayer {\n  name: \"inception_4b/pool\"\n  type: \"Pooling\"\n  bottom: \"inception_4a/output\"\n  top: \"inception_4b/pool\"\n  pooling_param {\n    pool: MAX\n    kernel_size: 3\n    stride: 1\n    pad: 1\n  }\n}\nlayer {\n  name: \"inception_4b/pool_proj\"\n  type: \"Convolution\"\n  bottom: \"inception_4b/pool\"\n  top: \"inception_4b/pool_proj\"\n  param {\n    lr_mult: 1\n    decay_mult: 1\n  }\n  param {\n    lr_mult: 2\n    decay_mult: 0\n  }\n  convolution_param {\n    num_output: 64\n    kernel_size: 1\n    weight_filler {\n      type: \"xavier\"\n      std: 0.1\n    }\n    bias_filler {\n      type: \"constant\"\n      value: 0.2\n    }\n  }\n}\nlayer {\n  name: \"inception_4b/relu_pool_proj\"\n  type: \"ReLU\"\n  bottom: \"inception_4b/pool_proj\"\n  top: \"inception_4b/pool_proj\"\n}\nlayer {\n  name: \"inception_4b/output\"\n  type: \"Concat\"\n  bottom: \"inception_4b/1x1\"\n  bottom: \"inception_4b/3x3\"\n  bottom: \"inception_4b/5x5\"\n  bottom: \"inception_4b/pool_proj\"\n  top: \"inception_4b/output\"\n}\nlayer {\n  name: \"inception_4c/1x1\"\n  type: \"Convolution\"\n  bottom: \"inception_4b/output\"\n  top: \"inception_4c/1x1\"\n  param {\n    lr_mult: 1\n    decay_mult: 1\n  }\n  param {\n    lr_mult: 2\n    decay_mult: 0\n  }\n  convolution_param {\n    num_output: 128\n    kernel_size: 1\n    weight_filler {\n      type: \"xavier\"\n      std: 0.03\n    }\n    bias_filler {\n      type: \"constant\"\n      value: 0.2\n    }\n  }\n}\nlayer {\n  name: \"inception_4c/relu_1x1\"\n  type: \"ReLU\"\n  bottom: \"inception_4c/1x1\"\n  top: \"inception_4c/1x1\"\n}\nlayer {\n  name: \"inception_4c/3x3_reduce\"\n  type: \"Convolution\"\n  bottom: \"inception_4b/output\"\n  top: \"inception_4c/3x3_reduce\"\n  param {\n    lr_mult: 1\n    decay_mult: 1\n  }\n  param {\n    lr_mult: 2\n    decay_mult: 0\n  }\n  convolution_param {\n    num_output: 128\n    kernel_size: 1\n    weight_filler {\n      type: \"xavier\"\n      std: 0.09\n    }\n    bias_filler {\n      type: \"constant\"\n      value: 0.2\n    }\n  }\n}\nlayer {\n  name: \"inception_4c/relu_3x3_reduce\"\n  type: \"ReLU\"\n  bottom: \"inception_4c/3x3_reduce\"\n  top: \"inception_4c/3x3_reduce\"\n}\nlayer {\n  name: \"inception_4c/3x3\"\n  type: \"Convolution\"\n  bottom: \"inception_4c/3x3_reduce\"\n  top: \"inception_4c/3x3\"\n  param {\n    lr_mult: 1\n    decay_mult: 1\n  }\n  param {\n    lr_mult: 2\n    decay_mult: 0\n  }\n  convolution_param {\n    num_output: 256\n    pad: 1\n    kernel_size: 3\n    weight_filler {\n      type: \"xavier\"\n      std: 0.03\n    }\n    bias_filler {\n      type: \"constant\"\n      value: 0.2\n    }\n  }\n}\nlayer {\n  name: \"inception_4c/relu_3x3\"\n  type: \"ReLU\"\n  bottom: \"inception_4c/3x3\"\n  top: \"inception_4c/3x3\"\n}\nlayer {\n  name: \"inception_4c/5x5_reduce\"\n  type: \"Convolution\"\n  bottom: \"inception_4b/output\"\n  top: \"inception_4c/5x5_reduce\"\n  param {\n    lr_mult: 1\n    decay_mult: 1\n  }\n  param {\n    lr_mult: 2\n    decay_mult: 0\n  }\n  convolution_param {\n    num_output: 24\n    kernel_size: 1\n    weight_filler {\n      type: \"xavier\"\n      std: 0.2\n    }\n    bias_filler {\n      type: \"constant\"\n      value: 0.2\n    }\n  }\n}\nlayer {\n  name: \"inception_4c/relu_5x5_reduce\"\n  type: \"ReLU\"\n  bottom: \"inception_4c/5x5_reduce\"\n  top: \"inception_4c/5x5_reduce\"\n}\nlayer {\n  name: \"inception_4c/5x5\"\n  type: \"Convolution\"\n  bottom: \"inception_4c/5x5_reduce\"\n  top: \"inception_4c/5x5\"\n  param {\n    lr_mult: 1\n    decay_mult: 1\n  }\n  param {\n    lr_mult: 2\n    decay_mult: 0\n  }\n  convolution_param {\n    num_output: 64\n    pad: 2\n    kernel_size: 5\n    weight_filler {\n      type: \"xavier\"\n      std: 0.03\n    }\n    bias_filler {\n      type: \"constant\"\n      value: 0.2\n    }\n  }\n}\nlayer {\n  name: \"inception_4c/relu_5x5\"\n  type: \"ReLU\"\n  bottom: \"inception_4c/5x5\"\n  top: \"inception_4c/5x5\"\n}\nlayer {\n  name: \"inception_4c/pool\"\n  type: \"Pooling\"\n  bottom: \"inception_4b/output\"\n  top: \"inception_4c/pool\"\n  pooling_param {\n    pool: MAX\n    kernel_size: 3\n    stride: 1\n    pad: 1\n  }\n}\nlayer {\n  name: \"inception_4c/pool_proj\"\n  type: \"Convolution\"\n  bottom: \"inception_4c/pool\"\n  top: \"inception_4c/pool_proj\"\n  param {\n    lr_mult: 1\n    decay_mult: 1\n  }\n  param {\n    lr_mult: 2\n    decay_mult: 0\n  }\n  convolution_param {\n    num_output: 64\n    kernel_size: 1\n    weight_filler {\n      type: \"xavier\"\n      std: 0.1\n    }\n    bias_filler {\n      type: \"constant\"\n      value: 0.2\n    }\n  }\n}\nlayer {\n  name: \"inception_4c/relu_pool_proj\"\n  type: \"ReLU\"\n  bottom: \"inception_4c/pool_proj\"\n  top: \"inception_4c/pool_proj\"\n}\nlayer {\n  name: \"inception_4c/output\"\n  type: \"Concat\"\n  bottom: \"inception_4c/1x1\"\n  bottom: \"inception_4c/3x3\"\n  bottom: \"inception_4c/5x5\"\n  bottom: \"inception_4c/pool_proj\"\n  top: \"inception_4c/output\"\n}\nlayer {\n  name: \"inception_4d/1x1\"\n  type: \"Convolution\"\n  bottom: \"inception_4c/output\"\n  top: \"inception_4d/1x1\"\n  param {\n    lr_mult: 1\n    decay_mult: 1\n  }\n  param {\n    lr_mult: 2\n    decay_mult: 0\n  }\n  convolution_param {\n    num_output: 112\n    kernel_size: 1\n    weight_filler {\n      type: \"xavier\"\n      std: 0.03\n    }\n    bias_filler {\n      type: \"constant\"\n      value: 0.2\n    }\n  }\n}\nlayer {\n  name: \"inception_4d/relu_1x1\"\n  type: \"ReLU\"\n  bottom: \"inception_4d/1x1\"\n  top: \"inception_4d/1x1\"\n}\nlayer {\n  name: \"inception_4d/3x3_reduce\"\n  type: \"Convolution\"\n  bottom: \"inception_4c/output\"\n  top: \"inception_4d/3x3_reduce\"\n  param {\n    lr_mult: 1\n    decay_mult: 1\n  }\n  param {\n    lr_mult: 2\n    decay_mult: 0\n  }\n  convolution_param {\n    num_output: 144\n    kernel_size: 1\n    weight_filler {\n      type: \"xavier\"\n      std: 0.09\n    }\n    bias_filler {\n      type: \"constant\"\n      value: 0.2\n    }\n  }\n}\nlayer {\n  name: \"inception_4d/relu_3x3_reduce\"\n  type: \"ReLU\"\n  bottom: \"inception_4d/3x3_reduce\"\n  top: \"inception_4d/3x3_reduce\"\n}\nlayer {\n  name: \"inception_4d/3x3\"\n  type: \"Convolution\"\n  bottom: \"inception_4d/3x3_reduce\"\n  top: \"inception_4d/3x3\"\n  param {\n    lr_mult: 1\n    decay_mult: 1\n  }\n  param {\n    lr_mult: 2\n    decay_mult: 0\n  }\n  convolution_param {\n    num_output: 288\n    pad: 1\n    kernel_size: 3\n    weight_filler {\n      type: \"xavier\"\n      std: 0.03\n    }\n    bias_filler {\n      type: \"constant\"\n      value: 0.2\n    }\n  }\n}\nlayer {\n  name: \"inception_4d/relu_3x3\"\n  type: \"ReLU\"\n  bottom: \"inception_4d/3x3\"\n  top: \"inception_4d/3x3\"\n}\nlayer {\n  name: \"inception_4d/5x5_reduce\"\n  type: \"Convolution\"\n  bottom: \"inception_4c/output\"\n  top: \"inception_4d/5x5_reduce\"\n  param {\n    lr_mult: 1\n    decay_mult: 1\n  }\n  param {\n    lr_mult: 2\n    decay_mult: 0\n  }\n  convolution_param {\n    num_output: 32\n    kernel_size: 1\n    weight_filler {\n      type: \"xavier\"\n      std: 0.2\n    }\n    bias_filler {\n      type: \"constant\"\n      value: 0.2\n    }\n  }\n}\nlayer {\n  name: \"inception_4d/relu_5x5_reduce\"\n  type: \"ReLU\"\n  bottom: \"inception_4d/5x5_reduce\"\n  top: \"inception_4d/5x5_reduce\"\n}\nlayer {\n  name: \"inception_4d/5x5\"\n  type: \"Convolution\"\n  bottom: \"inception_4d/5x5_reduce\"\n  top: \"inception_4d/5x5\"\n  param {\n    lr_mult: 1\n    decay_mult: 1\n  }\n  param {\n    lr_mult: 2\n    decay_mult: 0\n  }\n  convolution_param {\n    num_output: 64\n    pad: 2\n    kernel_size: 5\n    weight_filler {\n      type: \"xavier\"\n      std: 0.03\n    }\n    bias_filler {\n      type: \"constant\"\n      value: 0.2\n    }\n  }\n}\nlayer {\n  name: \"inception_4d/relu_5x5\"\n  type: \"ReLU\"\n  bottom: \"inception_4d/5x5\"\n  top: \"inception_4d/5x5\"\n}\nlayer {\n  name: \"inception_4d/pool\"\n  type: \"Pooling\"\n  bottom: \"inception_4c/output\"\n  top: \"inception_4d/pool\"\n  pooling_param {\n    pool: MAX\n    kernel_size: 3\n    stride: 1\n    pad: 1\n  }\n}\nlayer {\n  name: \"inception_4d/pool_proj\"\n  type: \"Convolution\"\n  bottom: \"inception_4d/pool\"\n  top: \"inception_4d/pool_proj\"\n  param {\n    lr_mult: 1\n    decay_mult: 1\n  }\n  param {\n    lr_mult: 2\n    decay_mult: 0\n  }\n  convolution_param {\n    num_output: 64\n    kernel_size: 1\n    weight_filler {\n      type: \"xavier\"\n      std: 0.1\n    }\n    bias_filler {\n      type: \"constant\"\n      value: 0.2\n    }\n  }\n}\nlayer {\n  name: \"inception_4d/relu_pool_proj\"\n  type: \"ReLU\"\n  bottom: \"inception_4d/pool_proj\"\n  top: \"inception_4d/pool_proj\"\n}\nlayer {\n  name: \"inception_4d/output\"\n  type: \"Concat\"\n  bottom: \"inception_4d/1x1\"\n  bottom: \"inception_4d/3x3\"\n  bottom: \"inception_4d/5x5\"\n  bottom: \"inception_4d/pool_proj\"\n  top: \"inception_4d/output\"\n}\nlayer {\n  name: \"inception_4e/1x1\"\n  type: \"Convolution\"\n  bottom: \"inception_4d/output\"\n  top: \"inception_4e/1x1\"\n  param {\n    lr_mult: 1\n    decay_mult: 1\n  }\n  param {\n    lr_mult: 2\n    decay_mult: 0\n  }\n  convolution_param {\n    num_output: 256\n    kernel_size: 1\n    weight_filler {\n      type: \"xavier\"\n      std: 0.03\n    }\n    bias_filler {\n      type: \"constant\"\n      value: 0.2\n    }\n  }\n}\nlayer {\n  name: \"inception_4e/relu_1x1\"\n  type: \"ReLU\"\n  bottom: \"inception_4e/1x1\"\n  top: \"inception_4e/1x1\"\n}\nlayer {\n  name: \"inception_4e/3x3_reduce\"\n  type: \"Convolution\"\n  bottom: \"inception_4d/output\"\n  top: \"inception_4e/3x3_reduce\"\n  param {\n    lr_mult: 1\n    decay_mult: 1\n  }\n  param {\n    lr_mult: 2\n    decay_mult: 0\n  }\n  convolution_param {\n    num_output: 160\n    kernel_size: 1\n    weight_filler {\n      type: \"xavier\"\n      std: 0.09\n    }\n    bias_filler {\n      type: \"constant\"\n      value: 0.2\n    }\n  }\n}\nlayer {\n  name: \"inception_4e/relu_3x3_reduce\"\n  type: \"ReLU\"\n  bottom: \"inception_4e/3x3_reduce\"\n  top: \"inception_4e/3x3_reduce\"\n}\nlayer {\n  name: \"inception_4e/3x3\"\n  type: \"Convolution\"\n  bottom: \"inception_4e/3x3_reduce\"\n  top: \"inception_4e/3x3\"\n  param {\n    lr_mult: 1\n    decay_mult: 1\n  }\n  param {\n    lr_mult: 2\n    decay_mult: 0\n  }\n  convolution_param {\n    num_output: 320\n    pad: 1\n    kernel_size: 3\n    weight_filler {\n      type: \"xavier\"\n      std: 0.03\n    }\n    bias_filler {\n      type: \"constant\"\n      value: 0.2\n    }\n  }\n}\nlayer {\n  name: \"inception_4e/relu_3x3\"\n  type: \"ReLU\"\n  bottom: \"inception_4e/3x3\"\n  top: \"inception_4e/3x3\"\n}\nlayer {\n  name: \"inception_4e/5x5_reduce\"\n  type: \"Convolution\"\n  bottom: \"inception_4d/output\"\n  top: \"inception_4e/5x5_reduce\"\n  param {\n    lr_mult: 1\n    decay_mult: 1\n  }\n  param {\n    lr_mult: 2\n    decay_mult: 0\n  }\n  convolution_param {\n    num_output: 32\n    kernel_size: 1\n    weight_filler {\n      type: \"xavier\"\n      std: 0.2\n    }\n    bias_filler {\n      type: \"constant\"\n      value: 0.2\n    }\n  }\n}\nlayer {\n  name: \"inception_4e/relu_5x5_reduce\"\n  type: \"ReLU\"\n  bottom: \"inception_4e/5x5_reduce\"\n  top: \"inception_4e/5x5_reduce\"\n}\nlayer {\n  name: \"inception_4e/5x5\"\n  type: \"Convolution\"\n  bottom: \"inception_4e/5x5_reduce\"\n  top: \"inception_4e/5x5\"\n  param {\n    lr_mult: 1\n    decay_mult: 1\n  }\n  param {\n    lr_mult: 2\n    decay_mult: 0\n  }\n  convolution_param {\n    num_output: 128\n    pad: 2\n    kernel_size: 5\n    weight_filler {\n      type: \"xavier\"\n      std: 0.03\n    }\n    bias_filler {\n      type: \"constant\"\n      value: 0.2\n    }\n  }\n}\nlayer {\n  name: \"inception_4e/relu_5x5\"\n  type: \"ReLU\"\n  bottom: \"inception_4e/5x5\"\n  top: \"inception_4e/5x5\"\n}\nlayer {\n  name: \"inception_4e/pool\"\n  type: \"Pooling\"\n  bottom: \"inception_4d/output\"\n  top: \"inception_4e/pool\"\n  pooling_param {\n    pool: MAX\n    kernel_size: 3\n    stride: 1\n    pad: 1\n  }\n}\nlayer {\n  name: \"inception_4e/pool_proj\"\n  type: \"Convolution\"\n  bottom: \"inception_4e/pool\"\n  top: \"inception_4e/pool_proj\"\n  param {\n    lr_mult: 1\n    decay_mult: 1\n  }\n  param {\n    lr_mult: 2\n    decay_mult: 0\n  }\n  convolution_param {\n    num_output: 128\n    kernel_size: 1\n    weight_filler {\n      type: \"xavier\"\n      std: 0.1\n    }\n    bias_filler {\n      type: \"constant\"\n      value: 0.2\n    }\n  }\n}\nlayer {\n  name: \"inception_4e/relu_pool_proj\"\n  type: \"ReLU\"\n  bottom: \"inception_4e/pool_proj\"\n  top: \"inception_4e/pool_proj\"\n}\nlayer {\n  name: \"inception_4e/output\"\n  type: \"Concat\"\n  bottom: \"inception_4e/1x1\"\n  bottom: \"inception_4e/3x3\"\n  bottom: \"inception_4e/5x5\"\n  bottom: \"inception_4e/pool_proj\"\n  top: \"inception_4e/output\"\n}\nlayer {\n  name: \"pool4/3x3_s2\"\n  type: \"Pooling\"\n  bottom: \"inception_4e/output\"\n  top: \"pool4/3x3_s2\"\n  pooling_param {\n    pool: MAX\n    kernel_size: 3\n    stride: 2\n  }\n}\nlayer {\n  name: \"inception_5a/1x1\"\n  type: \"Convolution\"\n  bottom: \"pool4/3x3_s2\"\n  top: \"inception_5a/1x1\"\n  param {\n    lr_mult: 1\n    decay_mult: 1\n  }\n  param {\n    lr_mult: 2\n    decay_mult: 0\n  }\n  convolution_param {\n    num_output: 256\n    kernel_size: 1\n    weight_filler {\n      type: \"xavier\"\n      std: 0.03\n    }\n    bias_filler {\n      type: \"constant\"\n      value: 0.2\n    }\n  }\n}\nlayer {\n  name: \"inception_5a/relu_1x1\"\n  type: \"ReLU\"\n  bottom: \"inception_5a/1x1\"\n  top: \"inception_5a/1x1\"\n}\nlayer {\n  name: \"inception_5a/3x3_reduce\"\n  type: \"Convolution\"\n  bottom: \"pool4/3x3_s2\"\n  top: \"inception_5a/3x3_reduce\"\n  param {\n    lr_mult: 1\n    decay_mult: 1\n  }\n  param {\n    lr_mult: 2\n    decay_mult: 0\n  }\n  convolution_param {\n    num_output: 160\n    kernel_size: 1\n    weight_filler {\n      type: \"xavier\"\n      std: 0.09\n    }\n    bias_filler {\n      type: \"constant\"\n      value: 0.2\n    }\n  }\n}\nlayer {\n  name: \"inception_5a/relu_3x3_reduce\"\n  type: \"ReLU\"\n  bottom: \"inception_5a/3x3_reduce\"\n  top: \"inception_5a/3x3_reduce\"\n}\nlayer {\n  name: \"inception_5a/3x3\"\n  type: \"Convolution\"\n  bottom: \"inception_5a/3x3_reduce\"\n  top: \"inception_5a/3x3\"\n  param {\n    lr_mult: 1\n    decay_mult: 1\n  }\n  param {\n    lr_mult: 2\n    decay_mult: 0\n  }\n  convolution_param {\n    num_output: 320\n    pad: 1\n    kernel_size: 3\n    weight_filler {\n      type: \"xavier\"\n      std: 0.03\n    }\n    bias_filler {\n      type: \"constant\"\n      value: 0.2\n    }\n  }\n}\nlayer {\n  name: \"inception_5a/relu_3x3\"\n  type: \"ReLU\"\n  bottom: \"inception_5a/3x3\"\n  top: \"inception_5a/3x3\"\n}\nlayer {\n  name: \"inception_5a/5x5_reduce\"\n  type: \"Convolution\"\n  bottom: \"pool4/3x3_s2\"\n  top: \"inception_5a/5x5_reduce\"\n  param {\n    lr_mult: 1\n    decay_mult: 1\n  }\n  param {\n    lr_mult: 2\n    decay_mult: 0\n  }\n  convolution_param {\n    num_output: 32\n    kernel_size: 1\n    weight_filler {\n      type: \"xavier\"\n      std: 0.2\n    }\n    bias_filler {\n      type: \"constant\"\n      value: 0.2\n    }\n  }\n}\nlayer {\n  name: \"inception_5a/relu_5x5_reduce\"\n  type: \"ReLU\"\n  bottom: \"inception_5a/5x5_reduce\"\n  top: \"inception_5a/5x5_reduce\"\n}\nlayer {\n  name: \"inception_5a/5x5\"\n  type: \"Convolution\"\n  bottom: \"inception_5a/5x5_reduce\"\n  top: \"inception_5a/5x5\"\n  param {\n    lr_mult: 1\n    decay_mult: 1\n  }\n  param {\n    lr_mult: 2\n    decay_mult: 0\n  }\n  convolution_param {\n    num_output: 128\n    pad: 2\n    kernel_size: 5\n    weight_filler {\n      type: \"xavier\"\n      std: 0.03\n    }\n    bias_filler {\n      type: \"constant\"\n      value: 0.2\n    }\n  }\n}\nlayer {\n  name: \"inception_5a/relu_5x5\"\n  type: \"ReLU\"\n  bottom: \"inception_5a/5x5\"\n  top: \"inception_5a/5x5\"\n}\nlayer {\n  name: \"inception_5a/pool\"\n  type: \"Pooling\"\n  bottom: \"pool4/3x3_s2\"\n  top: \"inception_5a/pool\"\n  pooling_param {\n    pool: MAX\n    kernel_size: 3\n    stride: 1\n    pad: 1\n  }\n}\nlayer {\n  name: \"inception_5a/pool_proj\"\n  type: \"Convolution\"\n  bottom: \"inception_5a/pool\"\n  top: \"inception_5a/pool_proj\"\n  param {\n    lr_mult: 1\n    decay_mult: 1\n  }\n  param {\n    lr_mult: 2\n    decay_mult: 0\n  }\n  convolution_param {\n    num_output: 128\n    kernel_size: 1\n    weight_filler {\n      type: \"xavier\"\n      std: 0.1\n    }\n    bias_filler {\n      type: \"constant\"\n      value: 0.2\n    }\n  }\n}\nlayer {\n  name: \"inception_5a/relu_pool_proj\"\n  type: \"ReLU\"\n  bottom: \"inception_5a/pool_proj\"\n  top: \"inception_5a/pool_proj\"\n}\nlayer {\n  name: \"inception_5a/output\"\n  type: \"Concat\"\n  bottom: \"inception_5a/1x1\"\n  bottom: \"inception_5a/3x3\"\n  bottom: \"inception_5a/5x5\"\n  bottom: \"inception_5a/pool_proj\"\n  top: \"inception_5a/output\"\n}\nlayer {\n  name: \"inception_5b/1x1\"\n  type: \"Convolution\"\n  bottom: \"inception_5a/output\"\n  top: \"inception_5b/1x1\"\n  param {\n    lr_mult: 1\n    decay_mult: 1\n  }\n  param {\n    lr_mult: 2\n    decay_mult: 0\n  }\n  convolution_param {\n    num_output: 384\n    kernel_size: 1\n    weight_filler {\n      type: \"xavier\"\n      std: 0.03\n    }\n    bias_filler {\n      type: \"constant\"\n      value: 0.2\n    }\n  }\n}\nlayer {\n  name: \"inception_5b/relu_1x1\"\n  type: \"ReLU\"\n  bottom: \"inception_5b/1x1\"\n  top: \"inception_5b/1x1\"\n}\nlayer {\n  name: \"inception_5b/3x3_reduce\"\n  type: \"Convolution\"\n  bottom: \"inception_5a/output\"\n  top: \"inception_5b/3x3_reduce\"\n  param {\n    lr_mult: 1\n    decay_mult: 1\n  }\n  param {\n    lr_mult: 2\n    decay_mult: 0\n  }\n  convolution_param {\n    num_output: 192\n    kernel_size: 1\n    weight_filler {\n      type: \"xavier\"\n      std: 0.09\n    }\n    bias_filler {\n      type: \"constant\"\n      value: 0.2\n    }\n  }\n}\nlayer {\n  name: \"inception_5b/relu_3x3_reduce\"\n  type: \"ReLU\"\n  bottom: \"inception_5b/3x3_reduce\"\n  top: \"inception_5b/3x3_reduce\"\n}\nlayer {\n  name: \"inception_5b/3x3\"\n  type: \"Convolution\"\n  bottom: \"inception_5b/3x3_reduce\"\n  top: \"inception_5b/3x3\"\n  param {\n    lr_mult: 1\n    decay_mult: 1\n  }\n  param {\n    lr_mult: 2\n    decay_mult: 0\n  }\n  convolution_param {\n    num_output: 384\n    pad: 1\n    kernel_size: 3\n    weight_filler {\n      type: \"xavier\"\n      std: 0.03\n    }\n    bias_filler {\n      type: \"constant\"\n      value: 0.2\n    }\n  }\n}\nlayer {\n  name: \"inception_5b/relu_3x3\"\n  type: \"ReLU\"\n  bottom: \"inception_5b/3x3\"\n  top: \"inception_5b/3x3\"\n}\nlayer {\n  name: \"inception_5b/5x5_reduce\"\n  type: \"Convolution\"\n  bottom: \"inception_5a/output\"\n  top: \"inception_5b/5x5_reduce\"\n  param {\n    lr_mult: 1\n    decay_mult: 1\n  }\n  param {\n    lr_mult: 2\n    decay_mult: 0\n  }\n  convolution_param {\n    num_output: 48\n    kernel_size: 1\n    weight_filler {\n      type: \"xavier\"\n      std: 0.2\n    }\n    bias_filler {\n      type: \"constant\"\n      value: 0.2\n    }\n  }\n}\nlayer {\n  name: \"inception_5b/relu_5x5_reduce\"\n  type: \"ReLU\"\n  bottom: \"inception_5b/5x5_reduce\"\n  top: \"inception_5b/5x5_reduce\"\n}\nlayer {\n  name: \"inception_5b/5x5\"\n  type: \"Convolution\"\n  bottom: \"inception_5b/5x5_reduce\"\n  top: \"inception_5b/5x5\"\n  param {\n    lr_mult: 1\n    decay_mult: 1\n  }\n  param {\n    lr_mult: 2\n    decay_mult: 0\n  }\n  convolution_param {\n    num_output: 128\n    pad: 2\n    kernel_size: 5\n    weight_filler {\n      type: \"xavier\"\n      std: 0.03\n    }\n    bias_filler {\n      type: \"constant\"\n      value: 0.2\n    }\n  }\n}\nlayer {\n  name: \"inception_5b/relu_5x5\"\n  type: \"ReLU\"\n  bottom: \"inception_5b/5x5\"\n  top: \"inception_5b/5x5\"\n}\nlayer {\n  name: \"inception_5b/pool\"\n  type: \"Pooling\"\n  bottom: \"inception_5a/output\"\n  top: \"inception_5b/pool\"\n  pooling_param {\n    pool: MAX\n    kernel_size: 3\n    stride: 1\n    pad: 1\n  }\n}\nlayer {\n  name: \"inception_5b/pool_proj\"\n  type: \"Convolution\"\n  bottom: \"inception_5b/pool\"\n  top: \"inception_5b/pool_proj\"\n  param {\n    lr_mult: 1\n    decay_mult: 1\n  }\n  param {\n    lr_mult: 2\n    decay_mult: 0\n  }\n  convolution_param {\n    num_output: 128\n    kernel_size: 1\n    weight_filler {\n      type: \"xavier\"\n      std: 0.1\n    }\n    bias_filler {\n      type: \"constant\"\n      value: 0.2\n    }\n  }\n}\nlayer {\n  name: \"inception_5b/relu_pool_proj\"\n  type: \"ReLU\"\n  bottom: \"inception_5b/pool_proj\"\n  top: \"inception_5b/pool_proj\"\n}\nlayer {\n  name: \"inception_5b/output\"\n  type: \"Concat\"\n  bottom: \"inception_5b/1x1\"\n  bottom: \"inception_5b/3x3\"\n  bottom: \"inception_5b/5x5\"\n  bottom: \"inception_5b/pool_proj\"\n  top: \"inception_5b/output\"\n}\nlayer {\n  name: \"pool5/7x7_s1\"\n  type: \"Pooling\"\n  bottom: \"inception_5b/output\"\n  top: \"pool5/7x7_s1\"\n  pooling_param {\n    pool: AVE\n    kernel_size: 7\n    stride: 1\n  }\n}\nlayer {\n  name: \"pool5/drop_7x7_s1\"\n  type: \"Dropout\"\n  bottom: \"pool5/7x7_s1\"\n  top: \"pool5/7x7_s1\"\n  dropout_param {\n    dropout_ratio: 0.4\n  }\n}\nlayer {\n  name: \"loss3/classifier\"\n  type: \"InnerProduct\"\n  bottom: \"pool5/7x7_s1\"\n  top: \"loss3/classifier\"\n  param {\n    lr_mult: 1\n    decay_mult: 1\n  }\n  param {\n    lr_mult: 2\n    decay_mult: 0\n  }\n  inner_product_param {\n    num_output: 1000\n    weight_filler {\n      type: \"xavier\"\n    }\n    bias_filler {\n      type: \"constant\"\n      value: 0\n    }\n  }\n}\nlayer {\n  name: \"prob\"\n  type: \"Softmax\"\n  bottom: \"loss3/classifier\"\n  top: \"prob\"\n}\n"
  },
  {
    "path": "presets/inceptionv3.prototxt",
    "content": "name: \"Inception_v3\"\nlayer {\n  name: \"data\"\n  type: \"Data\"\n  top: \"data\"\n  include {\n    phase: TRAIN\n  }\n  transform_param {\n    mirror: true\n    crop_size: 299\n    mean_value: 104\n    mean_value: 117\n    mean_value: 123\n  }\n  data_param {\n    source: \"/mnt/disk/ILSVRC2012/300px_ilsvrc12_train_lmdb\"\n    batch_size: 20\n    backend: LMDB\n  }\n}\nlayer {\n  name: \"conv_conv2d\"\n  type: \"Convolution\"\n  bottom: \"data\"\n  top: \"conv_conv2d\"\n  convolution_param {\n    bias_term: false\n    num_output: 32\n    pad: 0\n    kernel_size: 3\n    stride: 2\n    weight_filler {\n        type: \"xavier\"\n    }\n  }\n\n}\nlayer {\n  name: \"conv_conv2d_bn\"\n  type: \"BatchNorm\"\n  bottom: \"conv_conv2d\"\n  top: \"conv_conv2d_bn\"\n  batch_norm_param {\n    use_global_stats: false\n    eps: 0.001\n  }\n  param {\n    lr_mult: 0\n  }\n  param {\n    lr_mult: 0\n  }\n  param {\n    lr_mult: 0\n  }\n}\nlayer {\n  name: \"conv_conv2d_relu\"\n  type: \"ReLU\"\n  bottom: \"conv_conv2d_bn\"\n  top: \"conv_conv2d_bn\"\n}\nlayer {\n  name: \"conv_1_1/conv2d\"\n  type: \"Convolution\"\n  bottom: \"conv_conv2d_bn\"\n  top: \"conv_1_1/conv2d\"\n  convolution_param {\n    bias_term: false\n    num_output: 32\n    pad: 0\n    kernel_size: 3\n    stride: 1\n    weight_filler {\n        type: \"xavier\"\n    }\n  }\n\n}\nlayer {\n  name: \"conv_1_1/conv2d_bn\"\n  type: \"BatchNorm\"\n  bottom: \"conv_1_1/conv2d\"\n  top: \"conv_1_1/conv2d_bn\"\n  batch_norm_param {\n    use_global_stats: false\n    eps: 0.001\n  }\n  param {\n    lr_mult: 0\n  }\n  param {\n    lr_mult: 0\n  }\n  param {\n    lr_mult: 0\n  }\n}\nlayer {\n  name: \"conv_1_1/conv2d_relu\"\n  type: \"ReLU\"\n  bottom: \"conv_1_1/conv2d_bn\"\n  top: \"conv_1_1/conv2d_bn\"\n}\nlayer {\n  name: \"conv_2_2/conv2d\"\n  type: \"Convolution\"\n  bottom: \"conv_1_1/conv2d_bn\"\n  top: \"conv_2_2/conv2d\"\n  convolution_param {\n    bias_term: false\n    num_output: 64\n    pad: 1\n    kernel_size: 3\n    stride: 1\n    weight_filler {\n        type: \"xavier\"\n    }\n  }\n\n}\nlayer {\n  name: \"conv_2_2/conv2d_bn\"\n  type: \"BatchNorm\"\n  bottom: \"conv_2_2/conv2d\"\n  top: \"conv_2_2/conv2d_bn\"\n  batch_norm_param {\n    use_global_stats: false\n    eps: 0.001\n  }\n  param {\n    lr_mult: 0\n  }\n  param {\n    lr_mult: 0\n  }\n  param {\n    lr_mult: 0\n  }\n}\nlayer {\n  name: \"conv_2_2/conv2d_relu\"\n  type: \"ReLU\"\n  bottom: \"conv_2_2/conv2d_bn\"\n  top: \"conv_2_2/conv2d_bn\"\n}\nlayer {\n  name: \"pool\"\n  type: \"Pooling\"\n  bottom: \"conv_2_2/conv2d_bn\"\n  top: \"pool\"\n  pooling_param {\n    pool: MAX\n    pad: 0\n    kernel_size: 3\n    stride: 2\n  }\n}\nlayer {\n  name: \"conv_3_3/conv2d\"\n  type: \"Convolution\"\n  bottom: \"pool\"\n  top: \"conv_3_3/conv2d\"\n  convolution_param {\n    bias_term: false\n    num_output: 80\n    pad: 0\n    kernel_size: 1\n    stride: 1\n    weight_filler {\n        type: \"xavier\"\n    }\n  }\n\n}\nlayer {\n  name: \"conv_3_3/conv2d_bn\"\n  type: \"BatchNorm\"\n  bottom: \"conv_3_3/conv2d\"\n  top: \"conv_3_3/conv2d_bn\"\n  batch_norm_param {\n    use_global_stats: false\n    eps: 0.001\n  }\n  param {\n    lr_mult: 0\n  }\n  param {\n    lr_mult: 0\n  }\n  param {\n    lr_mult: 0\n  }\n}\nlayer {\n  name: \"conv_3_3/conv2d_relu\"\n  type: \"ReLU\"\n  bottom: \"conv_3_3/conv2d_bn\"\n  top: \"conv_3_3/conv2d_bn\"\n}\nlayer {\n  name: \"conv_4_4/conv2d\"\n  type: \"Convolution\"\n  bottom: \"conv_3_3/conv2d_bn\"\n  top: \"conv_4_4/conv2d\"\n  convolution_param {\n    bias_term: false\n    num_output: 192\n    pad: 0\n    kernel_size: 3\n    stride: 1\n    weight_filler {\n        type: \"xavier\"\n    }\n  }\n\n}\nlayer {\n  name: \"conv_4_4/conv2d_bn\"\n  type: \"BatchNorm\"\n  bottom: \"conv_4_4/conv2d\"\n  top: \"conv_4_4/conv2d_bn\"\n  batch_norm_param {\n    use_global_stats: false\n    eps: 0.001\n  }\n  param {\n    lr_mult: 0\n  }\n  param {\n    lr_mult: 0\n  }\n  param {\n    lr_mult: 0\n  }\n}\nlayer {\n  name: \"conv_4_4/conv2d_relu\"\n  type: \"ReLU\"\n  bottom: \"conv_4_4/conv2d_bn\"\n  top: \"conv_4_4/conv2d_bn\"\n}\nlayer {\n  name: \"pool1\"\n  type: \"Pooling\"\n  bottom: \"conv_4_4/conv2d_bn\"\n  top: \"pool1\"\n  pooling_param {\n    pool: MAX\n    pad: 0\n    kernel_size: 3\n    stride: 2\n  }\n}\nlayer {\n  name: \"mixed_conv/conv2d\"\n  type: \"Convolution\"\n  bottom: \"pool1\"\n  top: \"mixed_conv/conv2d\"\n  convolution_param {\n    bias_term: false\n    num_output: 64\n    pad: 0\n    kernel_size: 1\n    stride: 1\n    weight_filler {\n        type: \"xavier\"\n    }\n  }\n\n}\nlayer {\n  name: \"mixed_conv/conv2d_bn\"\n  type: \"BatchNorm\"\n  bottom: \"mixed_conv/conv2d\"\n  top: \"mixed_conv/conv2d_bn\"\n  batch_norm_param {\n    use_global_stats: false\n    eps: 0.001\n  }\n  param {\n    lr_mult: 0\n  }\n  param {\n    lr_mult: 0\n  }\n  param {\n    lr_mult: 0\n  }\n}\nlayer {\n  name: \"mixed_conv/conv2d_relu\"\n  type: \"ReLU\"\n  bottom: \"mixed_conv/conv2d_bn\"\n  top: \"mixed_conv/conv2d_bn\"\n}\nlayer {\n  name: \"mixed_tower/conv_conv2d\"\n  type: \"Convolution\"\n  bottom: \"pool1\"\n  top: \"mixed_tower/conv_conv2d\"\n  convolution_param {\n    bias_term: false\n    num_output: 48\n    pad: 0\n    kernel_size: 1\n    stride: 1\n    weight_filler {\n        type: \"xavier\"\n    }\n  }\n\n}\nlayer {\n  name: \"mixed_tower/conv_conv2d_bn\"\n  type: \"BatchNorm\"\n  bottom: \"mixed_tower/conv_conv2d\"\n  top: \"mixed_tower/conv_conv2d_bn\"\n  batch_norm_param {\n    use_global_stats: false\n    eps: 0.001\n  }\n  param {\n    lr_mult: 0\n  }\n  param {\n    lr_mult: 0\n  }\n  param {\n    lr_mult: 0\n  }\n}\nlayer {\n  name: \"mixed_tower/conv_conv2d_relu\"\n  type: \"ReLU\"\n  bottom: \"mixed_tower/conv_conv2d_bn\"\n  top: \"mixed_tower/conv_conv2d_bn\"\n}\nlayer {\n  name: \"mixed_tower/conv_1_conv2d\"\n  type: \"Convolution\"\n  bottom: \"mixed_tower/conv_conv2d_bn\"\n  top: \"mixed_tower/conv_1_conv2d\"\n  convolution_param {\n    bias_term: false\n    num_output: 64\n    pad: 2\n    kernel_size: 5\n    stride: 1\n    weight_filler {\n        type: \"xavier\"\n    }\n  }\n\n}\nlayer {\n  name: \"mixed_tower/conv_1_conv2d_bn\"\n  type: \"BatchNorm\"\n  bottom: \"mixed_tower/conv_1_conv2d\"\n  top: \"mixed_tower/conv_1_conv2d_bn\"\n  batch_norm_param {\n    use_global_stats: false\n    eps: 0.001\n  }\n  param {\n    lr_mult: 0\n  }\n  param {\n    lr_mult: 0\n  }\n  param {\n    lr_mult: 0\n  }\n}\nlayer {\n  name: \"mixed_tower/conv_1_conv2d_relu\"\n  type: \"ReLU\"\n  bottom: \"mixed_tower/conv_1_conv2d_bn\"\n  top: \"mixed_tower/conv_1_conv2d_bn\"\n}\nlayer {\n  name: \"mixed_tower/1_conv_conv2d\"\n  type: \"Convolution\"\n  bottom: \"pool1\"\n  top: \"mixed_tower/1_conv_conv2d\"\n  convolution_param {\n    bias_term: false\n    num_output: 64\n    pad: 0\n    kernel_size: 1\n    stride: 1\n    weight_filler {\n        type: \"xavier\"\n    }\n  }\n\n}\nlayer {\n  name: \"mixed_tower/1_conv_conv2d_bn\"\n  type: \"BatchNorm\"\n  bottom: \"mixed_tower/1_conv_conv2d\"\n  top: \"mixed_tower/1_conv_conv2d_bn\"\n  batch_norm_param {\n    use_global_stats: false\n    eps: 0.001\n  }\n  param {\n    lr_mult: 0\n  }\n  param {\n    lr_mult: 0\n  }\n  param {\n    lr_mult: 0\n  }\n}\nlayer {\n  name: \"mixed_tower/1_conv_conv2d_relu\"\n  type: \"ReLU\"\n  bottom: \"mixed_tower/1_conv_conv2d_bn\"\n  top: \"mixed_tower/1_conv_conv2d_bn\"\n}\nlayer {\n  name: \"mixed_tower/1_conv_1_conv2d\"\n  type: \"Convolution\"\n  bottom: \"mixed_tower/1_conv_conv2d_bn\"\n  top: \"mixed_tower/1_conv_1_conv2d\"\n  convolution_param {\n    bias_term: false\n    num_output: 96\n    pad: 1\n    kernel_size: 3\n    stride: 1\n    weight_filler {\n        type: \"xavier\"\n    }\n  }\n\n}\nlayer {\n  name: \"mixed_tower/1_conv_1_conv2d_bn\"\n  type: \"BatchNorm\"\n  bottom: \"mixed_tower/1_conv_1_conv2d\"\n  top: \"mixed_tower/1_conv_1_conv2d_bn\"\n  batch_norm_param {\n    use_global_stats: false\n    eps: 0.001\n  }\n  param {\n    lr_mult: 0\n  }\n  param {\n    lr_mult: 0\n  }\n  param {\n    lr_mult: 0\n  }\n}\nlayer {\n  name: \"mixed_tower/1_conv_1_conv2d_relu\"\n  type: \"ReLU\"\n  bottom: \"mixed_tower/1_conv_1_conv2d_bn\"\n  top: \"mixed_tower/1_conv_1_conv2d_bn\"\n}\nlayer {\n  name: \"mixed_tower/1_conv_2_conv2d\"\n  type: \"Convolution\"\n  bottom: \"mixed_tower/1_conv_1_conv2d_bn\"\n  top: \"mixed_tower/1_conv_2_conv2d\"\n  convolution_param {\n    bias_term: false\n    num_output: 96\n    pad: 1\n    kernel_size: 3\n    stride: 1\n    weight_filler {\n        type: \"xavier\"\n    }\n  }\n\n}\nlayer {\n  name: \"mixed_tower/1_conv_2_conv2d_bn\"\n  type: \"BatchNorm\"\n  bottom: \"mixed_tower/1_conv_2_conv2d\"\n  top: \"mixed_tower/1_conv_2_conv2d_bn\"\n  batch_norm_param {\n    use_global_stats: false\n    eps: 0.001\n  }\n  param {\n    lr_mult: 0\n  }\n  param {\n    lr_mult: 0\n  }\n  param {\n    lr_mult: 0\n  }\n}\nlayer {\n  name: \"mixed_tower/1_conv_2_conv2d_relu\"\n  type: \"ReLU\"\n  bottom: \"mixed_tower/1_conv_2_conv2d_bn\"\n  top: \"mixed_tower/1_conv_2_conv2d_bn\"\n}\nlayer {\n  name: \"mixed_tower/AVG_pool\"\n  type: \"Pooling\"\n  bottom: \"pool1\"\n  top: \"mixed_tower/AVG_pool\"\n  pooling_param {\n    pool: AVE\n    pad: 1\n    kernel_size: 3\n    stride: 1\n  }\n}\nlayer {\n  name: \"mixed_tower/2_conv_conv2d\"\n  type: \"Convolution\"\n  bottom: \"mixed_tower/AVG_pool\"\n  top: \"mixed_tower/2_conv_conv2d\"\n  convolution_param {\n    bias_term: false\n    num_output: 32\n    pad: 0\n    kernel_size: 1\n    stride: 1\n    weight_filler {\n        type: \"xavier\"\n    }\n  }\n\n}\nlayer {\n  name: \"mixed_tower/2_conv_conv2d_bn\"\n  type: \"BatchNorm\"\n  bottom: \"mixed_tower/2_conv_conv2d\"\n  top: \"mixed_tower/2_conv_conv2d_bn\"\n  batch_norm_param {\n    use_global_stats: false\n    eps: 0.001\n  }\n  param {\n    lr_mult: 0\n  }\n  param {\n    lr_mult: 0\n  }\n  param {\n    lr_mult: 0\n  }\n}\nlayer {\n  name: \"mixed_tower/2_conv_conv2d_relu\"\n  type: \"ReLU\"\n  bottom: \"mixed_tower/2_conv_conv2d_bn\"\n  top: \"mixed_tower/2_conv_conv2d_bn\"\n}\nlayer {\n  name: \"mixed_tower/chconcat\"\n  bottom: \"mixed_conv/conv2d_bn\"\n  bottom: \"mixed_tower/conv_1_conv2d_bn\"\n  bottom: \"mixed_tower/1_conv_2_conv2d_bn\"\n  bottom: \"mixed_tower/2_conv_conv2d_bn\"\n  top: \"mixed_tower/chconcat\"\n  type: \"Concat\"\n  concat_param {\n    axis: 1\n  }\n}\nlayer {\n  name: \"mixed_1/conv_conv2d\"\n  type: \"Convolution\"\n  bottom: \"mixed_tower/chconcat\"\n  top: \"mixed_1/conv_conv2d\"\n  convolution_param {\n    bias_term: false\n    num_output: 64\n    pad: 0\n    kernel_size: 1\n    stride: 1\n    weight_filler {\n        type: \"xavier\"\n    }\n  }\n\n}\nlayer {\n  name: \"mixed_1/conv_conv2d_bn\"\n  type: \"BatchNorm\"\n  bottom: \"mixed_1/conv_conv2d\"\n  top: \"mixed_1/conv_conv2d_bn\"\n  batch_norm_param {\n    use_global_stats: false\n    eps: 0.001\n  }\n  param {\n    lr_mult: 0\n  }\n  param {\n    lr_mult: 0\n  }\n  param {\n    lr_mult: 0\n  }\n}\nlayer {\n  name: \"mixed_1/conv_conv2d_relu\"\n  type: \"ReLU\"\n  bottom: \"mixed_1/conv_conv2d_bn\"\n  top: \"mixed_1/conv_conv2d_bn\"\n}\nlayer {\n  name: \"mixed_1/tower_conv_conv2d\"\n  type: \"Convolution\"\n  bottom: \"mixed_tower/chconcat\"\n  top: \"mixed_1/tower_conv_conv2d\"\n  convolution_param {\n    bias_term: false\n    num_output: 48\n    pad: 0\n    kernel_size: 1\n    stride: 1\n    weight_filler {\n        type: \"xavier\"\n    }\n  }\n\n}\nlayer {\n  name: \"mixed_1/tower_conv_conv2d_bn\"\n  type: \"BatchNorm\"\n  bottom: \"mixed_1/tower_conv_conv2d\"\n  top: \"mixed_1/tower_conv_conv2d_bn\"\n  batch_norm_param {\n    use_global_stats: false\n    eps: 0.001\n  }\n  param {\n    lr_mult: 0\n  }\n  param {\n    lr_mult: 0\n  }\n  param {\n    lr_mult: 0\n  }\n}\nlayer {\n  name: \"mixed_1/tower_conv_conv2d_relu\"\n  type: \"ReLU\"\n  bottom: \"mixed_1/tower_conv_conv2d_bn\"\n  top: \"mixed_1/tower_conv_conv2d_bn\"\n}\nlayer {\n  name: \"mixed_1/tower_conv_1_conv2d\"\n  type: \"Convolution\"\n  bottom: \"mixed_1/tower_conv_conv2d_bn\"\n  top: \"mixed_1/tower_conv_1_conv2d\"\n  convolution_param {\n    bias_term: false\n    num_output: 64\n    pad: 2\n    kernel_size: 5\n    stride: 1\n    weight_filler {\n        type: \"xavier\"\n    }\n  }\n\n}\nlayer {\n  name: \"mixed_1/tower_conv_1_conv2d_bn\"\n  type: \"BatchNorm\"\n  bottom: \"mixed_1/tower_conv_1_conv2d\"\n  top: \"mixed_1/tower_conv_1_conv2d_bn\"\n  batch_norm_param {\n    use_global_stats: false\n    eps: 0.001\n  }\n  param {\n    lr_mult: 0\n  }\n  param {\n    lr_mult: 0\n  }\n  param {\n    lr_mult: 0\n  }\n}\nlayer {\n  name: \"mixed_1/tower_conv_1_conv2d_relu\"\n  type: \"ReLU\"\n  bottom: \"mixed_1/tower_conv_1_conv2d_bn\"\n  top: \"mixed_1/tower_conv_1_conv2d_bn\"\n}\nlayer {\n  name: \"mixed_1/tower_1_conv_conv2d\"\n  type: \"Convolution\"\n  bottom: \"mixed_tower/chconcat\"\n  top: \"mixed_1/tower_1_conv_conv2d\"\n  convolution_param {\n    bias_term: false\n    num_output: 64\n    pad: 0\n    kernel_size: 1\n    stride: 1\n    weight_filler {\n        type: \"xavier\"\n    }\n  }\n\n}\nlayer {\n  name: \"mixed_1/tower_1_conv_conv2d_bn\"\n  type: \"BatchNorm\"\n  bottom: \"mixed_1/tower_1_conv_conv2d\"\n  top: \"mixed_1/tower_1_conv_conv2d_bn\"\n  batch_norm_param {\n    use_global_stats: false\n    eps: 0.001\n  }\n  param {\n    lr_mult: 0\n  }\n  param {\n    lr_mult: 0\n  }\n  param {\n    lr_mult: 0\n  }\n}\nlayer {\n  name: \"mixed_1/tower_1_conv_conv2d_relu\"\n  type: \"ReLU\"\n  bottom: \"mixed_1/tower_1_conv_conv2d_bn\"\n  top: \"mixed_1/tower_1_conv_conv2d_bn\"\n}\nlayer {\n  name: \"mixed_1/tower_1_conv_1_conv2d\"\n  type: \"Convolution\"\n  bottom: \"mixed_1/tower_1_conv_conv2d_bn\"\n  top: \"mixed_1/tower_1_conv_1_conv2d\"\n  convolution_param {\n    bias_term: false\n    num_output: 96\n    pad: 1\n    kernel_size: 3\n    stride: 1\n    weight_filler {\n        type: \"xavier\"\n    }\n  }\n\n}\nlayer {\n  name: \"mixed_1/tower_1_conv_1_conv2d_bn\"\n  type: \"BatchNorm\"\n  bottom: \"mixed_1/tower_1_conv_1_conv2d\"\n  top: \"mixed_1/tower_1_conv_1_conv2d_bn\"\n  batch_norm_param {\n    use_global_stats: false\n    eps: 0.001\n  }\n  param {\n    lr_mult: 0\n  }\n  param {\n    lr_mult: 0\n  }\n  param {\n    lr_mult: 0\n  }\n}\nlayer {\n  name: \"mixed_1/tower_1_conv_1_conv2d_relu\"\n  type: \"ReLU\"\n  bottom: \"mixed_1/tower_1_conv_1_conv2d_bn\"\n  top: \"mixed_1/tower_1_conv_1_conv2d_bn\"\n}\nlayer {\n  name: \"mixed_1/tower_1_conv_2_conv2d\"\n  type: \"Convolution\"\n  bottom: \"mixed_1/tower_1_conv_1_conv2d_bn\"\n  top: \"mixed_1/tower_1_conv_2_conv2d\"\n  convolution_param {\n    bias_term: false\n    num_output: 96\n    pad: 1\n    kernel_size: 3\n    stride: 1\n    weight_filler {\n        type: \"xavier\"\n    }\n  }\n\n}\nlayer {\n  name: \"mixed_1/tower_1_conv_2_conv2d_bn\"\n  type: \"BatchNorm\"\n  bottom: \"mixed_1/tower_1_conv_2_conv2d\"\n  top: \"mixed_1/tower_1_conv_2_conv2d_bn\"\n  batch_norm_param {\n    use_global_stats: false\n    eps: 0.001\n  }\n  param {\n    lr_mult: 0\n  }\n  param {\n    lr_mult: 0\n  }\n  param {\n    lr_mult: 0\n  }\n}\nlayer {\n  name: \"mixed_1/tower_1_conv_2_conv2d_relu\"\n  type: \"ReLU\"\n  bottom: \"mixed_1/tower_1_conv_2_conv2d_bn\"\n  top: \"mixed_1/tower_1_conv_2_conv2d_bn\"\n}\nlayer {\n  name: \"mixed_1/tower_2_AVG_pool\"\n  type: \"Pooling\"\n  bottom: \"mixed_tower/chconcat\"\n  top: \"mixed_1/tower_2_AVG_pool\"\n  pooling_param {\n    pool: AVE\n    pad: 1\n    kernel_size: 3\n    stride: 1\n  }\n}\nlayer {\n  name: \"mixed_1/tower_2_conv_conv2d\"\n  type: \"Convolution\"\n  bottom: \"mixed_1/tower_2_AVG_pool\"\n  top: \"mixed_1/tower_2_conv_conv2d\"\n  convolution_param {\n    bias_term: false\n    num_output: 64\n    pad: 0\n    kernel_size: 1\n    stride: 1\n    weight_filler {\n        type: \"xavier\"\n    }\n  }\n\n}\nlayer {\n  name: \"mixed_1/tower_2_conv_conv2d_bn\"\n  type: \"BatchNorm\"\n  bottom: \"mixed_1/tower_2_conv_conv2d\"\n  top: \"mixed_1/tower_2_conv_conv2d_bn\"\n  batch_norm_param {\n    use_global_stats: false\n    eps: 0.001\n  }\n  param {\n    lr_mult: 0\n  }\n  param {\n    lr_mult: 0\n  }\n  param {\n    lr_mult: 0\n  }\n}\nlayer {\n  name: \"mixed_1/tower_2_conv_conv2d_relu\"\n  type: \"ReLU\"\n  bottom: \"mixed_1/tower_2_conv_conv2d_bn\"\n  top: \"mixed_1/tower_2_conv_conv2d_bn\"\n}\nlayer {\n  name: \"mixed_1/chconcat\"\n  bottom: \"mixed_1/conv_conv2d_bn\"\nbottom: \"mixed_1/tower_conv_1_conv2d_bn\"\nbottom: \"mixed_1/tower_1_conv_2_conv2d_bn\"\nbottom: \"mixed_1/tower_2_conv_conv2d_bn\"\n\n  top: \"mixed_1/chconcat\"\n  type: \"Concat\"\n  concat_param {\n    axis: 1\n  }\n}\nlayer {\n  name: \"mixed_2/conv_conv2d\"\n  type: \"Convolution\"\n  bottom: \"mixed_1/chconcat\"\n  top: \"mixed_2/conv_conv2d\"\n  convolution_param {\n    bias_term: false\n    num_output: 64\n    pad: 0\n    kernel_size: 1\n    stride: 1\n    weight_filler {\n        type: \"xavier\"\n    }\n  }\n\n}\nlayer {\n  name: \"mixed_2/conv_conv2d_bn\"\n  type: \"BatchNorm\"\n  bottom: \"mixed_2/conv_conv2d\"\n  top: \"mixed_2/conv_conv2d_bn\"\n  batch_norm_param {\n    use_global_stats: false\n    eps: 0.001\n  }\n  param {\n    lr_mult: 0\n  }\n  param {\n    lr_mult: 0\n  }\n  param {\n    lr_mult: 0\n  }\n}\nlayer {\n  name: \"mixed_2/conv_conv2d_relu\"\n  type: \"ReLU\"\n  bottom: \"mixed_2/conv_conv2d_bn\"\n  top: \"mixed_2/conv_conv2d_bn\"\n}\nlayer {\n  name: \"mixed_2/tower_conv_conv2d\"\n  type: \"Convolution\"\n  bottom: \"mixed_1/chconcat\"\n  top: \"mixed_2/tower_conv_conv2d\"\n  convolution_param {\n    bias_term: false\n    num_output: 48\n    pad: 0\n    kernel_size: 1\n    stride: 1\n    weight_filler {\n        type: \"xavier\"\n    }\n  }\n\n}\nlayer {\n  name: \"mixed_2/tower_conv_conv2d_bn\"\n  type: \"BatchNorm\"\n  bottom: \"mixed_2/tower_conv_conv2d\"\n  top: \"mixed_2/tower_conv_conv2d_bn\"\n  batch_norm_param {\n    use_global_stats: false\n    eps: 0.001\n  }\n  param {\n    lr_mult: 0\n  }\n  param {\n    lr_mult: 0\n  }\n  param {\n    lr_mult: 0\n  }\n}\nlayer {\n  name: \"mixed_2/tower_conv_conv2d_relu\"\n  type: \"ReLU\"\n  bottom: \"mixed_2/tower_conv_conv2d_bn\"\n  top: \"mixed_2/tower_conv_conv2d_bn\"\n}\nlayer {\n  name: \"mixed_2/tower_conv_1_conv2d\"\n  type: \"Convolution\"\n  bottom: \"mixed_2/tower_conv_conv2d_bn\"\n  top: \"mixed_2/tower_conv_1_conv2d\"\n  convolution_param {\n    bias_term: false\n    num_output: 64\n    pad: 2\n    kernel_size: 5\n    stride: 1\n    weight_filler {\n        type: \"xavier\"\n    }\n  }\n\n}\nlayer {\n  name: \"mixed_2/tower_conv_1_conv2d_bn\"\n  type: \"BatchNorm\"\n  bottom: \"mixed_2/tower_conv_1_conv2d\"\n  top: \"mixed_2/tower_conv_1_conv2d_bn\"\n  batch_norm_param {\n    use_global_stats: false\n    eps: 0.001\n  }\n  param {\n    lr_mult: 0\n  }\n  param {\n    lr_mult: 0\n  }\n  param {\n    lr_mult: 0\n  }\n}\nlayer {\n  name: \"mixed_2/tower_conv_1_conv2d_relu\"\n  type: \"ReLU\"\n  bottom: \"mixed_2/tower_conv_1_conv2d_bn\"\n  top: \"mixed_2/tower_conv_1_conv2d_bn\"\n}\nlayer {\n  name: \"mixed_2/tower_1_conv_conv2d\"\n  type: \"Convolution\"\n  bottom: \"mixed_1/chconcat\"\n  top: \"mixed_2/tower_1_conv_conv2d\"\n  convolution_param {\n    bias_term: false\n    num_output: 64\n    pad: 0\n    kernel_size: 1\n    stride: 1\n    weight_filler {\n        type: \"xavier\"\n    }\n  }\n\n}\nlayer {\n  name: \"mixed_2/tower_1_conv_conv2d_bn\"\n  type: \"BatchNorm\"\n  bottom: \"mixed_2/tower_1_conv_conv2d\"\n  top: \"mixed_2/tower_1_conv_conv2d_bn\"\n  batch_norm_param {\n    use_global_stats: false\n    eps: 0.001\n  }\n  param {\n    lr_mult: 0\n  }\n  param {\n    lr_mult: 0\n  }\n  param {\n    lr_mult: 0\n  }\n}\nlayer {\n  name: \"mixed_2/tower_1_conv_conv2d_relu\"\n  type: \"ReLU\"\n  bottom: \"mixed_2/tower_1_conv_conv2d_bn\"\n  top: \"mixed_2/tower_1_conv_conv2d_bn\"\n}\nlayer {\n  name: \"mixed_2/tower_1_conv_1_conv2d\"\n  type: \"Convolution\"\n  bottom: \"mixed_2/tower_1_conv_conv2d_bn\"\n  top: \"mixed_2/tower_1_conv_1_conv2d\"\n  convolution_param {\n    bias_term: false\n    num_output: 96\n    pad: 1\n    kernel_size: 3\n    stride: 1\n    weight_filler {\n        type: \"xavier\"\n    }\n  }\n\n}\nlayer {\n  name: \"mixed_2/tower_1_conv_1_conv2d_bn\"\n  type: \"BatchNorm\"\n  bottom: \"mixed_2/tower_1_conv_1_conv2d\"\n  top: \"mixed_2/tower_1_conv_1_conv2d_bn\"\n  batch_norm_param {\n    use_global_stats: false\n    eps: 0.001\n  }\n  param {\n    lr_mult: 0\n  }\n  param {\n    lr_mult: 0\n  }\n  param {\n    lr_mult: 0\n  }\n}\nlayer {\n  name: \"mixed_2/tower_1_conv_1_conv2d_relu\"\n  type: \"ReLU\"\n  bottom: \"mixed_2/tower_1_conv_1_conv2d_bn\"\n  top: \"mixed_2/tower_1_conv_1_conv2d_bn\"\n}\nlayer {\n  name: \"mixed_2/tower_1_conv_2_conv2d\"\n  type: \"Convolution\"\n  bottom: \"mixed_2/tower_1_conv_1_conv2d_bn\"\n  top: \"mixed_2/tower_1_conv_2_conv2d\"\n  convolution_param {\n    bias_term: false\n    num_output: 96\n    pad: 1\n    kernel_size: 3\n    stride: 1\n    weight_filler {\n        type: \"xavier\"\n    }\n  }\n\n}\nlayer {\n  name: \"mixed_2/tower_1_conv_2_conv2d_bn\"\n  type: \"BatchNorm\"\n  bottom: \"mixed_2/tower_1_conv_2_conv2d\"\n  top: \"mixed_2/tower_1_conv_2_conv2d_bn\"\n  batch_norm_param {\n    use_global_stats: false\n    eps: 0.001\n  }\n  param {\n    lr_mult: 0\n  }\n  param {\n    lr_mult: 0\n  }\n  param {\n    lr_mult: 0\n  }\n}\nlayer {\n  name: \"mixed_2/tower_1_conv_2_conv2d_relu\"\n  type: \"ReLU\"\n  bottom: \"mixed_2/tower_1_conv_2_conv2d_bn\"\n  top: \"mixed_2/tower_1_conv_2_conv2d_bn\"\n}\nlayer {\n  name: \"mixed_2/tower_2_AVG_pool\"\n  type: \"Pooling\"\n  bottom: \"mixed_1/chconcat\"\n  top: \"mixed_2/tower_2_AVG_pool\"\n  pooling_param {\n    pool: AVE\n    pad: 1\n    kernel_size: 3\n    stride: 1\n  }\n}\nlayer {\n  name: \"mixed_2/tower_2_conv_conv2d\"\n  type: \"Convolution\"\n  bottom: \"mixed_2/tower_2_AVG_pool\"\n  top: \"mixed_2/tower_2_conv_conv2d\"\n  convolution_param {\n    bias_term: false\n    num_output: 64\n    pad: 0\n    kernel_size: 1\n    stride: 1\n    weight_filler {\n        type: \"xavier\"\n    }\n  }\n\n}\nlayer {\n  name: \"mixed_2/tower_2_conv_conv2d_bn\"\n  type: \"BatchNorm\"\n  bottom: \"mixed_2/tower_2_conv_conv2d\"\n  top: \"mixed_2/tower_2_conv_conv2d_bn\"\n  batch_norm_param {\n    use_global_stats: false\n    eps: 0.001\n  }\n  param {\n    lr_mult: 0\n  }\n  param {\n    lr_mult: 0\n  }\n  param {\n    lr_mult: 0\n  }\n}\nlayer {\n  name: \"mixed_2/tower_2_conv_conv2d_relu\"\n  type: \"ReLU\"\n  bottom: \"mixed_2/tower_2_conv_conv2d_bn\"\n  top: \"mixed_2/tower_2_conv_conv2d_bn\"\n}\nlayer {\n  name: \"mixed_2/chconcat\"\n  bottom: \"mixed_2/conv_conv2d_bn\"\nbottom: \"mixed_2/tower_conv_1_conv2d_bn\"\nbottom: \"mixed_2/tower_1_conv_2_conv2d_bn\"\nbottom: \"mixed_2/tower_2_conv_conv2d_bn\"\n\n  top: \"mixed_2/chconcat\"\n  type: \"Concat\"\n  concat_param {\n    axis: 1\n  }\n}\nlayer {\n  name: \"mixed_3/conv_conv2d\"\n  type: \"Convolution\"\n  bottom: \"mixed_2/chconcat\"\n  top: \"mixed_3/conv_conv2d\"\n  convolution_param {\n    bias_term: false\n    num_output: 384\n    pad: 0\n    kernel_size: 3\n    stride: 2\n    weight_filler {\n        type: \"xavier\"\n    }\n  }\n\n}\nlayer {\n  name: \"mixed_3/conv_conv2d_bn\"\n  type: \"BatchNorm\"\n  bottom: \"mixed_3/conv_conv2d\"\n  top: \"mixed_3/conv_conv2d_bn\"\n  batch_norm_param {\n    use_global_stats: false\n    eps: 0.001\n  }\n  param {\n    lr_mult: 0\n  }\n  param {\n    lr_mult: 0\n  }\n  param {\n    lr_mult: 0\n  }\n}\nlayer {\n  name: \"mixed_3/conv_conv2d_relu\"\n  type: \"ReLU\"\n  bottom: \"mixed_3/conv_conv2d_bn\"\n  top: \"mixed_3/conv_conv2d_bn\"\n}\nlayer {\n  name: \"mixed_3/tower_conv_conv2d\"\n  type: \"Convolution\"\n  bottom: \"mixed_2/chconcat\"\n  top: \"mixed_3/tower_conv_conv2d\"\n  convolution_param {\n    bias_term: false\n    num_output: 64\n    pad: 0\n    kernel_size: 1\n    stride: 1\n    weight_filler {\n        type: \"xavier\"\n    }\n  }\n\n}\nlayer {\n  name: \"mixed_3/tower_conv_conv2d_bn\"\n  type: \"BatchNorm\"\n  bottom: \"mixed_3/tower_conv_conv2d\"\n  top: \"mixed_3/tower_conv_conv2d_bn\"\n  batch_norm_param {\n    use_global_stats: false\n    eps: 0.001\n  }\n  param {\n    lr_mult: 0\n  }\n  param {\n    lr_mult: 0\n  }\n  param {\n    lr_mult: 0\n  }\n}\nlayer {\n  name: \"mixed_3/tower_conv_conv2d_relu\"\n  type: \"ReLU\"\n  bottom: \"mixed_3/tower_conv_conv2d_bn\"\n  top: \"mixed_3/tower_conv_conv2d_bn\"\n}\nlayer {\n  name: \"mixed_3/tower_conv_1_conv2d\"\n  type: \"Convolution\"\n  bottom: \"mixed_3/tower_conv_conv2d_bn\"\n  top: \"mixed_3/tower_conv_1_conv2d\"\n  convolution_param {\n    bias_term: false\n    num_output: 96\n    pad: 1\n    kernel_size: 3\n    stride: 1\n    weight_filler {\n        type: \"xavier\"\n    }\n  }\n\n}\nlayer {\n  name: \"mixed_3/tower_conv_1_conv2d_bn\"\n  type: \"BatchNorm\"\n  bottom: \"mixed_3/tower_conv_1_conv2d\"\n  top: \"mixed_3/tower_conv_1_conv2d_bn\"\n  batch_norm_param {\n    use_global_stats: false\n    eps: 0.001\n  }\n  param {\n    lr_mult: 0\n  }\n  param {\n    lr_mult: 0\n  }\n  param {\n    lr_mult: 0\n  }\n}\nlayer {\n  name: \"mixed_3/tower_conv_1_conv2d_relu\"\n  type: \"ReLU\"\n  bottom: \"mixed_3/tower_conv_1_conv2d_bn\"\n  top: \"mixed_3/tower_conv_1_conv2d_bn\"\n}\nlayer {\n  name: \"mixed_3/tower_conv_2_conv2d\"\n  type: \"Convolution\"\n  bottom: \"mixed_3/tower_conv_1_conv2d_bn\"\n  top: \"mixed_3/tower_conv_2_conv2d\"\n  convolution_param {\n    bias_term: false\n    num_output: 96\n    pad: 0\n    kernel_size: 3\n    stride: 2\n    weight_filler {\n        type: \"xavier\"\n    }\n  }\n\n}\nlayer {\n  name: \"mixed_3/tower_conv_2_conv2d_bn\"\n  type: \"BatchNorm\"\n  bottom: \"mixed_3/tower_conv_2_conv2d\"\n  top: \"mixed_3/tower_conv_2_conv2d_bn\"\n  batch_norm_param {\n    use_global_stats: false\n    eps: 0.001\n  }\n  param {\n    lr_mult: 0\n  }\n  param {\n    lr_mult: 0\n  }\n  param {\n    lr_mult: 0\n  }\n}\nlayer {\n  name: \"mixed_3/tower_conv_2_conv2d_relu\"\n  type: \"ReLU\"\n  bottom: \"mixed_3/tower_conv_2_conv2d_bn\"\n  top: \"mixed_3/tower_conv_2_conv2d_bn\"\n}\nlayer {\n  name: \"mixed_3/max_pool\"\n  type: \"Pooling\"\n  bottom: \"mixed_2/chconcat\"\n  top: \"mixed_3/max_pool\"\n  pooling_param {\n    pool: MAX\n    pad: 0\n    kernel_size: 3\n    stride: 2\n  }\n}\nlayer {\n  name: \"mixed_3/chconcat\"\n  bottom: \"mixed_3/max_pool\"\nbottom: \"mixed_3/conv_conv2d_bn\"\nbottom: \"mixed_3/tower_conv_2_conv2d_bn\"\n\n  top: \"mixed_3/chconcat\"\n  type: \"Concat\"\n  concat_param {\n    axis: 1\n  }\n}\nlayer {\n  name: \"mixed_4/conv_conv2d\"\n  type: \"Convolution\"\n  bottom: \"mixed_3/chconcat\"\n  top: \"mixed_4/conv_conv2d\"\n  convolution_param {\n    bias_term: false\n    num_output: 192\n    pad: 0\n    kernel_size: 1\n    stride: 1\n    weight_filler {\n        type: \"xavier\"\n    }\n  }\n\n}\nlayer {\n  name: \"mixed_4/conv_conv2d_bn\"\n  type: \"BatchNorm\"\n  bottom: \"mixed_4/conv_conv2d\"\n  top: \"mixed_4/conv_conv2d_bn\"\n  batch_norm_param {\n    use_global_stats: false\n    eps: 0.001\n  }\n  param {\n    lr_mult: 0\n  }\n  param {\n    lr_mult: 0\n  }\n  param {\n    lr_mult: 0\n  }\n}\nlayer {\n  name: \"mixed_4/conv_conv2d_relu\"\n  type: \"ReLU\"\n  bottom: \"mixed_4/conv_conv2d_bn\"\n  top: \"mixed_4/conv_conv2d_bn\"\n}\nlayer {\n  name: \"mixed_4/tower_conv_conv2d\"\n  type: \"Convolution\"\n  bottom: \"mixed_3/chconcat\"\n  top: \"mixed_4/tower_conv_conv2d\"\n  convolution_param {\n    bias_term: false\n    num_output: 128\n    pad: 0\n    kernel_size: 1\n    stride: 1\n    weight_filler {\n        type: \"xavier\"\n    }\n  }\n\n}\nlayer {\n  name: \"mixed_4/tower_conv_conv2d_bn\"\n  type: \"BatchNorm\"\n  bottom: \"mixed_4/tower_conv_conv2d\"\n  top: \"mixed_4/tower_conv_conv2d_bn\"\n  batch_norm_param {\n    use_global_stats: false\n    eps: 0.001\n  }\n  param {\n    lr_mult: 0\n  }\n  param {\n    lr_mult: 0\n  }\n  param {\n    lr_mult: 0\n  }\n}\nlayer {\n  name: \"mixed_4/tower_conv_conv2d_relu\"\n  type: \"ReLU\"\n  bottom: \"mixed_4/tower_conv_conv2d_bn\"\n  top: \"mixed_4/tower_conv_conv2d_bn\"\n}\nlayer {\n  name: \"mixed_4/tower_conv_1_conv2d\"\n  type: \"Convolution\"\n  bottom: \"mixed_4/tower_conv_conv2d_bn\"\n  top: \"mixed_4/tower_conv_1_conv2d\"\n  convolution_param {\n    bias_term: false\n    num_output: 128\n    pad_h: 0\npad_w: 3\n    kernel_h: 1\nkernel_w: 7\n    stride: 1\n    weight_filler {\n        type: \"xavier\"\n    }\n  }\n\n}\nlayer {\n  name: \"mixed_4/tower_conv_1_conv2d_bn\"\n  type: \"BatchNorm\"\n  bottom: \"mixed_4/tower_conv_1_conv2d\"\n  top: \"mixed_4/tower_conv_1_conv2d_bn\"\n  batch_norm_param {\n    use_global_stats: false\n    eps: 0.001\n  }\n  param {\n    lr_mult: 0\n  }\n  param {\n    lr_mult: 0\n  }\n  param {\n    lr_mult: 0\n  }\n}\nlayer {\n  name: \"mixed_4/tower_conv_1_conv2d_relu\"\n  type: \"ReLU\"\n  bottom: \"mixed_4/tower_conv_1_conv2d_bn\"\n  top: \"mixed_4/tower_conv_1_conv2d_bn\"\n}\nlayer {\n  name: \"mixed_4/tower_conv_2_conv2d\"\n  type: \"Convolution\"\n  bottom: \"mixed_4/tower_conv_1_conv2d_bn\"\n  top: \"mixed_4/tower_conv_2_conv2d\"\n  convolution_param {\n    bias_term: false\n    num_output: 192\n    pad_h: 3\npad_w: 0\n    kernel_h: 7\nkernel_w: 1\n    stride: 1\n    weight_filler {\n        type: \"xavier\"\n    }\n  }\n\n}\nlayer {\n  name: \"mixed_4/tower_conv_2_conv2d_bn\"\n  type: \"BatchNorm\"\n  bottom: \"mixed_4/tower_conv_2_conv2d\"\n  top: \"mixed_4/tower_conv_2_conv2d_bn\"\n  batch_norm_param {\n    use_global_stats: false\n    eps: 0.001\n  }\n  param {\n    lr_mult: 0\n  }\n  param {\n    lr_mult: 0\n  }\n  param {\n    lr_mult: 0\n  }\n}\nlayer {\n  name: \"mixed_4/tower_conv_2_conv2d_relu\"\n  type: \"ReLU\"\n  bottom: \"mixed_4/tower_conv_2_conv2d_bn\"\n  top: \"mixed_4/tower_conv_2_conv2d_bn\"\n}\nlayer {\n  name: \"mixed_4/tower_1_conv_conv2d\"\n  type: \"Convolution\"\n  bottom: \"mixed_3/chconcat\"\n  top: \"mixed_4/tower_1_conv_conv2d\"\n  convolution_param {\n    bias_term: false\n    num_output: 128\n    pad: 0\n    kernel_size: 1\n    stride: 1\n    weight_filler {\n        type: \"xavier\"\n    }\n  }\n\n}\nlayer {\n  name: \"mixed_4/tower_1_conv_conv2d_bn\"\n  type: \"BatchNorm\"\n  bottom: \"mixed_4/tower_1_conv_conv2d\"\n  top: \"mixed_4/tower_1_conv_conv2d_bn\"\n  batch_norm_param {\n    use_global_stats: false\n    eps: 0.001\n  }\n  param {\n    lr_mult: 0\n  }\n  param {\n    lr_mult: 0\n  }\n  param {\n    lr_mult: 0\n  }\n}\nlayer {\n  name: \"mixed_4/tower_1_conv_conv2d_relu\"\n  type: \"ReLU\"\n  bottom: \"mixed_4/tower_1_conv_conv2d_bn\"\n  top: \"mixed_4/tower_1_conv_conv2d_bn\"\n}\nlayer {\n  name: \"mixed_4/tower_1_conv_1_conv2d\"\n  type: \"Convolution\"\n  bottom: \"mixed_4/tower_1_conv_conv2d_bn\"\n  top: \"mixed_4/tower_1_conv_1_conv2d\"\n  convolution_param {\n    bias_term: false\n    num_output: 128\n    pad_h: 3\npad_w: 0\n    kernel_h: 7\nkernel_w: 1\n    stride: 1\n    weight_filler {\n        type: \"xavier\"\n    }\n  }\n\n}\nlayer {\n  name: \"mixed_4/tower_1_conv_1_conv2d_bn\"\n  type: \"BatchNorm\"\n  bottom: \"mixed_4/tower_1_conv_1_conv2d\"\n  top: \"mixed_4/tower_1_conv_1_conv2d_bn\"\n  batch_norm_param {\n    use_global_stats: false\n    eps: 0.001\n  }\n  param {\n    lr_mult: 0\n  }\n  param {\n    lr_mult: 0\n  }\n  param {\n    lr_mult: 0\n  }\n}\nlayer {\n  name: \"mixed_4/tower_1_conv_1_conv2d_relu\"\n  type: \"ReLU\"\n  bottom: \"mixed_4/tower_1_conv_1_conv2d_bn\"\n  top: \"mixed_4/tower_1_conv_1_conv2d_bn\"\n}\nlayer {\n  name: \"mixed_4/tower_1_conv_2_conv2d\"\n  type: \"Convolution\"\n  bottom: \"mixed_4/tower_1_conv_1_conv2d_bn\"\n  top: \"mixed_4/tower_1_conv_2_conv2d\"\n  convolution_param {\n    bias_term: false\n    num_output: 128\n    pad_h: 0\npad_w: 3\n    kernel_h: 1\nkernel_w: 7\n    stride: 1\n    weight_filler {\n        type: \"xavier\"\n    }\n  }\n\n}\nlayer {\n  name: \"mixed_4/tower_1_conv_2_conv2d_bn\"\n  type: \"BatchNorm\"\n  bottom: \"mixed_4/tower_1_conv_2_conv2d\"\n  top: \"mixed_4/tower_1_conv_2_conv2d_bn\"\n  batch_norm_param {\n    use_global_stats: false\n    eps: 0.001\n  }\n  param {\n    lr_mult: 0\n  }\n  param {\n    lr_mult: 0\n  }\n  param {\n    lr_mult: 0\n  }\n}\nlayer {\n  name: \"mixed_4/tower_1_conv_2_conv2d_relu\"\n  type: \"ReLU\"\n  bottom: \"mixed_4/tower_1_conv_2_conv2d_bn\"\n  top: \"mixed_4/tower_1_conv_2_conv2d_bn\"\n}\nlayer {\n  name: \"mixed_4/tower_1_conv_3_conv2d\"\n  type: \"Convolution\"\n  bottom: \"mixed_4/tower_1_conv_2_conv2d_bn\"\n  top: \"mixed_4/tower_1_conv_3_conv2d\"\n  convolution_param {\n    bias_term: false\n    num_output: 128\n    pad_h: 3\npad_w: 0\n    kernel_h: 7\nkernel_w: 1\n    stride: 1\n    weight_filler {\n        type: \"xavier\"\n    }\n  }\n\n}\nlayer {\n  name: \"mixed_4/tower_1_conv_3_conv2d_bn\"\n  type: \"BatchNorm\"\n  bottom: \"mixed_4/tower_1_conv_3_conv2d\"\n  top: \"mixed_4/tower_1_conv_3_conv2d_bn\"\n  batch_norm_param {\n    use_global_stats: false\n    eps: 0.001\n  }\n  param {\n    lr_mult: 0\n  }\n  param {\n    lr_mult: 0\n  }\n  param {\n    lr_mult: 0\n  }\n}\nlayer {\n  name: \"mixed_4/tower_1_conv_3_conv2d_relu\"\n  type: \"ReLU\"\n  bottom: \"mixed_4/tower_1_conv_3_conv2d_bn\"\n  top: \"mixed_4/tower_1_conv_3_conv2d_bn\"\n}\nlayer {\n  name: \"mixed_4/tower_1_conv_4_conv2d\"\n  type: \"Convolution\"\n  bottom: \"mixed_4/tower_1_conv_3_conv2d_bn\"\n  top: \"mixed_4/tower_1_conv_4_conv2d\"\n  convolution_param {\n    bias_term: false\n    num_output: 192\n    pad_h: 0\npad_w: 3\n    kernel_h: 1\nkernel_w: 7\n    stride: 1\n    weight_filler {\n        type: \"xavier\"\n    }\n  }\n\n}\nlayer {\n  name: \"mixed_4/tower_1_conv_4_conv2d_bn\"\n  type: \"BatchNorm\"\n  bottom: \"mixed_4/tower_1_conv_4_conv2d\"\n  top: \"mixed_4/tower_1_conv_4_conv2d_bn\"\n  batch_norm_param {\n    use_global_stats: false\n    eps: 0.001\n  }\n  param {\n    lr_mult: 0\n  }\n  param {\n    lr_mult: 0\n  }\n  param {\n    lr_mult: 0\n  }\n}\nlayer {\n  name: \"mixed_4/tower_1_conv_4_conv2d_relu\"\n  type: \"ReLU\"\n  bottom: \"mixed_4/tower_1_conv_4_conv2d_bn\"\n  top: \"mixed_4/tower_1_conv_4_conv2d_bn\"\n}\nlayer {\n  name: \"mixed_4/tower_2_AVG_pool\"\n  type: \"Pooling\"\n  bottom: \"mixed_3/chconcat\"\n  top: \"mixed_4/tower_2_AVG_pool\"\n  pooling_param {\n    pool: AVE\n    pad: 1\n    kernel_size: 3\n    stride: 1\n  }\n}\nlayer {\n  name: \"mixed_4/tower_2_conv_conv2d\"\n  type: \"Convolution\"\n  bottom: \"mixed_4/tower_2_AVG_pool\"\n  top: \"mixed_4/tower_2_conv_conv2d\"\n  convolution_param {\n    bias_term: false\n    num_output: 192\n    pad: 0\n    kernel_size: 1\n    stride: 1\n    weight_filler {\n        type: \"xavier\"\n    }\n  }\n\n}\nlayer {\n  name: \"mixed_4/tower_2_conv_conv2d_bn\"\n  type: \"BatchNorm\"\n  bottom: \"mixed_4/tower_2_conv_conv2d\"\n  top: \"mixed_4/tower_2_conv_conv2d_bn\"\n  batch_norm_param {\n    use_global_stats: false\n    eps: 0.001\n  }\n  param {\n    lr_mult: 0\n  }\n  param {\n    lr_mult: 0\n  }\n  param {\n    lr_mult: 0\n  }\n}\nlayer {\n  name: \"mixed_4/tower_2_conv_conv2d_relu\"\n  type: \"ReLU\"\n  bottom: \"mixed_4/tower_2_conv_conv2d_bn\"\n  top: \"mixed_4/tower_2_conv_conv2d_bn\"\n}\nlayer {\n  name: \"mixed_4/chconcat\"\n  bottom: \"mixed_4/conv_conv2d_bn\"\nbottom: \"mixed_4/tower_conv_2_conv2d_bn\"\nbottom: \"mixed_4/tower_1_conv_4_conv2d_bn\"\nbottom: \"mixed_4/tower_2_conv_conv2d_bn\"\n\n  top: \"mixed_4/chconcat\"\n  type: \"Concat\"\n  concat_param {\n    axis: 1\n  }\n}\nlayer {\n  name: \"mixed_5/conv_conv2d\"\n  type: \"Convolution\"\n  bottom: \"mixed_4/chconcat\"\n  top: \"mixed_5/conv_conv2d\"\n  convolution_param {\n    bias_term: false\n    num_output: 192\n    pad: 0\n    kernel_size: 1\n    stride: 1\n    weight_filler {\n        type: \"xavier\"\n    }\n  }\n\n}\nlayer {\n  name: \"mixed_5/conv_conv2d_bn\"\n  type: \"BatchNorm\"\n  bottom: \"mixed_5/conv_conv2d\"\n  top: \"mixed_5/conv_conv2d_bn\"\n  batch_norm_param {\n    use_global_stats: false\n    eps: 0.001\n  }\n  param {\n    lr_mult: 0\n  }\n  param {\n    lr_mult: 0\n  }\n  param {\n    lr_mult: 0\n  }\n}\nlayer {\n  name: \"mixed_5/conv_conv2d_relu\"\n  type: \"ReLU\"\n  bottom: \"mixed_5/conv_conv2d_bn\"\n  top: \"mixed_5/conv_conv2d_bn\"\n}\nlayer {\n  name: \"mixed_5/tower_conv_conv2d\"\n  type: \"Convolution\"\n  bottom: \"mixed_4/chconcat\"\n  top: \"mixed_5/tower_conv_conv2d\"\n  convolution_param {\n    bias_term: false\n    num_output: 160\n    pad: 0\n    kernel_size: 1\n    stride: 1\n    weight_filler {\n        type: \"xavier\"\n    }\n  }\n\n}\nlayer {\n  name: \"mixed_5/tower_conv_conv2d_bn\"\n  type: \"BatchNorm\"\n  bottom: \"mixed_5/tower_conv_conv2d\"\n  top: \"mixed_5/tower_conv_conv2d_bn\"\n  batch_norm_param {\n    use_global_stats: false\n    eps: 0.001\n  }\n  param {\n    lr_mult: 0\n  }\n  param {\n    lr_mult: 0\n  }\n  param {\n    lr_mult: 0\n  }\n}\nlayer {\n  name: \"mixed_5/tower_conv_conv2d_relu\"\n  type: \"ReLU\"\n  bottom: \"mixed_5/tower_conv_conv2d_bn\"\n  top: \"mixed_5/tower_conv_conv2d_bn\"\n}\nlayer {\n  name: \"mixed_5/tower_conv_1_conv2d\"\n  type: \"Convolution\"\n  bottom: \"mixed_5/tower_conv_conv2d_bn\"\n  top: \"mixed_5/tower_conv_1_conv2d\"\n  convolution_param {\n    bias_term: false\n    num_output: 160\n    pad_h: 0\npad_w: 3\n    kernel_h: 1\nkernel_w: 7\n    stride: 1\n    weight_filler {\n        type: \"xavier\"\n    }\n  }\n\n}\nlayer {\n  name: \"mixed_5/tower_conv_1_conv2d_bn\"\n  type: \"BatchNorm\"\n  bottom: \"mixed_5/tower_conv_1_conv2d\"\n  top: \"mixed_5/tower_conv_1_conv2d_bn\"\n  batch_norm_param {\n    use_global_stats: false\n    eps: 0.001\n  }\n  param {\n    lr_mult: 0\n  }\n  param {\n    lr_mult: 0\n  }\n  param {\n    lr_mult: 0\n  }\n}\nlayer {\n  name: \"mixed_5/tower_conv_1_conv2d_relu\"\n  type: \"ReLU\"\n  bottom: \"mixed_5/tower_conv_1_conv2d_bn\"\n  top: \"mixed_5/tower_conv_1_conv2d_bn\"\n}\nlayer {\n  name: \"mixed_5/tower_conv_2_conv2d\"\n  type: \"Convolution\"\n  bottom: \"mixed_5/tower_conv_1_conv2d_bn\"\n  top: \"mixed_5/tower_conv_2_conv2d\"\n  convolution_param {\n    bias_term: false\n    num_output: 192\n    pad_h: 3\npad_w: 0\n    kernel_h: 7\nkernel_w: 1\n    stride: 1\n    weight_filler {\n        type: \"xavier\"\n    }\n  }\n\n}\nlayer {\n  name: \"mixed_5/tower_conv_2_conv2d_bn\"\n  type: \"BatchNorm\"\n  bottom: \"mixed_5/tower_conv_2_conv2d\"\n  top: \"mixed_5/tower_conv_2_conv2d_bn\"\n  batch_norm_param {\n    use_global_stats: false\n    eps: 0.001\n  }\n  param {\n    lr_mult: 0\n  }\n  param {\n    lr_mult: 0\n  }\n  param {\n    lr_mult: 0\n  }\n}\nlayer {\n  name: \"mixed_5/tower_conv_2_conv2d_relu\"\n  type: \"ReLU\"\n  bottom: \"mixed_5/tower_conv_2_conv2d_bn\"\n  top: \"mixed_5/tower_conv_2_conv2d_bn\"\n}\nlayer {\n  name: \"mixed_5/tower_1_conv_conv2d\"\n  type: \"Convolution\"\n  bottom: \"mixed_4/chconcat\"\n  top: \"mixed_5/tower_1_conv_conv2d\"\n  convolution_param {\n    bias_term: false\n    num_output: 160\n    pad: 0\n    kernel_size: 1\n    stride: 1\n    weight_filler {\n        type: \"xavier\"\n    }\n  }\n\n}\nlayer {\n  name: \"mixed_5/tower_1_conv_conv2d_bn\"\n  type: \"BatchNorm\"\n  bottom: \"mixed_5/tower_1_conv_conv2d\"\n  top: \"mixed_5/tower_1_conv_conv2d_bn\"\n  batch_norm_param {\n    use_global_stats: false\n    eps: 0.001\n  }\n  param {\n    lr_mult: 0\n  }\n  param {\n    lr_mult: 0\n  }\n  param {\n    lr_mult: 0\n  }\n}\nlayer {\n  name: \"mixed_5/tower_1_conv_conv2d_relu\"\n  type: \"ReLU\"\n  bottom: \"mixed_5/tower_1_conv_conv2d_bn\"\n  top: \"mixed_5/tower_1_conv_conv2d_bn\"\n}\nlayer {\n  name: \"mixed_5/tower_1_conv_1_conv2d\"\n  type: \"Convolution\"\n  bottom: \"mixed_5/tower_1_conv_conv2d_bn\"\n  top: \"mixed_5/tower_1_conv_1_conv2d\"\n  convolution_param {\n    bias_term: false\n    num_output: 160\n    pad_h: 3\npad_w: 0\n    kernel_h: 7\nkernel_w: 1\n    stride: 1\n    weight_filler {\n        type: \"xavier\"\n    }\n  }\n\n}\nlayer {\n  name: \"mixed_5/tower_1_conv_1_conv2d_bn\"\n  type: \"BatchNorm\"\n  bottom: \"mixed_5/tower_1_conv_1_conv2d\"\n  top: \"mixed_5/tower_1_conv_1_conv2d_bn\"\n  batch_norm_param {\n    use_global_stats: false\n    eps: 0.001\n  }\n  param {\n    lr_mult: 0\n  }\n  param {\n    lr_mult: 0\n  }\n  param {\n    lr_mult: 0\n  }\n}\nlayer {\n  name: \"mixed_5/tower_1_conv_1_conv2d_relu\"\n  type: \"ReLU\"\n  bottom: \"mixed_5/tower_1_conv_1_conv2d_bn\"\n  top: \"mixed_5/tower_1_conv_1_conv2d_bn\"\n}\nlayer {\n  name: \"mixed_5/tower_1_conv_2_conv2d\"\n  type: \"Convolution\"\n  bottom: \"mixed_5/tower_1_conv_1_conv2d_bn\"\n  top: \"mixed_5/tower_1_conv_2_conv2d\"\n  convolution_param {\n    bias_term: false\n    num_output: 160\n    pad_h: 0\npad_w: 3\n    kernel_h: 1\nkernel_w: 7\n    stride: 1\n    weight_filler {\n        type: \"xavier\"\n    }\n  }\n\n}\nlayer {\n  name: \"mixed_5/tower_1_conv_2_conv2d_bn\"\n  type: \"BatchNorm\"\n  bottom: \"mixed_5/tower_1_conv_2_conv2d\"\n  top: \"mixed_5/tower_1_conv_2_conv2d_bn\"\n  batch_norm_param {\n    use_global_stats: false\n    eps: 0.001\n  }\n  param {\n    lr_mult: 0\n  }\n  param {\n    lr_mult: 0\n  }\n  param {\n    lr_mult: 0\n  }\n}\nlayer {\n  name: \"mixed_5/tower_1_conv_2_conv2d_relu\"\n  type: \"ReLU\"\n  bottom: \"mixed_5/tower_1_conv_2_conv2d_bn\"\n  top: \"mixed_5/tower_1_conv_2_conv2d_bn\"\n}\nlayer {\n  name: \"mixed_5/tower_1_conv_3_conv2d\"\n  type: \"Convolution\"\n  bottom: \"mixed_5/tower_1_conv_2_conv2d_bn\"\n  top: \"mixed_5/tower_1_conv_3_conv2d\"\n  convolution_param {\n    bias_term: false\n    num_output: 160\n    pad_h: 3\npad_w: 0\n    kernel_h: 7\nkernel_w: 1\n    stride: 1\n    weight_filler {\n        type: \"xavier\"\n    }\n  }\n\n}\nlayer {\n  name: \"mixed_5/tower_1_conv_3_conv2d_bn\"\n  type: \"BatchNorm\"\n  bottom: \"mixed_5/tower_1_conv_3_conv2d\"\n  top: \"mixed_5/tower_1_conv_3_conv2d_bn\"\n  batch_norm_param {\n    use_global_stats: false\n    eps: 0.001\n  }\n  param {\n    lr_mult: 0\n  }\n  param {\n    lr_mult: 0\n  }\n  param {\n    lr_mult: 0\n  }\n}\nlayer {\n  name: \"mixed_5/tower_1_conv_3_conv2d_relu\"\n  type: \"ReLU\"\n  bottom: \"mixed_5/tower_1_conv_3_conv2d_bn\"\n  top: \"mixed_5/tower_1_conv_3_conv2d_bn\"\n}\nlayer {\n  name: \"mixed_5/tower_1_conv_4_conv2d\"\n  type: \"Convolution\"\n  bottom: \"mixed_5/tower_1_conv_3_conv2d_bn\"\n  top: \"mixed_5/tower_1_conv_4_conv2d\"\n  convolution_param {\n    bias_term: false\n    num_output: 192\n    pad_h: 0\npad_w: 3\n    kernel_h: 1\nkernel_w: 7\n    stride: 1\n    weight_filler {\n        type: \"xavier\"\n    }\n  }\n\n}\nlayer {\n  name: \"mixed_5/tower_1_conv_4_conv2d_bn\"\n  type: \"BatchNorm\"\n  bottom: \"mixed_5/tower_1_conv_4_conv2d\"\n  top: \"mixed_5/tower_1_conv_4_conv2d_bn\"\n  batch_norm_param {\n    use_global_stats: false\n    eps: 0.001\n  }\n  param {\n    lr_mult: 0\n  }\n  param {\n    lr_mult: 0\n  }\n  param {\n    lr_mult: 0\n  }\n}\nlayer {\n  name: \"mixed_5/tower_1_conv_4_conv2d_relu\"\n  type: \"ReLU\"\n  bottom: \"mixed_5/tower_1_conv_4_conv2d_bn\"\n  top: \"mixed_5/tower_1_conv_4_conv2d_bn\"\n}\nlayer {\n  name: \"mixed_5/tower_2_AVG_pool\"\n  type: \"Pooling\"\n  bottom: \"mixed_4/chconcat\"\n  top: \"mixed_5/tower_2_AVG_pool\"\n  pooling_param {\n    pool: AVE\n    pad: 1\n    kernel_size: 3\n    stride: 1\n  }\n}\nlayer {\n  name: \"mixed_5/tower_2_conv_conv2d\"\n  type: \"Convolution\"\n  bottom: \"mixed_5/tower_2_AVG_pool\"\n  top: \"mixed_5/tower_2_conv_conv2d\"\n  convolution_param {\n    bias_term: false\n    num_output: 192\n    pad: 0\n    kernel_size: 1\n    stride: 1\n    weight_filler {\n        type: \"xavier\"\n    }\n  }\n\n}\nlayer {\n  name: \"mixed_5/tower_2_conv_conv2d_bn\"\n  type: \"BatchNorm\"\n  bottom: \"mixed_5/tower_2_conv_conv2d\"\n  top: \"mixed_5/tower_2_conv_conv2d_bn\"\n  batch_norm_param {\n    use_global_stats: false\n    eps: 0.001\n  }\n  param {\n    lr_mult: 0\n  }\n  param {\n    lr_mult: 0\n  }\n  param {\n    lr_mult: 0\n  }\n}\nlayer {\n  name: \"mixed_5/tower_2_conv_conv2d_relu\"\n  type: \"ReLU\"\n  bottom: \"mixed_5/tower_2_conv_conv2d_bn\"\n  top: \"mixed_5/tower_2_conv_conv2d_bn\"\n}\nlayer {\n  name: \"mixed_5/chconcat\"\n  bottom: \"mixed_5/conv_conv2d_bn\"\nbottom: \"mixed_5/tower_conv_2_conv2d_bn\"\nbottom: \"mixed_5/tower_1_conv_4_conv2d_bn\"\nbottom: \"mixed_5/tower_2_conv_conv2d_bn\"\n\n  top: \"mixed_5/chconcat\"\n  type: \"Concat\"\n  concat_param {\n    axis: 1\n  }\n}\nlayer {\n  name: \"mixed_6/conv_conv2d\"\n  type: \"Convolution\"\n  bottom: \"mixed_5/chconcat\"\n  top: \"mixed_6/conv_conv2d\"\n  convolution_param {\n    bias_term: false\n    num_output: 192\n    pad: 0\n    kernel_size: 1\n    stride: 1\n    weight_filler {\n        type: \"xavier\"\n    }\n  }\n\n}\nlayer {\n  name: \"mixed_6/conv_conv2d_bn\"\n  type: \"BatchNorm\"\n  bottom: \"mixed_6/conv_conv2d\"\n  top: \"mixed_6/conv_conv2d_bn\"\n  batch_norm_param {\n    use_global_stats: false\n    eps: 0.001\n  }\n  param {\n    lr_mult: 0\n  }\n  param {\n    lr_mult: 0\n  }\n  param {\n    lr_mult: 0\n  }\n}\nlayer {\n  name: \"mixed_6/conv_conv2d_relu\"\n  type: \"ReLU\"\n  bottom: \"mixed_6/conv_conv2d_bn\"\n  top: \"mixed_6/conv_conv2d_bn\"\n}\nlayer {\n  name: \"mixed_6/tower_conv_conv2d\"\n  type: \"Convolution\"\n  bottom: \"mixed_5/chconcat\"\n  top: \"mixed_6/tower_conv_conv2d\"\n  convolution_param {\n    bias_term: false\n    num_output: 160\n    pad: 0\n    kernel_size: 1\n    stride: 1\n    weight_filler {\n        type: \"xavier\"\n    }\n  }\n\n}\nlayer {\n  name: \"mixed_6/tower_conv_conv2d_bn\"\n  type: \"BatchNorm\"\n  bottom: \"mixed_6/tower_conv_conv2d\"\n  top: \"mixed_6/tower_conv_conv2d_bn\"\n  batch_norm_param {\n    use_global_stats: false\n    eps: 0.001\n  }\n  param {\n    lr_mult: 0\n  }\n  param {\n    lr_mult: 0\n  }\n  param {\n    lr_mult: 0\n  }\n}\nlayer {\n  name: \"mixed_6/tower_conv_conv2d_relu\"\n  type: \"ReLU\"\n  bottom: \"mixed_6/tower_conv_conv2d_bn\"\n  top: \"mixed_6/tower_conv_conv2d_bn\"\n}\nlayer {\n  name: \"mixed_6/tower_conv_1_conv2d\"\n  type: \"Convolution\"\n  bottom: \"mixed_6/tower_conv_conv2d_bn\"\n  top: \"mixed_6/tower_conv_1_conv2d\"\n  convolution_param {\n    bias_term: false\n    num_output: 160\n    pad_h: 0\npad_w: 3\n    kernel_h: 1\nkernel_w: 7\n    stride: 1\n    weight_filler {\n        type: \"xavier\"\n    }\n  }\n\n}\nlayer {\n  name: \"mixed_6/tower_conv_1_conv2d_bn\"\n  type: \"BatchNorm\"\n  bottom: \"mixed_6/tower_conv_1_conv2d\"\n  top: \"mixed_6/tower_conv_1_conv2d_bn\"\n  batch_norm_param {\n    use_global_stats: false\n    eps: 0.001\n  }\n  param {\n    lr_mult: 0\n  }\n  param {\n    lr_mult: 0\n  }\n  param {\n    lr_mult: 0\n  }\n}\nlayer {\n  name: \"mixed_6/tower_conv_1_conv2d_relu\"\n  type: \"ReLU\"\n  bottom: \"mixed_6/tower_conv_1_conv2d_bn\"\n  top: \"mixed_6/tower_conv_1_conv2d_bn\"\n}\nlayer {\n  name: \"mixed_6/tower_conv_2_conv2d\"\n  type: \"Convolution\"\n  bottom: \"mixed_6/tower_conv_1_conv2d_bn\"\n  top: \"mixed_6/tower_conv_2_conv2d\"\n  convolution_param {\n    bias_term: false\n    num_output: 192\n    pad_h: 3\npad_w: 0\n    kernel_h: 7\nkernel_w: 1\n    stride: 1\n    weight_filler {\n        type: \"xavier\"\n    }\n  }\n\n}\nlayer {\n  name: \"mixed_6/tower_conv_2_conv2d_bn\"\n  type: \"BatchNorm\"\n  bottom: \"mixed_6/tower_conv_2_conv2d\"\n  top: \"mixed_6/tower_conv_2_conv2d_bn\"\n  batch_norm_param {\n    use_global_stats: false\n    eps: 0.001\n  }\n  param {\n    lr_mult: 0\n  }\n  param {\n    lr_mult: 0\n  }\n  param {\n    lr_mult: 0\n  }\n}\nlayer {\n  name: \"mixed_6/tower_conv_2_conv2d_relu\"\n  type: \"ReLU\"\n  bottom: \"mixed_6/tower_conv_2_conv2d_bn\"\n  top: \"mixed_6/tower_conv_2_conv2d_bn\"\n}\nlayer {\n  name: \"mixed_6/tower_1_conv_conv2d\"\n  type: \"Convolution\"\n  bottom: \"mixed_5/chconcat\"\n  top: \"mixed_6/tower_1_conv_conv2d\"\n  convolution_param {\n    bias_term: false\n    num_output: 160\n    pad: 0\n    kernel_size: 1\n    stride: 1\n    weight_filler {\n        type: \"xavier\"\n    }\n  }\n\n}\nlayer {\n  name: \"mixed_6/tower_1_conv_conv2d_bn\"\n  type: \"BatchNorm\"\n  bottom: \"mixed_6/tower_1_conv_conv2d\"\n  top: \"mixed_6/tower_1_conv_conv2d_bn\"\n  batch_norm_param {\n    use_global_stats: false\n    eps: 0.001\n  }\n  param {\n    lr_mult: 0\n  }\n  param {\n    lr_mult: 0\n  }\n  param {\n    lr_mult: 0\n  }\n}\nlayer {\n  name: \"mixed_6/tower_1_conv_conv2d_relu\"\n  type: \"ReLU\"\n  bottom: \"mixed_6/tower_1_conv_conv2d_bn\"\n  top: \"mixed_6/tower_1_conv_conv2d_bn\"\n}\nlayer {\n  name: \"mixed_6/tower_1_conv_1_conv2d\"\n  type: \"Convolution\"\n  bottom: \"mixed_6/tower_1_conv_conv2d_bn\"\n  top: \"mixed_6/tower_1_conv_1_conv2d\"\n  convolution_param {\n    bias_term: false\n    num_output: 160\n    pad_h: 3\npad_w: 0\n    kernel_h: 7\nkernel_w: 1\n    stride: 1\n    weight_filler {\n        type: \"xavier\"\n    }\n  }\n\n}\nlayer {\n  name: \"mixed_6/tower_1_conv_1_conv2d_bn\"\n  type: \"BatchNorm\"\n  bottom: \"mixed_6/tower_1_conv_1_conv2d\"\n  top: \"mixed_6/tower_1_conv_1_conv2d_bn\"\n  batch_norm_param {\n    use_global_stats: false\n    eps: 0.001\n  }\n  param {\n    lr_mult: 0\n  }\n  param {\n    lr_mult: 0\n  }\n  param {\n    lr_mult: 0\n  }\n}\nlayer {\n  name: \"mixed_6/tower_1_conv_1_conv2d_relu\"\n  type: \"ReLU\"\n  bottom: \"mixed_6/tower_1_conv_1_conv2d_bn\"\n  top: \"mixed_6/tower_1_conv_1_conv2d_bn\"\n}\nlayer {\n  name: \"mixed_6/tower_1_conv_2_conv2d\"\n  type: \"Convolution\"\n  bottom: \"mixed_6/tower_1_conv_1_conv2d_bn\"\n  top: \"mixed_6/tower_1_conv_2_conv2d\"\n  convolution_param {\n    bias_term: false\n    num_output: 160\n    pad_h: 0\npad_w: 3\n    kernel_h: 1\nkernel_w: 7\n    stride: 1\n    weight_filler {\n        type: \"xavier\"\n    }\n  }\n\n}\nlayer {\n  name: \"mixed_6/tower_1_conv_2_conv2d_bn\"\n  type: \"BatchNorm\"\n  bottom: \"mixed_6/tower_1_conv_2_conv2d\"\n  top: \"mixed_6/tower_1_conv_2_conv2d_bn\"\n  batch_norm_param {\n    use_global_stats: false\n    eps: 0.001\n  }\n  param {\n    lr_mult: 0\n  }\n  param {\n    lr_mult: 0\n  }\n  param {\n    lr_mult: 0\n  }\n}\nlayer {\n  name: \"mixed_6/tower_1_conv_2_conv2d_relu\"\n  type: \"ReLU\"\n  bottom: \"mixed_6/tower_1_conv_2_conv2d_bn\"\n  top: \"mixed_6/tower_1_conv_2_conv2d_bn\"\n}\nlayer {\n  name: \"mixed_6/tower_1_conv_3_conv2d\"\n  type: \"Convolution\"\n  bottom: \"mixed_6/tower_1_conv_2_conv2d_bn\"\n  top: \"mixed_6/tower_1_conv_3_conv2d\"\n  convolution_param {\n    bias_term: false\n    num_output: 160\n    pad_h: 3\npad_w: 0\n    kernel_h: 7\nkernel_w: 1\n    stride: 1\n    weight_filler {\n        type: \"xavier\"\n    }\n  }\n\n}\nlayer {\n  name: \"mixed_6/tower_1_conv_3_conv2d_bn\"\n  type: \"BatchNorm\"\n  bottom: \"mixed_6/tower_1_conv_3_conv2d\"\n  top: \"mixed_6/tower_1_conv_3_conv2d_bn\"\n  batch_norm_param {\n    use_global_stats: false\n    eps: 0.001\n  }\n  param {\n    lr_mult: 0\n  }\n  param {\n    lr_mult: 0\n  }\n  param {\n    lr_mult: 0\n  }\n}\nlayer {\n  name: \"mixed_6/tower_1_conv_3_conv2d_relu\"\n  type: \"ReLU\"\n  bottom: \"mixed_6/tower_1_conv_3_conv2d_bn\"\n  top: \"mixed_6/tower_1_conv_3_conv2d_bn\"\n}\nlayer {\n  name: \"mixed_6/tower_1_conv_4_conv2d\"\n  type: \"Convolution\"\n  bottom: \"mixed_6/tower_1_conv_3_conv2d_bn\"\n  top: \"mixed_6/tower_1_conv_4_conv2d\"\n  convolution_param {\n    bias_term: false\n    num_output: 192\n    pad_h: 0\npad_w: 3\n    kernel_h: 1\nkernel_w: 7\n    stride: 1\n    weight_filler {\n        type: \"xavier\"\n    }\n  }\n\n}\nlayer {\n  name: \"mixed_6/tower_1_conv_4_conv2d_bn\"\n  type: \"BatchNorm\"\n  bottom: \"mixed_6/tower_1_conv_4_conv2d\"\n  top: \"mixed_6/tower_1_conv_4_conv2d_bn\"\n  batch_norm_param {\n    use_global_stats: false\n    eps: 0.001\n  }\n  param {\n    lr_mult: 0\n  }\n  param {\n    lr_mult: 0\n  }\n  param {\n    lr_mult: 0\n  }\n}\nlayer {\n  name: \"mixed_6/tower_1_conv_4_conv2d_relu\"\n  type: \"ReLU\"\n  bottom: \"mixed_6/tower_1_conv_4_conv2d_bn\"\n  top: \"mixed_6/tower_1_conv_4_conv2d_bn\"\n}\nlayer {\n  name: \"mixed_6/tower_2_AVG_pool\"\n  type: \"Pooling\"\n  bottom: \"mixed_5/chconcat\"\n  top: \"mixed_6/tower_2_AVG_pool\"\n  pooling_param {\n    pool: AVE\n    pad: 1\n    kernel_size: 3\n    stride: 1\n  }\n}\nlayer {\n  name: \"mixed_6/tower_2_conv_conv2d\"\n  type: \"Convolution\"\n  bottom: \"mixed_6/tower_2_AVG_pool\"\n  top: \"mixed_6/tower_2_conv_conv2d\"\n  convolution_param {\n    bias_term: false\n    num_output: 192\n    pad: 0\n    kernel_size: 1\n    stride: 1\n    weight_filler {\n        type: \"xavier\"\n    }\n  }\n\n}\nlayer {\n  name: \"mixed_6/tower_2_conv_conv2d_bn\"\n  type: \"BatchNorm\"\n  bottom: \"mixed_6/tower_2_conv_conv2d\"\n  top: \"mixed_6/tower_2_conv_conv2d_bn\"\n  batch_norm_param {\n    use_global_stats: false\n    eps: 0.001\n  }\n  param {\n    lr_mult: 0\n  }\n  param {\n    lr_mult: 0\n  }\n  param {\n    lr_mult: 0\n  }\n}\nlayer {\n  name: \"mixed_6/tower_2_conv_conv2d_relu\"\n  type: \"ReLU\"\n  bottom: \"mixed_6/tower_2_conv_conv2d_bn\"\n  top: \"mixed_6/tower_2_conv_conv2d_bn\"\n}\nlayer {\n  name: \"mixed_6/chconcat\"\n  bottom: \"mixed_6/conv_conv2d_bn\"\nbottom: \"mixed_6/tower_conv_2_conv2d_bn\"\nbottom: \"mixed_6/tower_1_conv_4_conv2d_bn\"\nbottom: \"mixed_6/tower_2_conv_conv2d_bn\"\n\n  top: \"mixed_6/chconcat\"\n  type: \"Concat\"\n  concat_param {\n    axis: 1\n  }\n}\nlayer {\n  name: \"mixed_7/conv_conv2d\"\n  type: \"Convolution\"\n  bottom: \"mixed_6/chconcat\"\n  top: \"mixed_7/conv_conv2d\"\n  convolution_param {\n    bias_term: false\n    num_output: 192\n    pad: 0\n    kernel_size: 1\n    stride: 1\n    weight_filler {\n        type: \"xavier\"\n    }\n  }\n\n}\nlayer {\n  name: \"mixed_7/conv_conv2d_bn\"\n  type: \"BatchNorm\"\n  bottom: \"mixed_7/conv_conv2d\"\n  top: \"mixed_7/conv_conv2d_bn\"\n  batch_norm_param {\n    use_global_stats: false\n    eps: 0.001\n  }\n  param {\n    lr_mult: 0\n  }\n  param {\n    lr_mult: 0\n  }\n  param {\n    lr_mult: 0\n  }\n}\nlayer {\n  name: \"mixed_7/conv_conv2d_relu\"\n  type: \"ReLU\"\n  bottom: \"mixed_7/conv_conv2d_bn\"\n  top: \"mixed_7/conv_conv2d_bn\"\n}\nlayer {\n  name: \"mixed_7/tower_conv_conv2d\"\n  type: \"Convolution\"\n  bottom: \"mixed_6/chconcat\"\n  top: \"mixed_7/tower_conv_conv2d\"\n  convolution_param {\n    bias_term: false\n    num_output: 192\n    pad: 0\n    kernel_size: 1\n    stride: 1\n    weight_filler {\n        type: \"xavier\"\n    }\n  }\n\n}\nlayer {\n  name: \"mixed_7/tower_conv_conv2d_bn\"\n  type: \"BatchNorm\"\n  bottom: \"mixed_7/tower_conv_conv2d\"\n  top: \"mixed_7/tower_conv_conv2d_bn\"\n  batch_norm_param {\n    use_global_stats: false\n    eps: 0.001\n  }\n  param {\n    lr_mult: 0\n  }\n  param {\n    lr_mult: 0\n  }\n  param {\n    lr_mult: 0\n  }\n}\nlayer {\n  name: \"mixed_7/tower_conv_conv2d_relu\"\n  type: \"ReLU\"\n  bottom: \"mixed_7/tower_conv_conv2d_bn\"\n  top: \"mixed_7/tower_conv_conv2d_bn\"\n}\nlayer {\n  name: \"mixed_7/tower_conv_1_conv2d\"\n  type: \"Convolution\"\n  bottom: \"mixed_7/tower_conv_conv2d_bn\"\n  top: \"mixed_7/tower_conv_1_conv2d\"\n  convolution_param {\n    bias_term: false\n    num_output: 192\n    pad_h: 0\npad_w: 3\n    kernel_h: 1\nkernel_w: 7\n    stride: 1\n    weight_filler {\n        type: \"xavier\"\n    }\n  }\n\n}\nlayer {\n  name: \"mixed_7/tower_conv_1_conv2d_bn\"\n  type: \"BatchNorm\"\n  bottom: \"mixed_7/tower_conv_1_conv2d\"\n  top: \"mixed_7/tower_conv_1_conv2d_bn\"\n  batch_norm_param {\n    use_global_stats: false\n    eps: 0.001\n  }\n  param {\n    lr_mult: 0\n  }\n  param {\n    lr_mult: 0\n  }\n  param {\n    lr_mult: 0\n  }\n}\nlayer {\n  name: \"mixed_7/tower_conv_1_conv2d_relu\"\n  type: \"ReLU\"\n  bottom: \"mixed_7/tower_conv_1_conv2d_bn\"\n  top: \"mixed_7/tower_conv_1_conv2d_bn\"\n}\nlayer {\n  name: \"mixed_7/tower_conv_2_conv2d\"\n  type: \"Convolution\"\n  bottom: \"mixed_7/tower_conv_1_conv2d_bn\"\n  top: \"mixed_7/tower_conv_2_conv2d\"\n  convolution_param {\n    bias_term: false\n    num_output: 192\n    pad_h: 3\npad_w: 0\n    kernel_h: 7\nkernel_w: 1\n    stride: 1\n    weight_filler {\n        type: \"xavier\"\n    }\n  }\n\n}\nlayer {\n  name: \"mixed_7/tower_conv_2_conv2d_bn\"\n  type: \"BatchNorm\"\n  bottom: \"mixed_7/tower_conv_2_conv2d\"\n  top: \"mixed_7/tower_conv_2_conv2d_bn\"\n  batch_norm_param {\n    use_global_stats: false\n    eps: 0.001\n  }\n  param {\n    lr_mult: 0\n  }\n  param {\n    lr_mult: 0\n  }\n  param {\n    lr_mult: 0\n  }\n}\nlayer {\n  name: \"mixed_7/tower_conv_2_conv2d_relu\"\n  type: \"ReLU\"\n  bottom: \"mixed_7/tower_conv_2_conv2d_bn\"\n  top: \"mixed_7/tower_conv_2_conv2d_bn\"\n}\nlayer {\n  name: \"mixed_7/tower_1_conv_conv2d\"\n  type: \"Convolution\"\n  bottom: \"mixed_6/chconcat\"\n  top: \"mixed_7/tower_1_conv_conv2d\"\n  convolution_param {\n    bias_term: false\n    num_output: 192\n    pad: 0\n    kernel_size: 1\n    stride: 1\n    weight_filler {\n        type: \"xavier\"\n    }\n  }\n\n}\nlayer {\n  name: \"mixed_7/tower_1_conv_conv2d_bn\"\n  type: \"BatchNorm\"\n  bottom: \"mixed_7/tower_1_conv_conv2d\"\n  top: \"mixed_7/tower_1_conv_conv2d_bn\"\n  batch_norm_param {\n    use_global_stats: false\n    eps: 0.001\n  }\n  param {\n    lr_mult: 0\n  }\n  param {\n    lr_mult: 0\n  }\n  param {\n    lr_mult: 0\n  }\n}\nlayer {\n  name: \"mixed_7/tower_1_conv_conv2d_relu\"\n  type: \"ReLU\"\n  bottom: \"mixed_7/tower_1_conv_conv2d_bn\"\n  top: \"mixed_7/tower_1_conv_conv2d_bn\"\n}\nlayer {\n  name: \"mixed_7/tower_1_conv_1_conv2d\"\n  type: \"Convolution\"\n  bottom: \"mixed_7/tower_1_conv_conv2d_bn\"\n  top: \"mixed_7/tower_1_conv_1_conv2d\"\n  convolution_param {\n    bias_term: false\n    num_output: 192\n    pad_h: 3\npad_w: 0\n    kernel_h: 7\nkernel_w: 1\n    stride: 1\n    weight_filler {\n        type: \"xavier\"\n    }\n  }\n\n}\nlayer {\n  name: \"mixed_7/tower_1_conv_1_conv2d_bn\"\n  type: \"BatchNorm\"\n  bottom: \"mixed_7/tower_1_conv_1_conv2d\"\n  top: \"mixed_7/tower_1_conv_1_conv2d_bn\"\n  batch_norm_param {\n    use_global_stats: false\n    eps: 0.001\n  }\n  param {\n    lr_mult: 0\n  }\n  param {\n    lr_mult: 0\n  }\n  param {\n    lr_mult: 0\n  }\n}\nlayer {\n  name: \"mixed_7/tower_1_conv_1_conv2d_relu\"\n  type: \"ReLU\"\n  bottom: \"mixed_7/tower_1_conv_1_conv2d_bn\"\n  top: \"mixed_7/tower_1_conv_1_conv2d_bn\"\n}\nlayer {\n  name: \"mixed_7/tower_1_conv_2_conv2d\"\n  type: \"Convolution\"\n  bottom: \"mixed_7/tower_1_conv_1_conv2d_bn\"\n  top: \"mixed_7/tower_1_conv_2_conv2d\"\n  convolution_param {\n    bias_term: false\n    num_output: 192\n    pad_h: 0\npad_w: 3\n    kernel_h: 1\nkernel_w: 7\n    stride: 1\n    weight_filler {\n        type: \"xavier\"\n    }\n  }\n\n}\nlayer {\n  name: \"mixed_7/tower_1_conv_2_conv2d_bn\"\n  type: \"BatchNorm\"\n  bottom: \"mixed_7/tower_1_conv_2_conv2d\"\n  top: \"mixed_7/tower_1_conv_2_conv2d_bn\"\n  batch_norm_param {\n    use_global_stats: false\n    eps: 0.001\n  }\n  param {\n    lr_mult: 0\n  }\n  param {\n    lr_mult: 0\n  }\n  param {\n    lr_mult: 0\n  }\n}\nlayer {\n  name: \"mixed_7/tower_1_conv_2_conv2d_relu\"\n  type: \"ReLU\"\n  bottom: \"mixed_7/tower_1_conv_2_conv2d_bn\"\n  top: \"mixed_7/tower_1_conv_2_conv2d_bn\"\n}\nlayer {\n  name: \"mixed_7/tower_1_conv_3_conv2d\"\n  type: \"Convolution\"\n  bottom: \"mixed_7/tower_1_conv_2_conv2d_bn\"\n  top: \"mixed_7/tower_1_conv_3_conv2d\"\n  convolution_param {\n    bias_term: false\n    num_output: 192\n    pad_h: 3\npad_w: 0\n    kernel_h: 7\nkernel_w: 1\n    stride: 1\n    weight_filler {\n        type: \"xavier\"\n    }\n  }\n\n}\nlayer {\n  name: \"mixed_7/tower_1_conv_3_conv2d_bn\"\n  type: \"BatchNorm\"\n  bottom: \"mixed_7/tower_1_conv_3_conv2d\"\n  top: \"mixed_7/tower_1_conv_3_conv2d_bn\"\n  batch_norm_param {\n    use_global_stats: false\n    eps: 0.001\n  }\n  param {\n    lr_mult: 0\n  }\n  param {\n    lr_mult: 0\n  }\n  param {\n    lr_mult: 0\n  }\n}\nlayer {\n  name: \"mixed_7/tower_1_conv_3_conv2d_relu\"\n  type: \"ReLU\"\n  bottom: \"mixed_7/tower_1_conv_3_conv2d_bn\"\n  top: \"mixed_7/tower_1_conv_3_conv2d_bn\"\n}\nlayer {\n  name: \"mixed_7/tower_1_conv_4_conv2d\"\n  type: \"Convolution\"\n  bottom: \"mixed_7/tower_1_conv_3_conv2d_bn\"\n  top: \"mixed_7/tower_1_conv_4_conv2d\"\n  convolution_param {\n    bias_term: false\n    num_output: 192\n    pad_h: 0\npad_w: 3\n    kernel_h: 1\nkernel_w: 7\n    stride: 1\n    weight_filler {\n        type: \"xavier\"\n    }\n  }\n\n}\nlayer {\n  name: \"mixed_7/tower_1_conv_4_conv2d_bn\"\n  type: \"BatchNorm\"\n  bottom: \"mixed_7/tower_1_conv_4_conv2d\"\n  top: \"mixed_7/tower_1_conv_4_conv2d_bn\"\n  batch_norm_param {\n    use_global_stats: false\n    eps: 0.001\n  }\n  param {\n    lr_mult: 0\n  }\n  param {\n    lr_mult: 0\n  }\n  param {\n    lr_mult: 0\n  }\n}\nlayer {\n  name: \"mixed_7/tower_1_conv_4_conv2d_relu\"\n  type: \"ReLU\"\n  bottom: \"mixed_7/tower_1_conv_4_conv2d_bn\"\n  top: \"mixed_7/tower_1_conv_4_conv2d_bn\"\n}\nlayer {\n  name: \"mixed_7/tower_2_AVG_pool\"\n  type: \"Pooling\"\n  bottom: \"mixed_6/chconcat\"\n  top: \"mixed_7/tower_2_AVG_pool\"\n  pooling_param {\n    pool: AVE\n    pad: 1\n    kernel_size: 3\n    stride: 1\n  }\n}\nlayer {\n  name: \"mixed_7/tower_2_conv_conv2d\"\n  type: \"Convolution\"\n  bottom: \"mixed_7/tower_2_AVG_pool\"\n  top: \"mixed_7/tower_2_conv_conv2d\"\n  convolution_param {\n    bias_term: false\n    num_output: 192\n    pad: 0\n    kernel_size: 1\n    stride: 1\n    weight_filler {\n        type: \"xavier\"\n    }\n  }\n\n}\nlayer {\n  name: \"mixed_7/tower_2_conv_conv2d_bn\"\n  type: \"BatchNorm\"\n  bottom: \"mixed_7/tower_2_conv_conv2d\"\n  top: \"mixed_7/tower_2_conv_conv2d_bn\"\n  batch_norm_param {\n    use_global_stats: false\n    eps: 0.001\n  }\n  param {\n    lr_mult: 0\n  }\n  param {\n    lr_mult: 0\n  }\n  param {\n    lr_mult: 0\n  }\n}\nlayer {\n  name: \"mixed_7/tower_2_conv_conv2d_relu\"\n  type: \"ReLU\"\n  bottom: \"mixed_7/tower_2_conv_conv2d_bn\"\n  top: \"mixed_7/tower_2_conv_conv2d_bn\"\n}\nlayer {\n  name: \"mixed_7/chconcat\"\n  bottom: \"mixed_7/conv_conv2d_bn\"\nbottom: \"mixed_7/tower_conv_2_conv2d_bn\"\nbottom: \"mixed_7/tower_1_conv_4_conv2d_bn\"\nbottom: \"mixed_7/tower_2_conv_conv2d_bn\"\n\n  top: \"mixed_7/chconcat\"\n  type: \"Concat\"\n  concat_param {\n    axis: 1\n  }\n}\nlayer {\n  name: \"mixed_8/tower_conv_conv2d\"\n  type: \"Convolution\"\n  bottom: \"mixed_7/chconcat\"\n  top: \"mixed_8/tower_conv_conv2d\"\n  convolution_param {\n    bias_term: false\n    num_output: 192\n    pad: 0\n    kernel_size: 1\n    stride: 1\n    weight_filler {\n        type: \"xavier\"\n    }\n  }\n\n}\nlayer {\n  name: \"mixed_8/tower_conv_conv2d_bn\"\n  type: \"BatchNorm\"\n  bottom: \"mixed_8/tower_conv_conv2d\"\n  top: \"mixed_8/tower_conv_conv2d_bn\"\n  batch_norm_param {\n    use_global_stats: false\n    eps: 0.001\n  }\n  param {\n    lr_mult: 0\n  }\n  param {\n    lr_mult: 0\n  }\n  param {\n    lr_mult: 0\n  }\n}\nlayer {\n  name: \"mixed_8/tower_conv_conv2d_relu\"\n  type: \"ReLU\"\n  bottom: \"mixed_8/tower_conv_conv2d_bn\"\n  top: \"mixed_8/tower_conv_conv2d_bn\"\n}\nlayer {\n  name: \"mixed_8/tower_conv_1_conv2d\"\n  type: \"Convolution\"\n  bottom: \"mixed_8/tower_conv_conv2d_bn\"\n  top: \"mixed_8/tower_conv_1_conv2d\"\n  convolution_param {\n    bias_term: false\n    num_output: 320\n    pad: 0\n    kernel_size: 3\n    stride: 2\n    weight_filler {\n        type: \"xavier\"\n    }\n  }\n\n}\nlayer {\n  name: \"mixed_8/tower_conv_1_conv2d_bn\"\n  type: \"BatchNorm\"\n  bottom: \"mixed_8/tower_conv_1_conv2d\"\n  top: \"mixed_8/tower_conv_1_conv2d_bn\"\n  batch_norm_param {\n    use_global_stats: false\n    eps: 0.001\n  }\n  param {\n    lr_mult: 0\n  }\n  param {\n    lr_mult: 0\n  }\n  param {\n    lr_mult: 0\n  }\n}\nlayer {\n  name: \"mixed_8/tower_conv_1_conv2d_relu\"\n  type: \"ReLU\"\n  bottom: \"mixed_8/tower_conv_1_conv2d_bn\"\n  top: \"mixed_8/tower_conv_1_conv2d_bn\"\n}\nlayer {\n  name: \"mixed_8/tower_1_conv_conv2d\"\n  type: \"Convolution\"\n  bottom: \"mixed_7/chconcat\"\n  top: \"mixed_8/tower_1_conv_conv2d\"\n  convolution_param {\n    bias_term: false\n    num_output: 192\n    pad: 0\n    kernel_size: 1\n    stride: 1\n    weight_filler {\n        type: \"xavier\"\n    }\n  }\n\n}\nlayer {\n  name: \"mixed_8/tower_1_conv_conv2d_bn\"\n  type: \"BatchNorm\"\n  bottom: \"mixed_8/tower_1_conv_conv2d\"\n  top: \"mixed_8/tower_1_conv_conv2d_bn\"\n  batch_norm_param {\n    use_global_stats: false\n    eps: 0.001\n  }\n  param {\n    lr_mult: 0\n  }\n  param {\n    lr_mult: 0\n  }\n  param {\n    lr_mult: 0\n  }\n}\nlayer {\n  name: \"mixed_8/tower_1_conv_conv2d_relu\"\n  type: \"ReLU\"\n  bottom: \"mixed_8/tower_1_conv_conv2d_bn\"\n  top: \"mixed_8/tower_1_conv_conv2d_bn\"\n}\nlayer {\n  name: \"mixed_8/tower_1_conv_1_conv2d\"\n  type: \"Convolution\"\n  bottom: \"mixed_8/tower_1_conv_conv2d_bn\"\n  top: \"mixed_8/tower_1_conv_1_conv2d\"\n  convolution_param {\n    bias_term: false\n    num_output: 192\n    pad_h: 0\npad_w: 3\n    kernel_h: 1\nkernel_w: 7\n    stride: 1\n    weight_filler {\n        type: \"xavier\"\n    }\n  }\n\n}\nlayer {\n  name: \"mixed_8/tower_1_conv_1_conv2d_bn\"\n  type: \"BatchNorm\"\n  bottom: \"mixed_8/tower_1_conv_1_conv2d\"\n  top: \"mixed_8/tower_1_conv_1_conv2d_bn\"\n  batch_norm_param {\n    use_global_stats: false\n    eps: 0.001\n  }\n  param {\n    lr_mult: 0\n  }\n  param {\n    lr_mult: 0\n  }\n  param {\n    lr_mult: 0\n  }\n}\nlayer {\n  name: \"mixed_8/tower_1_conv_1_conv2d_relu\"\n  type: \"ReLU\"\n  bottom: \"mixed_8/tower_1_conv_1_conv2d_bn\"\n  top: \"mixed_8/tower_1_conv_1_conv2d_bn\"\n}\nlayer {\n  name: \"mixed_8/tower_1_conv_2_conv2d\"\n  type: \"Convolution\"\n  bottom: \"mixed_8/tower_1_conv_1_conv2d_bn\"\n  top: \"mixed_8/tower_1_conv_2_conv2d\"\n  convolution_param {\n    bias_term: false\n    num_output: 192\n    pad_h: 3\npad_w: 0\n    kernel_h: 7\nkernel_w: 1\n    stride: 1\n    weight_filler {\n        type: \"xavier\"\n    }\n  }\n\n}\nlayer {\n  name: \"mixed_8/tower_1_conv_2_conv2d_bn\"\n  type: \"BatchNorm\"\n  bottom: \"mixed_8/tower_1_conv_2_conv2d\"\n  top: \"mixed_8/tower_1_conv_2_conv2d_bn\"\n  batch_norm_param {\n    use_global_stats: false\n    eps: 0.001\n  }\n  param {\n    lr_mult: 0\n  }\n  param {\n    lr_mult: 0\n  }\n  param {\n    lr_mult: 0\n  }\n}\nlayer {\n  name: \"mixed_8/tower_1_conv_2_conv2d_relu\"\n  type: \"ReLU\"\n  bottom: \"mixed_8/tower_1_conv_2_conv2d_bn\"\n  top: \"mixed_8/tower_1_conv_2_conv2d_bn\"\n}\nlayer {\n  name: \"mixed_8/tower_1_conv_3_conv2d\"\n  type: \"Convolution\"\n  bottom: \"mixed_8/tower_1_conv_2_conv2d_bn\"\n  top: \"mixed_8/tower_1_conv_3_conv2d\"\n  convolution_param {\n    bias_term: false\n    num_output: 192\n    pad: 0\n    kernel_size: 3\n    stride: 2\n    weight_filler {\n        type: \"xavier\"\n    }\n  }\n\n}\nlayer {\n  name: \"mixed_8/tower_1_conv_3_conv2d_bn\"\n  type: \"BatchNorm\"\n  bottom: \"mixed_8/tower_1_conv_3_conv2d\"\n  top: \"mixed_8/tower_1_conv_3_conv2d_bn\"\n  batch_norm_param {\n    use_global_stats: false\n    eps: 0.001\n  }\n  param {\n    lr_mult: 0\n  }\n  param {\n    lr_mult: 0\n  }\n  param {\n    lr_mult: 0\n  }\n}\nlayer {\n  name: \"mixed_8/tower_1_conv_3_conv2d_relu\"\n  type: \"ReLU\"\n  bottom: \"mixed_8/tower_1_conv_3_conv2d_bn\"\n  top: \"mixed_8/tower_1_conv_3_conv2d_bn\"\n}\nlayer {\n  name: \"mixed_8/max_pool\"\n  type: \"Pooling\"\n  bottom: \"mixed_7/chconcat\"\n  top: \"mixed_8/max_pool\"\n  pooling_param {\n    pool: MAX\n    pad: 0\n    kernel_size: 3\n    stride: 2\n  }\n}\nlayer {\n  name: \"mixed_8/chconcat\"\n  bottom: \"mixed_8/tower_conv_1_conv2d_bn\"\nbottom: \"mixed_8/tower_1_conv_3_conv2d_bn\"\nbottom: \"mixed_8/max_pool\"\n\n  top: \"mixed_8/chconcat\"\n  type: \"Concat\"\n  concat_param {\n    axis: 1\n  }\n}\nlayer {\n  name: \"mixed_9/conv_conv2d\"\n  type: \"Convolution\"\n  bottom: \"mixed_8/chconcat\"\n  top: \"mixed_9/conv_conv2d\"\n  convolution_param {\n    bias_term: false\n    num_output: 320\n    pad: 0\n    kernel_h: 1\nkernel_w: 1\n    stride: 1\n    weight_filler {\n        type: \"xavier\"\n    }\n  }\n\n}\nlayer {\n  name: \"mixed_9/conv_conv2d_bn\"\n  type: \"BatchNorm\"\n  bottom: \"mixed_9/conv_conv2d\"\n  top: \"mixed_9/conv_conv2d_bn\"\n  batch_norm_param {\n    use_global_stats: false\n    eps: 0.001\n  }\n  param {\n    lr_mult: 0\n  }\n  param {\n    lr_mult: 0\n  }\n  param {\n    lr_mult: 0\n  }\n}\nlayer {\n  name: \"mixed_9/conv_conv2d_relu\"\n  type: \"ReLU\"\n  bottom: \"mixed_9/conv_conv2d_bn\"\n  top: \"mixed_9/conv_conv2d_bn\"\n}\nlayer {\n  name: \"mixed_9/tower_conv_conv2d\"\n  type: \"Convolution\"\n  bottom: \"mixed_8/chconcat\"\n  top: \"mixed_9/tower_conv_conv2d\"\n  convolution_param {\n    bias_term: false\n    num_output: 384\n    pad: 0\n    kernel_size: 1\n    stride: 1\n    weight_filler {\n        type: \"xavier\"\n    }\n  }\n\n}\nlayer {\n  name: \"mixed_9/tower_conv_conv2d_bn\"\n  type: \"BatchNorm\"\n  bottom: \"mixed_9/tower_conv_conv2d\"\n  top: \"mixed_9/tower_conv_conv2d_bn\"\n  batch_norm_param {\n    use_global_stats: false\n    eps: 0.001\n  }\n  param {\n    lr_mult: 0\n  }\n  param {\n    lr_mult: 0\n  }\n  param {\n    lr_mult: 0\n  }\n}\nlayer {\n  name: \"mixed_9/tower_conv_conv2d_relu\"\n  type: \"ReLU\"\n  bottom: \"mixed_9/tower_conv_conv2d_bn\"\n  top: \"mixed_9/tower_conv_conv2d_bn\"\n}\nlayer {\n  name: \"mixed_9/tower_mixed_conv/conv2d\"\n  type: \"Convolution\"\n  bottom: \"mixed_9/tower_conv_conv2d_bn\"\n  top: \"mixed_9/tower_mixed_conv/conv2d\"\n  convolution_param {\n    bias_term: false\n    num_output: 384\n    pad_h: 0\npad_w: 1\n    kernel_h: 1\nkernel_w: 3\n    stride: 1\n    weight_filler {\n        type: \"xavier\"\n    }\n  }\n\n}\nlayer {\n  name: \"mixed_9/tower_mixed_conv/conv2d_bn\"\n  type: \"BatchNorm\"\n  bottom: \"mixed_9/tower_mixed_conv/conv2d\"\n  top: \"mixed_9/tower_mixed_conv/conv2d_bn\"\n  batch_norm_param {\n    use_global_stats: false\n    eps: 0.001\n  }\n  param {\n    lr_mult: 0\n  }\n  param {\n    lr_mult: 0\n  }\n  param {\n    lr_mult: 0\n  }\n}\nlayer {\n  name: \"mixed_9/tower_mixed_conv/conv2d_relu\"\n  type: \"ReLU\"\n  bottom: \"mixed_9/tower_mixed_conv/conv2d_bn\"\n  top: \"mixed_9/tower_mixed_conv/conv2d_bn\"\n}\nlayer {\n  name: \"mixed_9/tower_mixed_conv/1_conv2d\"\n  type: \"Convolution\"\n  bottom: \"mixed_9/tower_conv_conv2d_bn\"\n  top: \"mixed_9/tower_mixed_conv/1_conv2d\"\n  convolution_param {\n    bias_term: false\n    num_output: 384\n    pad_h: 1\npad_w: 0\n    kernel_h: 3\nkernel_w: 1\n    stride: 1\n    weight_filler {\n        type: \"xavier\"\n    }\n  }\n\n}\nlayer {\n  name: \"mixed_9/tower_mixed_conv/1_conv2d_bn\"\n  type: \"BatchNorm\"\n  bottom: \"mixed_9/tower_mixed_conv/1_conv2d\"\n  top: \"mixed_9/tower_mixed_conv/1_conv2d_bn\"\n  batch_norm_param {\n    use_global_stats: false\n    eps: 0.001\n  }\n  param {\n    lr_mult: 0\n  }\n  param {\n    lr_mult: 0\n  }\n  param {\n    lr_mult: 0\n  }\n}\nlayer {\n  name: \"mixed_9/tower_mixed_conv/1_conv2d_relu\"\n  type: \"ReLU\"\n  bottom: \"mixed_9/tower_mixed_conv/1_conv2d_bn\"\n  top: \"mixed_9/tower_mixed_conv/1_conv2d_bn\"\n}\nlayer {\n  name: \"mixed_9/tower_1_conv_conv2d\"\n  type: \"Convolution\"\n  bottom: \"mixed_8/chconcat\"\n  top: \"mixed_9/tower_1_conv_conv2d\"\n  convolution_param {\n    bias_term: false\n    num_output: 448\n    pad: 0\n    kernel_size: 1\n    stride: 1\n    weight_filler {\n        type: \"xavier\"\n    }\n  }\n\n}\nlayer {\n  name: \"mixed_9/tower_1_conv_conv2d_bn\"\n  type: \"BatchNorm\"\n  bottom: \"mixed_9/tower_1_conv_conv2d\"\n  top: \"mixed_9/tower_1_conv_conv2d_bn\"\n  batch_norm_param {\n    use_global_stats: false\n    eps: 0.001\n  }\n  param {\n    lr_mult: 0\n  }\n  param {\n    lr_mult: 0\n  }\n  param {\n    lr_mult: 0\n  }\n}\nlayer {\n  name: \"mixed_9/tower_1_conv_conv2d_relu\"\n  type: \"ReLU\"\n  bottom: \"mixed_9/tower_1_conv_conv2d_bn\"\n  top: \"mixed_9/tower_1_conv_conv2d_bn\"\n}\nlayer {\n  name: \"mixed_9/tower_1_conv_1_conv2d\"\n  type: \"Convolution\"\n  bottom: \"mixed_9/tower_1_conv_conv2d_bn\"\n  top: \"mixed_9/tower_1_conv_1_conv2d\"\n  convolution_param {\n    bias_term: false\n    num_output: 384\n    pad: 1\n    kernel_size: 3\n    stride: 1\n    weight_filler {\n        type: \"xavier\"\n    }\n  }\n\n}\nlayer {\n  name: \"mixed_9/tower_1_conv_1_conv2d_bn\"\n  type: \"BatchNorm\"\n  bottom: \"mixed_9/tower_1_conv_1_conv2d\"\n  top: \"mixed_9/tower_1_conv_1_conv2d_bn\"\n  batch_norm_param {\n    use_global_stats: false\n    eps: 0.001\n  }\n  param {\n    lr_mult: 0\n  }\n  param {\n    lr_mult: 0\n  }\n  param {\n    lr_mult: 0\n  }\n}\nlayer {\n  name: \"mixed_9/tower_1_conv_1_conv2d_relu\"\n  type: \"ReLU\"\n  bottom: \"mixed_9/tower_1_conv_1_conv2d_bn\"\n  top: \"mixed_9/tower_1_conv_1_conv2d_bn\"\n}\nlayer {\n  name: \"mixed_9/tower_1_mixed_conv/conv2d\"\n  type: \"Convolution\"\n  bottom: \"mixed_9/tower_1_conv_1_conv2d_bn\"\n  top: \"mixed_9/tower_1_mixed_conv/conv2d\"\n  convolution_param {\n    bias_term: false\n    num_output: 384\n    pad_h: 0\npad_w: 1\n    kernel_h: 1\nkernel_w: 3\n    stride: 1\n    weight_filler {\n        type: \"xavier\"\n    }\n  }\n\n}\nlayer {\n  name: \"mixed_9/tower_1_mixed_conv/conv2d_bn\"\n  type: \"BatchNorm\"\n  bottom: \"mixed_9/tower_1_mixed_conv/conv2d\"\n  top: \"mixed_9/tower_1_mixed_conv/conv2d_bn\"\n  batch_norm_param {\n    use_global_stats: false\n    eps: 0.001\n  }\n  param {\n    lr_mult: 0\n  }\n  param {\n    lr_mult: 0\n  }\n  param {\n    lr_mult: 0\n  }\n}\nlayer {\n  name: \"mixed_9/tower_1_mixed_conv/conv2d_relu\"\n  type: \"ReLU\"\n  bottom: \"mixed_9/tower_1_mixed_conv/conv2d_bn\"\n  top: \"mixed_9/tower_1_mixed_conv/conv2d_bn\"\n}\nlayer {\n  name: \"mixed_9/tower_1_mixed_conv/1_conv2d\"\n  type: \"Convolution\"\n  bottom: \"mixed_9/tower_1_conv_1_conv2d_bn\"\n  top: \"mixed_9/tower_1_mixed_conv/1_conv2d\"\n  convolution_param {\n    bias_term: false\n    num_output: 384\n    pad_h: 1\npad_w: 0\n    kernel_h: 3\nkernel_w: 1\n    stride: 1\n    weight_filler {\n        type: \"xavier\"\n    }\n  }\n\n}\nlayer {\n  name: \"mixed_9/tower_1_mixed_conv/1_conv2d_bn\"\n  type: \"BatchNorm\"\n  bottom: \"mixed_9/tower_1_mixed_conv/1_conv2d\"\n  top: \"mixed_9/tower_1_mixed_conv/1_conv2d_bn\"\n  batch_norm_param {\n    use_global_stats: false\n    eps: 0.001\n  }\n  param {\n    lr_mult: 0\n  }\n  param {\n    lr_mult: 0\n  }\n  param {\n    lr_mult: 0\n  }\n}\nlayer {\n  name: \"mixed_9/tower_1_mixed_conv/1_conv2d_relu\"\n  type: \"ReLU\"\n  bottom: \"mixed_9/tower_1_mixed_conv/1_conv2d_bn\"\n  top: \"mixed_9/tower_1_mixed_conv/1_conv2d_bn\"\n}\nlayer {\n  name: \"mixed_9/tower_2_AVG_pool\"\n  type: \"Pooling\"\n  bottom: \"mixed_8/chconcat\"\n  top: \"mixed_9/tower_2_AVG_pool\"\n  pooling_param {\n    pool: AVE\n    pad: 1\n    kernel_size: 3\n    stride: 1\n  }\n}\nlayer {\n  name: \"mixed_9/tower_2_conv_conv2d\"\n  type: \"Convolution\"\n  bottom: \"mixed_9/tower_2_AVG_pool\"\n  top: \"mixed_9/tower_2_conv_conv2d\"\n  convolution_param {\n    bias_term: false\n    num_output: 192\n    pad: 0\n    kernel_size: 1\n    stride: 1\n    weight_filler {\n        type: \"xavier\"\n    }\n  }\n\n}\nlayer {\n  name: \"mixed_9/tower_2_conv_conv2d_bn\"\n  type: \"BatchNorm\"\n  bottom: \"mixed_9/tower_2_conv_conv2d\"\n  top: \"mixed_9/tower_2_conv_conv2d_bn\"\n  batch_norm_param {\n    use_global_stats: false\n    eps: 0.001\n  }\n  param {\n    lr_mult: 0\n  }\n  param {\n    lr_mult: 0\n  }\n  param {\n    lr_mult: 0\n  }\n}\nlayer {\n  name: \"mixed_9/tower_2_conv_conv2d_relu\"\n  type: \"ReLU\"\n  bottom: \"mixed_9/tower_2_conv_conv2d_bn\"\n  top: \"mixed_9/tower_2_conv_conv2d_bn\"\n}\nlayer {\n  name: \"mixed_9/chconcat\"\n  bottom: \"mixed_9/conv_conv2d_bn\"\nbottom: \"mixed_9/tower_mixed_conv/conv2d_bn\"\nbottom: \"mixed_9/tower_mixed_conv/1_conv2d_bn\"\nbottom: \"mixed_9/tower_1_mixed_conv/conv2d_bn\"\nbottom: \"mixed_9/tower_1_mixed_conv/1_conv2d_bn\"\nbottom: \"mixed_9/tower_2_conv_conv2d_bn\"\n\n  top: \"mixed_9/chconcat\"\n  type: \"Concat\"\n  concat_param {\n    axis: 1\n  }\n}\nlayer {\n  name: \"mixed_10/conv_conv2d\"\n  type: \"Convolution\"\n  bottom: \"mixed_9/chconcat\"\n  top: \"mixed_10/conv_conv2d\"\n  convolution_param {\n    bias_term: false\n    num_output: 320\n    pad: 0\n    kernel_h: 1\nkernel_w: 1\n    stride: 1\n    weight_filler {\n        type: \"xavier\"\n    }\n  }\n\n}\nlayer {\n  name: \"mixed_10/conv_conv2d_bn\"\n  type: \"BatchNorm\"\n  bottom: \"mixed_10/conv_conv2d\"\n  top: \"mixed_10/conv_conv2d_bn\"\n  batch_norm_param {\n    use_global_stats: false\n    eps: 0.001\n  }\n  param {\n    lr_mult: 0\n  }\n  param {\n    lr_mult: 0\n  }\n  param {\n    lr_mult: 0\n  }\n}\nlayer {\n  name: \"mixed_10/conv_conv2d_relu\"\n  type: \"ReLU\"\n  bottom: \"mixed_10/conv_conv2d_bn\"\n  top: \"mixed_10/conv_conv2d_bn\"\n}\nlayer {\n  name: \"mixed_10/tower_conv_conv2d\"\n  type: \"Convolution\"\n  bottom: \"mixed_9/chconcat\"\n  top: \"mixed_10/tower_conv_conv2d\"\n  convolution_param {\n    bias_term: false\n    num_output: 384\n    pad: 0\n    kernel_size: 1\n    stride: 1\n    weight_filler {\n        type: \"xavier\"\n    }\n  }\n\n}\nlayer {\n  name: \"mixed_10/tower_conv_conv2d_bn\"\n  type: \"BatchNorm\"\n  bottom: \"mixed_10/tower_conv_conv2d\"\n  top: \"mixed_10/tower_conv_conv2d_bn\"\n  batch_norm_param {\n    use_global_stats: false\n    eps: 0.001\n  }\n  param {\n    lr_mult: 0\n  }\n  param {\n    lr_mult: 0\n  }\n  param {\n    lr_mult: 0\n  }\n}\nlayer {\n  name: \"mixed_10/tower_conv_conv2d_relu\"\n  type: \"ReLU\"\n  bottom: \"mixed_10/tower_conv_conv2d_bn\"\n  top: \"mixed_10/tower_conv_conv2d_bn\"\n}\nlayer {\n  name: \"mixed_10/tower_mixed_conv/conv2d\"\n  type: \"Convolution\"\n  bottom: \"mixed_10/tower_conv_conv2d_bn\"\n  top: \"mixed_10/tower_mixed_conv/conv2d\"\n  convolution_param {\n    bias_term: false\n    num_output: 384\n    pad_h: 0\npad_w: 1\n    kernel_h: 1\nkernel_w: 3\n    stride: 1\n    weight_filler {\n        type: \"xavier\"\n    }\n  }\n\n}\nlayer {\n  name: \"mixed_10/tower_mixed_conv/conv2d_bn\"\n  type: \"BatchNorm\"\n  bottom: \"mixed_10/tower_mixed_conv/conv2d\"\n  top: \"mixed_10/tower_mixed_conv/conv2d_bn\"\n  batch_norm_param {\n    use_global_stats: false\n    eps: 0.001\n  }\n  param {\n    lr_mult: 0\n  }\n  param {\n    lr_mult: 0\n  }\n  param {\n    lr_mult: 0\n  }\n}\nlayer {\n  name: \"mixed_10/tower_mixed_conv/conv2d_relu\"\n  type: \"ReLU\"\n  bottom: \"mixed_10/tower_mixed_conv/conv2d_bn\"\n  top: \"mixed_10/tower_mixed_conv/conv2d_bn\"\n}\nlayer {\n  name: \"mixed_10/tower_mixed_conv/1_conv2d\"\n  type: \"Convolution\"\n  bottom: \"mixed_10/tower_conv_conv2d_bn\"\n  top: \"mixed_10/tower_mixed_conv/1_conv2d\"\n  convolution_param {\n    bias_term: false\n    num_output: 384\n    pad_h: 1\npad_w: 0\n    kernel_h: 3\nkernel_w: 1\n    stride: 1\n    weight_filler {\n        type: \"xavier\"\n    }\n  }\n\n}\nlayer {\n  name: \"mixed_10/tower_mixed_conv/1_conv2d_bn\"\n  type: \"BatchNorm\"\n  bottom: \"mixed_10/tower_mixed_conv/1_conv2d\"\n  top: \"mixed_10/tower_mixed_conv/1_conv2d_bn\"\n  batch_norm_param {\n    use_global_stats: false\n    eps: 0.001\n  }\n  param {\n    lr_mult: 0\n  }\n  param {\n    lr_mult: 0\n  }\n  param {\n    lr_mult: 0\n  }\n}\nlayer {\n  name: \"mixed_10/tower_mixed_conv/1_conv2d_relu\"\n  type: \"ReLU\"\n  bottom: \"mixed_10/tower_mixed_conv/1_conv2d_bn\"\n  top: \"mixed_10/tower_mixed_conv/1_conv2d_bn\"\n}\nlayer {\n  name: \"mixed_10/tower_1_conv_conv2d\"\n  type: \"Convolution\"\n  bottom: \"mixed_9/chconcat\"\n  top: \"mixed_10/tower_1_conv_conv2d\"\n  convolution_param {\n    bias_term: false\n    num_output: 448\n    pad: 0\n    kernel_size: 1\n    stride: 1\n    weight_filler {\n        type: \"xavier\"\n    }\n  }\n\n}\nlayer {\n  name: \"mixed_10/tower_1_conv_conv2d_bn\"\n  type: \"BatchNorm\"\n  bottom: \"mixed_10/tower_1_conv_conv2d\"\n  top: \"mixed_10/tower_1_conv_conv2d_bn\"\n  batch_norm_param {\n    use_global_stats: false\n    eps: 0.001\n  }\n  param {\n    lr_mult: 0\n  }\n  param {\n    lr_mult: 0\n  }\n  param {\n    lr_mult: 0\n  }\n}\nlayer {\n  name: \"mixed_10/tower_1_conv_conv2d_relu\"\n  type: \"ReLU\"\n  bottom: \"mixed_10/tower_1_conv_conv2d_bn\"\n  top: \"mixed_10/tower_1_conv_conv2d_bn\"\n}\nlayer {\n  name: \"mixed_10/tower_1_conv_1_conv2d\"\n  type: \"Convolution\"\n  bottom: \"mixed_10/tower_1_conv_conv2d_bn\"\n  top: \"mixed_10/tower_1_conv_1_conv2d\"\n  convolution_param {\n    bias_term: false\n    num_output: 384\n    pad: 1\n    kernel_size: 3\n    stride: 1\n    weight_filler {\n        type: \"xavier\"\n    }\n  }\n\n}\nlayer {\n  name: \"mixed_10/tower_1_conv_1_conv2d_bn\"\n  type: \"BatchNorm\"\n  bottom: \"mixed_10/tower_1_conv_1_conv2d\"\n  top: \"mixed_10/tower_1_conv_1_conv2d_bn\"\n  batch_norm_param {\n    use_global_stats: false\n    eps: 0.001\n  }\n  param {\n    lr_mult: 0\n  }\n  param {\n    lr_mult: 0\n  }\n  param {\n    lr_mult: 0\n  }\n}\nlayer {\n  name: \"mixed_10/tower_1_conv_1_conv2d_relu\"\n  type: \"ReLU\"\n  bottom: \"mixed_10/tower_1_conv_1_conv2d_bn\"\n  top: \"mixed_10/tower_1_conv_1_conv2d_bn\"\n}\nlayer {\n  name: \"mixed_10/tower_1_mixed_conv/conv2d\"\n  type: \"Convolution\"\n  bottom: \"mixed_10/tower_1_conv_1_conv2d_bn\"\n  top: \"mixed_10/tower_1_mixed_conv/conv2d\"\n  convolution_param {\n    bias_term: false\n    num_output: 384\n    pad_h: 0\npad_w: 1\n    kernel_h: 1\nkernel_w: 3\n    stride: 1\n    weight_filler {\n        type: \"xavier\"\n    }\n  }\n\n}\nlayer {\n  name: \"mixed_10/tower_1_mixed_conv/conv2d_bn\"\n  type: \"BatchNorm\"\n  bottom: \"mixed_10/tower_1_mixed_conv/conv2d\"\n  top: \"mixed_10/tower_1_mixed_conv/conv2d_bn\"\n  batch_norm_param {\n    use_global_stats: false\n    eps: 0.001\n  }\n  param {\n    lr_mult: 0\n  }\n  param {\n    lr_mult: 0\n  }\n  param {\n    lr_mult: 0\n  }\n}\nlayer {\n  name: \"mixed_10/tower_1_mixed_conv/conv2d_relu\"\n  type: \"ReLU\"\n  bottom: \"mixed_10/tower_1_mixed_conv/conv2d_bn\"\n  top: \"mixed_10/tower_1_mixed_conv/conv2d_bn\"\n}\nlayer {\n  name: \"mixed_10/tower_1_mixed_conv/1_conv2d\"\n  type: \"Convolution\"\n  bottom: \"mixed_10/tower_1_conv_1_conv2d_bn\"\n  top: \"mixed_10/tower_1_mixed_conv/1_conv2d\"\n  convolution_param {\n    bias_term: false\n    num_output: 384\n    pad_h: 1\npad_w: 0\n    kernel_h: 3\nkernel_w: 1\n    stride: 1\n    weight_filler {\n        type: \"xavier\"\n    }\n  }\n\n}\nlayer {\n  name: \"mixed_10/tower_1_mixed_conv/1_conv2d_bn\"\n  type: \"BatchNorm\"\n  bottom: \"mixed_10/tower_1_mixed_conv/1_conv2d\"\n  top: \"mixed_10/tower_1_mixed_conv/1_conv2d_bn\"\n  batch_norm_param {\n    use_global_stats: false\n    eps: 0.001\n  }\n  param {\n    lr_mult: 0\n  }\n  param {\n    lr_mult: 0\n  }\n  param {\n    lr_mult: 0\n  }\n}\nlayer {\n  name: \"mixed_10/tower_1_mixed_conv/1_conv2d_relu\"\n  type: \"ReLU\"\n  bottom: \"mixed_10/tower_1_mixed_conv/1_conv2d_bn\"\n  top: \"mixed_10/tower_1_mixed_conv/1_conv2d_bn\"\n}\nlayer {\n  name: \"mixed_10/max_pool\"\n  type: \"Pooling\"\n  bottom: \"mixed_9/chconcat\"\n  top: \"mixed_10/max_pool\"\n  pooling_param {\n    pool: MAX\n    pad: 1\n    kernel_size: 3\n    stride: 1\n  }\n}\nlayer {\n  name: \"mixed_10/tower_2_conv_conv2d\"\n  type: \"Convolution\"\n  bottom: \"mixed_10/max_pool\"\n  top: \"mixed_10/tower_2_conv_conv2d\"\n  convolution_param {\n    bias_term: false\n    num_output: 192\n    pad: 0\n    kernel_size: 1\n    stride: 1\n    weight_filler {\n        type: \"xavier\"\n    }\n  }\n\n}\nlayer {\n  name: \"mixed_10/tower_2_conv_conv2d_bn\"\n  type: \"BatchNorm\"\n  bottom: \"mixed_10/tower_2_conv_conv2d\"\n  top: \"mixed_10/tower_2_conv_conv2d_bn\"\n  batch_norm_param {\n    use_global_stats: false\n    eps: 0.001\n  }\n  param {\n    lr_mult: 0\n  }\n  param {\n    lr_mult: 0\n  }\n  param {\n    lr_mult: 0\n  }\n}\nlayer {\n  name: \"mixed_10/tower_2_conv_conv2d_relu\"\n  type: \"ReLU\"\n  bottom: \"mixed_10/tower_2_conv_conv2d_bn\"\n  top: \"mixed_10/tower_2_conv_conv2d_bn\"\n}\nlayer {\n  name: \"mixed_10/chconcat\"\n  bottom: \"mixed_10/conv_conv2d_bn\"\nbottom: \"mixed_10/tower_mixed_conv/conv2d_bn\"\nbottom: \"mixed_10/tower_mixed_conv/1_conv2d_bn\"\nbottom: \"mixed_10/tower_1_mixed_conv/conv2d_bn\"\nbottom: \"mixed_10/tower_1_mixed_conv/1_conv2d_bn\"\nbottom: \"mixed_10/tower_2_conv_conv2d_bn\"\n\n  top: \"mixed_10/chconcat\"\n  type: \"Concat\"\n  concat_param {\n    axis: 1\n  }\n}\nlayer {\n  name: \"global_pool\"\n  type: \"Pooling\"\n  bottom: \"mixed_10/chconcat\"\n  top: \"global_pool\"\n  pooling_param {\n    pool: AVE\n    pad: 0\n    kernel_size: 8\n    stride: 1\n  }\n}\nlayer {\n  name: \"flatten\"\n  type: \"Flatten\"\n  bottom: \"global_pool\"\n  top: \"flatten\"\n}\nlayer {\n  name: \"fc1\"\n  type: \"InnerProduct\"\n  bottom: \"flatten\"\n  top: \"fc1\"\n  param {\n    lr_mult: 1\n    decay_mult: 1\n  }\n  param {\n    lr_mult: 2\n    decay_mult: 0\n  }\n  inner_product_param {\n     num_output: 1000\n     weight_filler {\n       type: \"xavier\"\n     }\n     bias_filler {\n       type: \"constant\"\n       value: 0\n     }\n  }\n}\nlayer {\n  name: \"loss\"\n  type: \"SoftmaxWithLoss\"\n  bottom: \"fc1\"\n  top: \"loss\"\n}\nlayer {\n  name: \"acc/top-1\"\n  type: \"Accuracy\"\n  bottom: \"fc1\"\n  top: \"acc/top-1\"\n  include {\n    phase: TEST\n  }\n}\nlayer {\n  name: \"acc/top-5\"\n  type: \"Accuracy\"\n  bottom: \"fc1\"\n  top: \"acc/top-5\"\n  include {\n    phase: TEST\n  }\n  accuracy_param {\n    top_k: 5\n  }\n}"
  },
  {
    "path": "presets/inceptionv3_orig.prototxt",
    "content": "name: \"Inception_v3\"\nlayer {\n  name: \"data\"\n  type: \"Data\"\n  top: \"data\"\n  include {\n    phase: TRAIN\n  }\n  transform_param {\n    mirror: true\n    crop_size: 299\n    mean_value: 104\n    mean_value: 117\n    mean_value: 123\n  }\n  data_param {\n    source: \"/mnt/disk/ILSVRC2012/300px_ilsvrc12_train_lmdb\"\n    batch_size: 20\n    backend: LMDB\n  }\n}\nlayer {\n  name: \"conv_conv2d\"\n  type: \"Convolution\"\n  bottom: \"data\"\n  top: \"conv_conv2d\"\n  convolution_param {\n    bias_term: false\n    num_output: 32\n    pad: 0\n    kernel_size: 3\n    stride: 2\n    weight_filler {\n        type: \"xavier\"\n    }\n  }\n\n}\nlayer {\n  name: \"conv_conv2d_bn\"\n  type: \"BatchNorm\"\n  bottom: \"conv_conv2d\"\n  top: \"conv_conv2d_bn\"\n  batch_norm_param {\n    use_global_stats: false\n    eps: 0.001\n  }\n  param {\n    lr_mult: 0\n  }\n  param {\n    lr_mult: 0\n  }\n  param {\n    lr_mult: 0\n  }\n}\nlayer {\n  name: \"conv_conv2d_relu\"\n  type: \"ReLU\"\n  bottom: \"conv_conv2d_bn\"\n  top: \"conv_conv2d_relu\"\n}\nlayer {\n  name: \"conv_1_1/conv2d\"\n  type: \"Convolution\"\n  bottom: \"conv_conv2d_relu\"\n  top: \"conv_1_1/conv2d\"\n  convolution_param {\n    bias_term: false\n    num_output: 32\n    pad: 0\n    kernel_size: 3\n    stride: 1\n    weight_filler {\n        type: \"xavier\"\n    }\n  }\n\n}\nlayer {\n  name: \"conv_1_1/conv2d_bn\"\n  type: \"BatchNorm\"\n  bottom: \"conv_1_1/conv2d\"\n  top: \"conv_1_1/conv2d_bn\"\n  batch_norm_param {\n    use_global_stats: false\n    eps: 0.001\n  }\n  param {\n    lr_mult: 0\n  }\n  param {\n    lr_mult: 0\n  }\n  param {\n    lr_mult: 0\n  }\n}\nlayer {\n  name: \"conv_1_1/conv2d_relu\"\n  type: \"ReLU\"\n  bottom: \"conv_1_1/conv2d_bn\"\n  top: \"conv_1_1/conv2d_relu\"\n}\nlayer {\n  name: \"conv_2_2/conv2d\"\n  type: \"Convolution\"\n  bottom: \"conv_1_1/conv2d_relu\"\n  top: \"conv_2_2/conv2d\"\n  convolution_param {\n    bias_term: false\n    num_output: 64\n    pad: 1\n    kernel_size: 3\n    stride: 1\n    weight_filler {\n        type: \"xavier\"\n    }\n  }\n\n}\nlayer {\n  name: \"conv_2_2/conv2d_bn\"\n  type: \"BatchNorm\"\n  bottom: \"conv_2_2/conv2d\"\n  top: \"conv_2_2/conv2d_bn\"\n  batch_norm_param {\n    use_global_stats: false\n    eps: 0.001\n  }\n  param {\n    lr_mult: 0\n  }\n  param {\n    lr_mult: 0\n  }\n  param {\n    lr_mult: 0\n  }\n}\nlayer {\n  name: \"conv_2_2/conv2d_relu\"\n  type: \"ReLU\"\n  bottom: \"conv_2_2/conv2d_bn\"\n  top: \"conv_2_2/conv2d_relu\"\n}\nlayer {\n  name: \"pool\"\n  type: \"Pooling\"\n  bottom: \"conv_2_2/conv2d_relu\"\n  top: \"pool\"\n  pooling_param {\n    pool: MAX\n    pad: 0\n    kernel_size: 3\n    stride: 2\n  }\n}\nlayer {\n  name: \"conv_3_3/conv2d\"\n  type: \"Convolution\"\n  bottom: \"pool\"\n  top: \"conv_3_3/conv2d\"\n  convolution_param {\n    bias_term: false\n    num_output: 80\n    pad: 0\n    kernel_size: 1\n    stride: 1\n    weight_filler {\n        type: \"xavier\"\n    }\n  }\n\n}\nlayer {\n  name: \"conv_3_3/conv2d_bn\"\n  type: \"BatchNorm\"\n  bottom: \"conv_3_3/conv2d\"\n  top: \"conv_3_3/conv2d_bn\"\n  batch_norm_param {\n    use_global_stats: false\n    eps: 0.001\n  }\n  param {\n    lr_mult: 0\n  }\n  param {\n    lr_mult: 0\n  }\n  param {\n    lr_mult: 0\n  }\n}\nlayer {\n  name: \"conv_3_3/conv2d_relu\"\n  type: \"ReLU\"\n  bottom: \"conv_3_3/conv2d_bn\"\n  top: \"conv_3_3/conv2d_relu\"\n}\nlayer {\n  name: \"conv_4_4/conv2d\"\n  type: \"Convolution\"\n  bottom: \"conv_3_3/conv2d_relu\"\n  top: \"conv_4_4/conv2d\"\n  convolution_param {\n    bias_term: false\n    num_output: 192\n    pad: 0\n    kernel_size: 3\n    stride: 1\n    weight_filler {\n        type: \"xavier\"\n    }\n  }\n\n}\nlayer {\n  name: \"conv_4_4/conv2d_bn\"\n  type: \"BatchNorm\"\n  bottom: \"conv_4_4/conv2d\"\n  top: \"conv_4_4/conv2d_bn\"\n  batch_norm_param {\n    use_global_stats: false\n    eps: 0.001\n  }\n  param {\n    lr_mult: 0\n  }\n  param {\n    lr_mult: 0\n  }\n  param {\n    lr_mult: 0\n  }\n}\nlayer {\n  name: \"conv_4_4/conv2d_relu\"\n  type: \"ReLU\"\n  bottom: \"conv_4_4/conv2d_bn\"\n  top: \"conv_4_4/conv2d_relu\"\n}\nlayer {\n  name: \"pool1\"\n  type: \"Pooling\"\n  bottom: \"conv_4_4/conv2d_relu\"\n  top: \"pool1\"\n  pooling_param {\n    pool: MAX\n    pad: 0\n    kernel_size: 3\n    stride: 2\n  }\n}\nlayer {\n  name: \"mixed_conv/conv2d\"\n  type: \"Convolution\"\n  bottom: \"pool1\"\n  top: \"mixed_conv/conv2d\"\n  convolution_param {\n    bias_term: false\n    num_output: 64\n    pad: 0\n    kernel_size: 1\n    stride: 1\n    weight_filler {\n        type: \"xavier\"\n    }\n  }\n\n}\nlayer {\n  name: \"mixed_conv/conv2d_bn\"\n  type: \"BatchNorm\"\n  bottom: \"mixed_conv/conv2d\"\n  top: \"mixed_conv/conv2d_bn\"\n  batch_norm_param {\n    use_global_stats: false\n    eps: 0.001\n  }\n  param {\n    lr_mult: 0\n  }\n  param {\n    lr_mult: 0\n  }\n  param {\n    lr_mult: 0\n  }\n}\nlayer {\n  name: \"mixed_conv/conv2d_relu\"\n  type: \"ReLU\"\n  bottom: \"mixed_conv/conv2d_bn\"\n  top: \"mixed_conv/conv2d_relu\"\n}\nlayer {\n  name: \"mixed_tower/conv_conv2d\"\n  type: \"Convolution\"\n  bottom: \"pool1\"\n  top: \"mixed_tower/conv_conv2d\"\n  convolution_param {\n    bias_term: false\n    num_output: 48\n    pad: 0\n    kernel_size: 1\n    stride: 1\n    weight_filler {\n        type: \"xavier\"\n    }\n  }\n\n}\nlayer {\n  name: \"mixed_tower/conv_conv2d_bn\"\n  type: \"BatchNorm\"\n  bottom: \"mixed_tower/conv_conv2d\"\n  top: \"mixed_tower/conv_conv2d_bn\"\n  batch_norm_param {\n    use_global_stats: false\n    eps: 0.001\n  }\n  param {\n    lr_mult: 0\n  }\n  param {\n    lr_mult: 0\n  }\n  param {\n    lr_mult: 0\n  }\n}\nlayer {\n  name: \"mixed_tower/conv_conv2d_relu\"\n  type: \"ReLU\"\n  bottom: \"mixed_tower/conv_conv2d_bn\"\n  top: \"mixed_tower/conv_conv2d_relu\"\n}\nlayer {\n  name: \"mixed_tower/conv_1_conv2d\"\n  type: \"Convolution\"\n  bottom: \"mixed_tower/conv_conv2d_relu\"\n  top: \"mixed_tower/conv_1_conv2d\"\n  convolution_param {\n    bias_term: false\n    num_output: 64\n    pad: 2\n    kernel_size: 5\n    stride: 1\n    weight_filler {\n        type: \"xavier\"\n    }\n  }\n\n}\nlayer {\n  name: \"mixed_tower/conv_1_conv2d_bn\"\n  type: \"BatchNorm\"\n  bottom: \"mixed_tower/conv_1_conv2d\"\n  top: \"mixed_tower/conv_1_conv2d_bn\"\n  batch_norm_param {\n    use_global_stats: false\n    eps: 0.001\n  }\n  param {\n    lr_mult: 0\n  }\n  param {\n    lr_mult: 0\n  }\n  param {\n    lr_mult: 0\n  }\n}\nlayer {\n  name: \"mixed_tower/conv_1_conv2d_relu\"\n  type: \"ReLU\"\n  bottom: \"mixed_tower/conv_1_conv2d_bn\"\n  top: \"mixed_tower/conv_1_conv2d_relu\"\n}\nlayer {\n  name: \"mixed_tower/1_conv_conv2d\"\n  type: \"Convolution\"\n  bottom: \"pool1\"\n  top: \"mixed_tower/1_conv_conv2d\"\n  convolution_param {\n    bias_term: false\n    num_output: 64\n    pad: 0\n    kernel_size: 1\n    stride: 1\n    weight_filler {\n        type: \"xavier\"\n    }\n  }\n\n}\nlayer {\n  name: \"mixed_tower/1_conv_conv2d_bn\"\n  type: \"BatchNorm\"\n  bottom: \"mixed_tower/1_conv_conv2d\"\n  top: \"mixed_tower/1_conv_conv2d_bn\"\n  batch_norm_param {\n    use_global_stats: false\n    eps: 0.001\n  }\n  param {\n    lr_mult: 0\n  }\n  param {\n    lr_mult: 0\n  }\n  param {\n    lr_mult: 0\n  }\n}\nlayer {\n  name: \"mixed_tower/1_conv_conv2d_relu\"\n  type: \"ReLU\"\n  bottom: \"mixed_tower/1_conv_conv2d_bn\"\n  top: \"mixed_tower/1_conv_conv2d_relu\"\n}\nlayer {\n  name: \"mixed_tower/1_conv_1_conv2d\"\n  type: \"Convolution\"\n  bottom: \"mixed_tower/1_conv_conv2d_relu\"\n  top: \"mixed_tower/1_conv_1_conv2d\"\n  convolution_param {\n    bias_term: false\n    num_output: 96\n    pad: 1\n    kernel_size: 3\n    stride: 1\n    weight_filler {\n        type: \"xavier\"\n    }\n  }\n\n}\nlayer {\n  name: \"mixed_tower/1_conv_1_conv2d_bn\"\n  type: \"BatchNorm\"\n  bottom: \"mixed_tower/1_conv_1_conv2d\"\n  top: \"mixed_tower/1_conv_1_conv2d_bn\"\n  batch_norm_param {\n    use_global_stats: false\n    eps: 0.001\n  }\n  param {\n    lr_mult: 0\n  }\n  param {\n    lr_mult: 0\n  }\n  param {\n    lr_mult: 0\n  }\n}\nlayer {\n  name: \"mixed_tower/1_conv_1_conv2d_relu\"\n  type: \"ReLU\"\n  bottom: \"mixed_tower/1_conv_1_conv2d_bn\"\n  top: \"mixed_tower/1_conv_1_conv2d_relu\"\n}\nlayer {\n  name: \"mixed_tower/1_conv_2_conv2d\"\n  type: \"Convolution\"\n  bottom: \"mixed_tower/1_conv_1_conv2d_relu\"\n  top: \"mixed_tower/1_conv_2_conv2d\"\n  convolution_param {\n    bias_term: false\n    num_output: 96\n    pad: 1\n    kernel_size: 3\n    stride: 1\n    weight_filler {\n        type: \"xavier\"\n    }\n  }\n\n}\nlayer {\n  name: \"mixed_tower/1_conv_2_conv2d_bn\"\n  type: \"BatchNorm\"\n  bottom: \"mixed_tower/1_conv_2_conv2d\"\n  top: \"mixed_tower/1_conv_2_conv2d_bn\"\n  batch_norm_param {\n    use_global_stats: false\n    eps: 0.001\n  }\n  param {\n    lr_mult: 0\n  }\n  param {\n    lr_mult: 0\n  }\n  param {\n    lr_mult: 0\n  }\n}\nlayer {\n  name: \"mixed_tower/1_conv_2_conv2d_relu\"\n  type: \"ReLU\"\n  bottom: \"mixed_tower/1_conv_2_conv2d_bn\"\n  top: \"mixed_tower/1_conv_2_conv2d_relu\"\n}\nlayer {\n  name: \"mixed_tower/AVG_pool\"\n  type: \"Pooling\"\n  bottom: \"pool1\"\n  top: \"mixed_tower/AVG_pool\"\n  pooling_param {\n    pool: AVE\n    pad: 1\n    kernel_size: 3\n    stride: 1\n  }\n}\nlayer {\n  name: \"mixed_tower/2_conv_conv2d\"\n  type: \"Convolution\"\n  bottom: \"mixed_tower/AVG_pool\"\n  top: \"mixed_tower/2_conv_conv2d\"\n  convolution_param {\n    bias_term: false\n    num_output: 32\n    pad: 0\n    kernel_size: 1\n    stride: 1\n    weight_filler {\n        type: \"xavier\"\n    }\n  }\n\n}\nlayer {\n  name: \"mixed_tower/2_conv_conv2d_bn\"\n  type: \"BatchNorm\"\n  bottom: \"mixed_tower/2_conv_conv2d\"\n  top: \"mixed_tower/2_conv_conv2d_bn\"\n  batch_norm_param {\n    use_global_stats: false\n    eps: 0.001\n  }\n  param {\n    lr_mult: 0\n  }\n  param {\n    lr_mult: 0\n  }\n  param {\n    lr_mult: 0\n  }\n}\nlayer {\n  name: \"mixed_tower/2_conv_conv2d_relu\"\n  type: \"ReLU\"\n  bottom: \"mixed_tower/2_conv_conv2d_bn\"\n  top: \"mixed_tower/2_conv_conv2d_relu\"\n}\nlayer {\n  name: \"mixed_tower/chconcat\"\n  bottom: \"mixed_conv/conv2d_relu\"\n  bottom: \"mixed_tower/conv_1_conv2d_relu\"\n  bottom: \"mixed_tower/1_conv_2_conv2d_relu\"\n  bottom: \"mixed_tower/2_conv_conv2d_relu\"\n  top: \"mixed_tower/chconcat\"\n  type: \"Concat\"\n  concat_param {\n    axis: 1\n  }\n}\nlayer {\n  name: \"mixed_1/conv_conv2d\"\n  type: \"Convolution\"\n  bottom: \"mixed_tower/chconcat\"\n  top: \"mixed_1/conv_conv2d\"\n  convolution_param {\n    bias_term: false\n    num_output: 64\n    pad: 0\n    kernel_size: 1\n    stride: 1\n    weight_filler {\n        type: \"xavier\"\n    }\n  }\n\n}\nlayer {\n  name: \"mixed_1/conv_conv2d_bn\"\n  type: \"BatchNorm\"\n  bottom: \"mixed_1/conv_conv2d\"\n  top: \"mixed_1/conv_conv2d_bn\"\n  batch_norm_param {\n    use_global_stats: false\n    eps: 0.001\n  }\n  param {\n    lr_mult: 0\n  }\n  param {\n    lr_mult: 0\n  }\n  param {\n    lr_mult: 0\n  }\n}\nlayer {\n  name: \"mixed_1/conv_conv2d_relu\"\n  type: \"ReLU\"\n  bottom: \"mixed_1/conv_conv2d_bn\"\n  top: \"mixed_1/conv_conv2d_relu\"\n}\nlayer {\n  name: \"mixed_1/tower_conv_conv2d\"\n  type: \"Convolution\"\n  bottom: \"mixed_tower/chconcat\"\n  top: \"mixed_1/tower_conv_conv2d\"\n  convolution_param {\n    bias_term: false\n    num_output: 48\n    pad: 0\n    kernel_size: 1\n    stride: 1\n    weight_filler {\n        type: \"xavier\"\n    }\n  }\n\n}\nlayer {\n  name: \"mixed_1/tower_conv_conv2d_bn\"\n  type: \"BatchNorm\"\n  bottom: \"mixed_1/tower_conv_conv2d\"\n  top: \"mixed_1/tower_conv_conv2d_bn\"\n  batch_norm_param {\n    use_global_stats: false\n    eps: 0.001\n  }\n  param {\n    lr_mult: 0\n  }\n  param {\n    lr_mult: 0\n  }\n  param {\n    lr_mult: 0\n  }\n}\nlayer {\n  name: \"mixed_1/tower_conv_conv2d_relu\"\n  type: \"ReLU\"\n  bottom: \"mixed_1/tower_conv_conv2d_bn\"\n  top: \"mixed_1/tower_conv_conv2d_relu\"\n}\nlayer {\n  name: \"mixed_1/tower_conv_1_conv2d\"\n  type: \"Convolution\"\n  bottom: \"mixed_1/tower_conv_conv2d_relu\"\n  top: \"mixed_1/tower_conv_1_conv2d\"\n  convolution_param {\n    bias_term: false\n    num_output: 64\n    pad: 2\n    kernel_size: 5\n    stride: 1\n    weight_filler {\n        type: \"xavier\"\n    }\n  }\n\n}\nlayer {\n  name: \"mixed_1/tower_conv_1_conv2d_bn\"\n  type: \"BatchNorm\"\n  bottom: \"mixed_1/tower_conv_1_conv2d\"\n  top: \"mixed_1/tower_conv_1_conv2d_bn\"\n  batch_norm_param {\n    use_global_stats: false\n    eps: 0.001\n  }\n  param {\n    lr_mult: 0\n  }\n  param {\n    lr_mult: 0\n  }\n  param {\n    lr_mult: 0\n  }\n}\nlayer {\n  name: \"mixed_1/tower_conv_1_conv2d_relu\"\n  type: \"ReLU\"\n  bottom: \"mixed_1/tower_conv_1_conv2d_bn\"\n  top: \"mixed_1/tower_conv_1_conv2d_relu\"\n}\nlayer {\n  name: \"mixed_1/tower_1_conv_conv2d\"\n  type: \"Convolution\"\n  bottom: \"mixed_tower/chconcat\"\n  top: \"mixed_1/tower_1_conv_conv2d\"\n  convolution_param {\n    bias_term: false\n    num_output: 64\n    pad: 0\n    kernel_size: 1\n    stride: 1\n    weight_filler {\n        type: \"xavier\"\n    }\n  }\n\n}\nlayer {\n  name: \"mixed_1/tower_1_conv_conv2d_bn\"\n  type: \"BatchNorm\"\n  bottom: \"mixed_1/tower_1_conv_conv2d\"\n  top: \"mixed_1/tower_1_conv_conv2d_bn\"\n  batch_norm_param {\n    use_global_stats: false\n    eps: 0.001\n  }\n  param {\n    lr_mult: 0\n  }\n  param {\n    lr_mult: 0\n  }\n  param {\n    lr_mult: 0\n  }\n}\nlayer {\n  name: \"mixed_1/tower_1_conv_conv2d_relu\"\n  type: \"ReLU\"\n  bottom: \"mixed_1/tower_1_conv_conv2d_bn\"\n  top: \"mixed_1/tower_1_conv_conv2d_relu\"\n}\nlayer {\n  name: \"mixed_1/tower_1_conv_1_conv2d\"\n  type: \"Convolution\"\n  bottom: \"mixed_1/tower_1_conv_conv2d_relu\"\n  top: \"mixed_1/tower_1_conv_1_conv2d\"\n  convolution_param {\n    bias_term: false\n    num_output: 96\n    pad: 1\n    kernel_size: 3\n    stride: 1\n    weight_filler {\n        type: \"xavier\"\n    }\n  }\n\n}\nlayer {\n  name: \"mixed_1/tower_1_conv_1_conv2d_bn\"\n  type: \"BatchNorm\"\n  bottom: \"mixed_1/tower_1_conv_1_conv2d\"\n  top: \"mixed_1/tower_1_conv_1_conv2d_bn\"\n  batch_norm_param {\n    use_global_stats: false\n    eps: 0.001\n  }\n  param {\n    lr_mult: 0\n  }\n  param {\n    lr_mult: 0\n  }\n  param {\n    lr_mult: 0\n  }\n}\nlayer {\n  name: \"mixed_1/tower_1_conv_1_conv2d_relu\"\n  type: \"ReLU\"\n  bottom: \"mixed_1/tower_1_conv_1_conv2d_bn\"\n  top: \"mixed_1/tower_1_conv_1_conv2d_relu\"\n}\nlayer {\n  name: \"mixed_1/tower_1_conv_2_conv2d\"\n  type: \"Convolution\"\n  bottom: \"mixed_1/tower_1_conv_1_conv2d_relu\"\n  top: \"mixed_1/tower_1_conv_2_conv2d\"\n  convolution_param {\n    bias_term: false\n    num_output: 96\n    pad: 1\n    kernel_size: 3\n    stride: 1\n    weight_filler {\n        type: \"xavier\"\n    }\n  }\n\n}\nlayer {\n  name: \"mixed_1/tower_1_conv_2_conv2d_bn\"\n  type: \"BatchNorm\"\n  bottom: \"mixed_1/tower_1_conv_2_conv2d\"\n  top: \"mixed_1/tower_1_conv_2_conv2d_bn\"\n  batch_norm_param {\n    use_global_stats: false\n    eps: 0.001\n  }\n  param {\n    lr_mult: 0\n  }\n  param {\n    lr_mult: 0\n  }\n  param {\n    lr_mult: 0\n  }\n}\nlayer {\n  name: \"mixed_1/tower_1_conv_2_conv2d_relu\"\n  type: \"ReLU\"\n  bottom: \"mixed_1/tower_1_conv_2_conv2d_bn\"\n  top: \"mixed_1/tower_1_conv_2_conv2d_relu\"\n}\nlayer {\n  name: \"mixed_1/tower_2_AVG_pool\"\n  type: \"Pooling\"\n  bottom: \"mixed_tower/chconcat\"\n  top: \"mixed_1/tower_2_AVG_pool\"\n  pooling_param {\n    pool: AVE\n    pad: 1\n    kernel_size: 3\n    stride: 1\n  }\n}\nlayer {\n  name: \"mixed_1/tower_2_conv_conv2d\"\n  type: \"Convolution\"\n  bottom: \"mixed_1/tower_2_AVG_pool\"\n  top: \"mixed_1/tower_2_conv_conv2d\"\n  convolution_param {\n    bias_term: false\n    num_output: 64\n    pad: 0\n    kernel_size: 1\n    stride: 1\n    weight_filler {\n        type: \"xavier\"\n    }\n  }\n\n}\nlayer {\n  name: \"mixed_1/tower_2_conv_conv2d_bn\"\n  type: \"BatchNorm\"\n  bottom: \"mixed_1/tower_2_conv_conv2d\"\n  top: \"mixed_1/tower_2_conv_conv2d_bn\"\n  batch_norm_param {\n    use_global_stats: false\n    eps: 0.001\n  }\n  param {\n    lr_mult: 0\n  }\n  param {\n    lr_mult: 0\n  }\n  param {\n    lr_mult: 0\n  }\n}\nlayer {\n  name: \"mixed_1/tower_2_conv_conv2d_relu\"\n  type: \"ReLU\"\n  bottom: \"mixed_1/tower_2_conv_conv2d_bn\"\n  top: \"mixed_1/tower_2_conv_conv2d_relu\"\n}\nlayer {\n  name: \"mixed_1/chconcat\"\n  bottom: \"mixed_1/conv_conv2d_relu\"\nbottom: \"mixed_1/tower_conv_1_conv2d_relu\"\nbottom: \"mixed_1/tower_1_conv_2_conv2d_relu\"\nbottom: \"mixed_1/tower_2_conv_conv2d_relu\"\n\n  top: \"mixed_1/chconcat\"\n  type: \"Concat\"\n  concat_param {\n    axis: 1\n  }\n}\nlayer {\n  name: \"mixed_2/conv_conv2d\"\n  type: \"Convolution\"\n  bottom: \"mixed_1/chconcat\"\n  top: \"mixed_2/conv_conv2d\"\n  convolution_param {\n    bias_term: false\n    num_output: 64\n    pad: 0\n    kernel_size: 1\n    stride: 1\n    weight_filler {\n        type: \"xavier\"\n    }\n  }\n\n}\nlayer {\n  name: \"mixed_2/conv_conv2d_bn\"\n  type: \"BatchNorm\"\n  bottom: \"mixed_2/conv_conv2d\"\n  top: \"mixed_2/conv_conv2d_bn\"\n  batch_norm_param {\n    use_global_stats: false\n    eps: 0.001\n  }\n  param {\n    lr_mult: 0\n  }\n  param {\n    lr_mult: 0\n  }\n  param {\n    lr_mult: 0\n  }\n}\nlayer {\n  name: \"mixed_2/conv_conv2d_relu\"\n  type: \"ReLU\"\n  bottom: \"mixed_2/conv_conv2d_bn\"\n  top: \"mixed_2/conv_conv2d_relu\"\n}\nlayer {\n  name: \"mixed_2/tower_conv_conv2d\"\n  type: \"Convolution\"\n  bottom: \"mixed_1/chconcat\"\n  top: \"mixed_2/tower_conv_conv2d\"\n  convolution_param {\n    bias_term: false\n    num_output: 48\n    pad: 0\n    kernel_size: 1\n    stride: 1\n    weight_filler {\n        type: \"xavier\"\n    }\n  }\n\n}\nlayer {\n  name: \"mixed_2/tower_conv_conv2d_bn\"\n  type: \"BatchNorm\"\n  bottom: \"mixed_2/tower_conv_conv2d\"\n  top: \"mixed_2/tower_conv_conv2d_bn\"\n  batch_norm_param {\n    use_global_stats: false\n    eps: 0.001\n  }\n  param {\n    lr_mult: 0\n  }\n  param {\n    lr_mult: 0\n  }\n  param {\n    lr_mult: 0\n  }\n}\nlayer {\n  name: \"mixed_2/tower_conv_conv2d_relu\"\n  type: \"ReLU\"\n  bottom: \"mixed_2/tower_conv_conv2d_bn\"\n  top: \"mixed_2/tower_conv_conv2d_relu\"\n}\nlayer {\n  name: \"mixed_2/tower_conv_1_conv2d\"\n  type: \"Convolution\"\n  bottom: \"mixed_2/tower_conv_conv2d_relu\"\n  top: \"mixed_2/tower_conv_1_conv2d\"\n  convolution_param {\n    bias_term: false\n    num_output: 64\n    pad: 2\n    kernel_size: 5\n    stride: 1\n    weight_filler {\n        type: \"xavier\"\n    }\n  }\n\n}\nlayer {\n  name: \"mixed_2/tower_conv_1_conv2d_bn\"\n  type: \"BatchNorm\"\n  bottom: \"mixed_2/tower_conv_1_conv2d\"\n  top: \"mixed_2/tower_conv_1_conv2d_bn\"\n  batch_norm_param {\n    use_global_stats: false\n    eps: 0.001\n  }\n  param {\n    lr_mult: 0\n  }\n  param {\n    lr_mult: 0\n  }\n  param {\n    lr_mult: 0\n  }\n}\nlayer {\n  name: \"mixed_2/tower_conv_1_conv2d_relu\"\n  type: \"ReLU\"\n  bottom: \"mixed_2/tower_conv_1_conv2d_bn\"\n  top: \"mixed_2/tower_conv_1_conv2d_relu\"\n}\nlayer {\n  name: \"mixed_2/tower_1_conv_conv2d\"\n  type: \"Convolution\"\n  bottom: \"mixed_1/chconcat\"\n  top: \"mixed_2/tower_1_conv_conv2d\"\n  convolution_param {\n    bias_term: false\n    num_output: 64\n    pad: 0\n    kernel_size: 1\n    stride: 1\n    weight_filler {\n        type: \"xavier\"\n    }\n  }\n\n}\nlayer {\n  name: \"mixed_2/tower_1_conv_conv2d_bn\"\n  type: \"BatchNorm\"\n  bottom: \"mixed_2/tower_1_conv_conv2d\"\n  top: \"mixed_2/tower_1_conv_conv2d_bn\"\n  batch_norm_param {\n    use_global_stats: false\n    eps: 0.001\n  }\n  param {\n    lr_mult: 0\n  }\n  param {\n    lr_mult: 0\n  }\n  param {\n    lr_mult: 0\n  }\n}\nlayer {\n  name: \"mixed_2/tower_1_conv_conv2d_relu\"\n  type: \"ReLU\"\n  bottom: \"mixed_2/tower_1_conv_conv2d_bn\"\n  top: \"mixed_2/tower_1_conv_conv2d_relu\"\n}\nlayer {\n  name: \"mixed_2/tower_1_conv_1_conv2d\"\n  type: \"Convolution\"\n  bottom: \"mixed_2/tower_1_conv_conv2d_relu\"\n  top: \"mixed_2/tower_1_conv_1_conv2d\"\n  convolution_param {\n    bias_term: false\n    num_output: 96\n    pad: 1\n    kernel_size: 3\n    stride: 1\n    weight_filler {\n        type: \"xavier\"\n    }\n  }\n\n}\nlayer {\n  name: \"mixed_2/tower_1_conv_1_conv2d_bn\"\n  type: \"BatchNorm\"\n  bottom: \"mixed_2/tower_1_conv_1_conv2d\"\n  top: \"mixed_2/tower_1_conv_1_conv2d_bn\"\n  batch_norm_param {\n    use_global_stats: false\n    eps: 0.001\n  }\n  param {\n    lr_mult: 0\n  }\n  param {\n    lr_mult: 0\n  }\n  param {\n    lr_mult: 0\n  }\n}\nlayer {\n  name: \"mixed_2/tower_1_conv_1_conv2d_relu\"\n  type: \"ReLU\"\n  bottom: \"mixed_2/tower_1_conv_1_conv2d_bn\"\n  top: \"mixed_2/tower_1_conv_1_conv2d_relu\"\n}\nlayer {\n  name: \"mixed_2/tower_1_conv_2_conv2d\"\n  type: \"Convolution\"\n  bottom: \"mixed_2/tower_1_conv_1_conv2d_relu\"\n  top: \"mixed_2/tower_1_conv_2_conv2d\"\n  convolution_param {\n    bias_term: false\n    num_output: 96\n    pad: 1\n    kernel_size: 3\n    stride: 1\n    weight_filler {\n        type: \"xavier\"\n    }\n  }\n\n}\nlayer {\n  name: \"mixed_2/tower_1_conv_2_conv2d_bn\"\n  type: \"BatchNorm\"\n  bottom: \"mixed_2/tower_1_conv_2_conv2d\"\n  top: \"mixed_2/tower_1_conv_2_conv2d_bn\"\n  batch_norm_param {\n    use_global_stats: false\n    eps: 0.001\n  }\n  param {\n    lr_mult: 0\n  }\n  param {\n    lr_mult: 0\n  }\n  param {\n    lr_mult: 0\n  }\n}\nlayer {\n  name: \"mixed_2/tower_1_conv_2_conv2d_relu\"\n  type: \"ReLU\"\n  bottom: \"mixed_2/tower_1_conv_2_conv2d_bn\"\n  top: \"mixed_2/tower_1_conv_2_conv2d_relu\"\n}\nlayer {\n  name: \"mixed_2/tower_2_AVG_pool\"\n  type: \"Pooling\"\n  bottom: \"mixed_1/chconcat\"\n  top: \"mixed_2/tower_2_AVG_pool\"\n  pooling_param {\n    pool: AVE\n    pad: 1\n    kernel_size: 3\n    stride: 1\n  }\n}\nlayer {\n  name: \"mixed_2/tower_2_conv_conv2d\"\n  type: \"Convolution\"\n  bottom: \"mixed_2/tower_2_AVG_pool\"\n  top: \"mixed_2/tower_2_conv_conv2d\"\n  convolution_param {\n    bias_term: false\n    num_output: 64\n    pad: 0\n    kernel_size: 1\n    stride: 1\n    weight_filler {\n        type: \"xavier\"\n    }\n  }\n\n}\nlayer {\n  name: \"mixed_2/tower_2_conv_conv2d_bn\"\n  type: \"BatchNorm\"\n  bottom: \"mixed_2/tower_2_conv_conv2d\"\n  top: \"mixed_2/tower_2_conv_conv2d_bn\"\n  batch_norm_param {\n    use_global_stats: false\n    eps: 0.001\n  }\n  param {\n    lr_mult: 0\n  }\n  param {\n    lr_mult: 0\n  }\n  param {\n    lr_mult: 0\n  }\n}\nlayer {\n  name: \"mixed_2/tower_2_conv_conv2d_relu\"\n  type: \"ReLU\"\n  bottom: \"mixed_2/tower_2_conv_conv2d_bn\"\n  top: \"mixed_2/tower_2_conv_conv2d_relu\"\n}\nlayer {\n  name: \"mixed_2/chconcat\"\n  bottom: \"mixed_2/conv_conv2d_relu\"\nbottom: \"mixed_2/tower_conv_1_conv2d_relu\"\nbottom: \"mixed_2/tower_1_conv_2_conv2d_relu\"\nbottom: \"mixed_2/tower_2_conv_conv2d_relu\"\n\n  top: \"mixed_2/chconcat\"\n  type: \"Concat\"\n  concat_param {\n    axis: 1\n  }\n}\nlayer {\n  name: \"mixed_3/conv_conv2d\"\n  type: \"Convolution\"\n  bottom: \"mixed_2/chconcat\"\n  top: \"mixed_3/conv_conv2d\"\n  convolution_param {\n    bias_term: false\n    num_output: 384\n    pad: 0\n    kernel_size: 3\n    stride: 2\n    weight_filler {\n        type: \"xavier\"\n    }\n  }\n\n}\nlayer {\n  name: \"mixed_3/conv_conv2d_bn\"\n  type: \"BatchNorm\"\n  bottom: \"mixed_3/conv_conv2d\"\n  top: \"mixed_3/conv_conv2d_bn\"\n  batch_norm_param {\n    use_global_stats: false\n    eps: 0.001\n  }\n  param {\n    lr_mult: 0\n  }\n  param {\n    lr_mult: 0\n  }\n  param {\n    lr_mult: 0\n  }\n}\nlayer {\n  name: \"mixed_3/conv_conv2d_relu\"\n  type: \"ReLU\"\n  bottom: \"mixed_3/conv_conv2d_bn\"\n  top: \"mixed_3/conv_conv2d_relu\"\n}\nlayer {\n  name: \"mixed_3/tower_conv_conv2d\"\n  type: \"Convolution\"\n  bottom: \"mixed_2/chconcat\"\n  top: \"mixed_3/tower_conv_conv2d\"\n  convolution_param {\n    bias_term: false\n    num_output: 64\n    pad: 0\n    kernel_size: 1\n    stride: 1\n    weight_filler {\n        type: \"xavier\"\n    }\n  }\n\n}\nlayer {\n  name: \"mixed_3/tower_conv_conv2d_bn\"\n  type: \"BatchNorm\"\n  bottom: \"mixed_3/tower_conv_conv2d\"\n  top: \"mixed_3/tower_conv_conv2d_bn\"\n  batch_norm_param {\n    use_global_stats: false\n    eps: 0.001\n  }\n  param {\n    lr_mult: 0\n  }\n  param {\n    lr_mult: 0\n  }\n  param {\n    lr_mult: 0\n  }\n}\nlayer {\n  name: \"mixed_3/tower_conv_conv2d_relu\"\n  type: \"ReLU\"\n  bottom: \"mixed_3/tower_conv_conv2d_bn\"\n  top: \"mixed_3/tower_conv_conv2d_relu\"\n}\nlayer {\n  name: \"mixed_3/tower_conv_1_conv2d\"\n  type: \"Convolution\"\n  bottom: \"mixed_3/tower_conv_conv2d_relu\"\n  top: \"mixed_3/tower_conv_1_conv2d\"\n  convolution_param {\n    bias_term: false\n    num_output: 96\n    pad: 1\n    kernel_size: 3\n    stride: 1\n    weight_filler {\n        type: \"xavier\"\n    }\n  }\n\n}\nlayer {\n  name: \"mixed_3/tower_conv_1_conv2d_bn\"\n  type: \"BatchNorm\"\n  bottom: \"mixed_3/tower_conv_1_conv2d\"\n  top: \"mixed_3/tower_conv_1_conv2d_bn\"\n  batch_norm_param {\n    use_global_stats: false\n    eps: 0.001\n  }\n  param {\n    lr_mult: 0\n  }\n  param {\n    lr_mult: 0\n  }\n  param {\n    lr_mult: 0\n  }\n}\nlayer {\n  name: \"mixed_3/tower_conv_1_conv2d_relu\"\n  type: \"ReLU\"\n  bottom: \"mixed_3/tower_conv_1_conv2d_bn\"\n  top: \"mixed_3/tower_conv_1_conv2d_relu\"\n}\nlayer {\n  name: \"mixed_3/tower_conv_2_conv2d\"\n  type: \"Convolution\"\n  bottom: \"mixed_3/tower_conv_1_conv2d_relu\"\n  top: \"mixed_3/tower_conv_2_conv2d\"\n  convolution_param {\n    bias_term: false\n    num_output: 96\n    pad: 0\n    kernel_size: 3\n    stride: 2\n    weight_filler {\n        type: \"xavier\"\n    }\n  }\n\n}\nlayer {\n  name: \"mixed_3/tower_conv_2_conv2d_bn\"\n  type: \"BatchNorm\"\n  bottom: \"mixed_3/tower_conv_2_conv2d\"\n  top: \"mixed_3/tower_conv_2_conv2d_bn\"\n  batch_norm_param {\n    use_global_stats: false\n    eps: 0.001\n  }\n  param {\n    lr_mult: 0\n  }\n  param {\n    lr_mult: 0\n  }\n  param {\n    lr_mult: 0\n  }\n}\nlayer {\n  name: \"mixed_3/tower_conv_2_conv2d_relu\"\n  type: \"ReLU\"\n  bottom: \"mixed_3/tower_conv_2_conv2d_bn\"\n  top: \"mixed_3/tower_conv_2_conv2d_relu\"\n}\nlayer {\n  name: \"mixed_3/max_pool\"\n  type: \"Pooling\"\n  bottom: \"mixed_2/chconcat\"\n  top: \"mixed_3/max_pool\"\n  pooling_param {\n    pool: MAX\n    pad: 0\n    kernel_size: 3\n    stride: 2\n  }\n}\nlayer {\n  name: \"mixed_3/chconcat\"\n  bottom: \"mixed_3/max_pool\"\nbottom: \"mixed_3/conv_conv2d_relu\"\nbottom: \"mixed_3/tower_conv_2_conv2d_relu\"\n\n  top: \"mixed_3/chconcat\"\n  type: \"Concat\"\n  concat_param {\n    axis: 1\n  }\n}\nlayer {\n  name: \"mixed_4/conv_conv2d\"\n  type: \"Convolution\"\n  bottom: \"mixed_3/chconcat\"\n  top: \"mixed_4/conv_conv2d\"\n  convolution_param {\n    bias_term: false\n    num_output: 192\n    pad: 0\n    kernel_size: 1\n    stride: 1\n    weight_filler {\n        type: \"xavier\"\n    }\n  }\n\n}\nlayer {\n  name: \"mixed_4/conv_conv2d_bn\"\n  type: \"BatchNorm\"\n  bottom: \"mixed_4/conv_conv2d\"\n  top: \"mixed_4/conv_conv2d_bn\"\n  batch_norm_param {\n    use_global_stats: false\n    eps: 0.001\n  }\n  param {\n    lr_mult: 0\n  }\n  param {\n    lr_mult: 0\n  }\n  param {\n    lr_mult: 0\n  }\n}\nlayer {\n  name: \"mixed_4/conv_conv2d_relu\"\n  type: \"ReLU\"\n  bottom: \"mixed_4/conv_conv2d_bn\"\n  top: \"mixed_4/conv_conv2d_relu\"\n}\nlayer {\n  name: \"mixed_4/tower_conv_conv2d\"\n  type: \"Convolution\"\n  bottom: \"mixed_3/chconcat\"\n  top: \"mixed_4/tower_conv_conv2d\"\n  convolution_param {\n    bias_term: false\n    num_output: 128\n    pad: 0\n    kernel_size: 1\n    stride: 1\n    weight_filler {\n        type: \"xavier\"\n    }\n  }\n\n}\nlayer {\n  name: \"mixed_4/tower_conv_conv2d_bn\"\n  type: \"BatchNorm\"\n  bottom: \"mixed_4/tower_conv_conv2d\"\n  top: \"mixed_4/tower_conv_conv2d_bn\"\n  batch_norm_param {\n    use_global_stats: false\n    eps: 0.001\n  }\n  param {\n    lr_mult: 0\n  }\n  param {\n    lr_mult: 0\n  }\n  param {\n    lr_mult: 0\n  }\n}\nlayer {\n  name: \"mixed_4/tower_conv_conv2d_relu\"\n  type: \"ReLU\"\n  bottom: \"mixed_4/tower_conv_conv2d_bn\"\n  top: \"mixed_4/tower_conv_conv2d_relu\"\n}\nlayer {\n  name: \"mixed_4/tower_conv_1_conv2d\"\n  type: \"Convolution\"\n  bottom: \"mixed_4/tower_conv_conv2d_relu\"\n  top: \"mixed_4/tower_conv_1_conv2d\"\n  convolution_param {\n    bias_term: false\n    num_output: 128\n    pad_h: 0\npad_w: 3\n    kernel_h: 1\nkernel_w: 7\n    stride: 1\n    weight_filler {\n        type: \"xavier\"\n    }\n  }\n\n}\nlayer {\n  name: \"mixed_4/tower_conv_1_conv2d_bn\"\n  type: \"BatchNorm\"\n  bottom: \"mixed_4/tower_conv_1_conv2d\"\n  top: \"mixed_4/tower_conv_1_conv2d_bn\"\n  batch_norm_param {\n    use_global_stats: false\n    eps: 0.001\n  }\n  param {\n    lr_mult: 0\n  }\n  param {\n    lr_mult: 0\n  }\n  param {\n    lr_mult: 0\n  }\n}\nlayer {\n  name: \"mixed_4/tower_conv_1_conv2d_relu\"\n  type: \"ReLU\"\n  bottom: \"mixed_4/tower_conv_1_conv2d_bn\"\n  top: \"mixed_4/tower_conv_1_conv2d_relu\"\n}\nlayer {\n  name: \"mixed_4/tower_conv_2_conv2d\"\n  type: \"Convolution\"\n  bottom: \"mixed_4/tower_conv_1_conv2d_relu\"\n  top: \"mixed_4/tower_conv_2_conv2d\"\n  convolution_param {\n    bias_term: false\n    num_output: 192\n    pad_h: 3\npad_w: 0\n    kernel_h: 7\nkernel_w: 1\n    stride: 1\n    weight_filler {\n        type: \"xavier\"\n    }\n  }\n\n}\nlayer {\n  name: \"mixed_4/tower_conv_2_conv2d_bn\"\n  type: \"BatchNorm\"\n  bottom: \"mixed_4/tower_conv_2_conv2d\"\n  top: \"mixed_4/tower_conv_2_conv2d_bn\"\n  batch_norm_param {\n    use_global_stats: false\n    eps: 0.001\n  }\n  param {\n    lr_mult: 0\n  }\n  param {\n    lr_mult: 0\n  }\n  param {\n    lr_mult: 0\n  }\n}\nlayer {\n  name: \"mixed_4/tower_conv_2_conv2d_relu\"\n  type: \"ReLU\"\n  bottom: \"mixed_4/tower_conv_2_conv2d_bn\"\n  top: \"mixed_4/tower_conv_2_conv2d_relu\"\n}\nlayer {\n  name: \"mixed_4/tower_1_conv_conv2d\"\n  type: \"Convolution\"\n  bottom: \"mixed_3/chconcat\"\n  top: \"mixed_4/tower_1_conv_conv2d\"\n  convolution_param {\n    bias_term: false\n    num_output: 128\n    pad: 0\n    kernel_size: 1\n    stride: 1\n    weight_filler {\n        type: \"xavier\"\n    }\n  }\n\n}\nlayer {\n  name: \"mixed_4/tower_1_conv_conv2d_bn\"\n  type: \"BatchNorm\"\n  bottom: \"mixed_4/tower_1_conv_conv2d\"\n  top: \"mixed_4/tower_1_conv_conv2d_bn\"\n  batch_norm_param {\n    use_global_stats: false\n    eps: 0.001\n  }\n  param {\n    lr_mult: 0\n  }\n  param {\n    lr_mult: 0\n  }\n  param {\n    lr_mult: 0\n  }\n}\nlayer {\n  name: \"mixed_4/tower_1_conv_conv2d_relu\"\n  type: \"ReLU\"\n  bottom: \"mixed_4/tower_1_conv_conv2d_bn\"\n  top: \"mixed_4/tower_1_conv_conv2d_relu\"\n}\nlayer {\n  name: \"mixed_4/tower_1_conv_1_conv2d\"\n  type: \"Convolution\"\n  bottom: \"mixed_4/tower_1_conv_conv2d_relu\"\n  top: \"mixed_4/tower_1_conv_1_conv2d\"\n  convolution_param {\n    bias_term: false\n    num_output: 128\n    pad_h: 3\npad_w: 0\n    kernel_h: 7\nkernel_w: 1\n    stride: 1\n    weight_filler {\n        type: \"xavier\"\n    }\n  }\n\n}\nlayer {\n  name: \"mixed_4/tower_1_conv_1_conv2d_bn\"\n  type: \"BatchNorm\"\n  bottom: \"mixed_4/tower_1_conv_1_conv2d\"\n  top: \"mixed_4/tower_1_conv_1_conv2d_bn\"\n  batch_norm_param {\n    use_global_stats: false\n    eps: 0.001\n  }\n  param {\n    lr_mult: 0\n  }\n  param {\n    lr_mult: 0\n  }\n  param {\n    lr_mult: 0\n  }\n}\nlayer {\n  name: \"mixed_4/tower_1_conv_1_conv2d_relu\"\n  type: \"ReLU\"\n  bottom: \"mixed_4/tower_1_conv_1_conv2d_bn\"\n  top: \"mixed_4/tower_1_conv_1_conv2d_relu\"\n}\nlayer {\n  name: \"mixed_4/tower_1_conv_2_conv2d\"\n  type: \"Convolution\"\n  bottom: \"mixed_4/tower_1_conv_1_conv2d_relu\"\n  top: \"mixed_4/tower_1_conv_2_conv2d\"\n  convolution_param {\n    bias_term: false\n    num_output: 128\n    pad_h: 0\npad_w: 3\n    kernel_h: 1\nkernel_w: 7\n    stride: 1\n    weight_filler {\n        type: \"xavier\"\n    }\n  }\n\n}\nlayer {\n  name: \"mixed_4/tower_1_conv_2_conv2d_bn\"\n  type: \"BatchNorm\"\n  bottom: \"mixed_4/tower_1_conv_2_conv2d\"\n  top: \"mixed_4/tower_1_conv_2_conv2d_bn\"\n  batch_norm_param {\n    use_global_stats: false\n    eps: 0.001\n  }\n  param {\n    lr_mult: 0\n  }\n  param {\n    lr_mult: 0\n  }\n  param {\n    lr_mult: 0\n  }\n}\nlayer {\n  name: \"mixed_4/tower_1_conv_2_conv2d_relu\"\n  type: \"ReLU\"\n  bottom: \"mixed_4/tower_1_conv_2_conv2d_bn\"\n  top: \"mixed_4/tower_1_conv_2_conv2d_relu\"\n}\nlayer {\n  name: \"mixed_4/tower_1_conv_3_conv2d\"\n  type: \"Convolution\"\n  bottom: \"mixed_4/tower_1_conv_2_conv2d_relu\"\n  top: \"mixed_4/tower_1_conv_3_conv2d\"\n  convolution_param {\n    bias_term: false\n    num_output: 128\n    pad_h: 3\npad_w: 0\n    kernel_h: 7\nkernel_w: 1\n    stride: 1\n    weight_filler {\n        type: \"xavier\"\n    }\n  }\n\n}\nlayer {\n  name: \"mixed_4/tower_1_conv_3_conv2d_bn\"\n  type: \"BatchNorm\"\n  bottom: \"mixed_4/tower_1_conv_3_conv2d\"\n  top: \"mixed_4/tower_1_conv_3_conv2d_bn\"\n  batch_norm_param {\n    use_global_stats: false\n    eps: 0.001\n  }\n  param {\n    lr_mult: 0\n  }\n  param {\n    lr_mult: 0\n  }\n  param {\n    lr_mult: 0\n  }\n}\nlayer {\n  name: \"mixed_4/tower_1_conv_3_conv2d_relu\"\n  type: \"ReLU\"\n  bottom: \"mixed_4/tower_1_conv_3_conv2d_bn\"\n  top: \"mixed_4/tower_1_conv_3_conv2d_relu\"\n}\nlayer {\n  name: \"mixed_4/tower_1_conv_4_conv2d\"\n  type: \"Convolution\"\n  bottom: \"mixed_4/tower_1_conv_3_conv2d_relu\"\n  top: \"mixed_4/tower_1_conv_4_conv2d\"\n  convolution_param {\n    bias_term: false\n    num_output: 192\n    pad_h: 0\npad_w: 3\n    kernel_h: 1\nkernel_w: 7\n    stride: 1\n    weight_filler {\n        type: \"xavier\"\n    }\n  }\n\n}\nlayer {\n  name: \"mixed_4/tower_1_conv_4_conv2d_bn\"\n  type: \"BatchNorm\"\n  bottom: \"mixed_4/tower_1_conv_4_conv2d\"\n  top: \"mixed_4/tower_1_conv_4_conv2d_bn\"\n  batch_norm_param {\n    use_global_stats: false\n    eps: 0.001\n  }\n  param {\n    lr_mult: 0\n  }\n  param {\n    lr_mult: 0\n  }\n  param {\n    lr_mult: 0\n  }\n}\nlayer {\n  name: \"mixed_4/tower_1_conv_4_conv2d_relu\"\n  type: \"ReLU\"\n  bottom: \"mixed_4/tower_1_conv_4_conv2d_bn\"\n  top: \"mixed_4/tower_1_conv_4_conv2d_relu\"\n}\nlayer {\n  name: \"mixed_4/tower_2_AVG_pool\"\n  type: \"Pooling\"\n  bottom: \"mixed_3/chconcat\"\n  top: \"mixed_4/tower_2_AVG_pool\"\n  pooling_param {\n    pool: AVE\n    pad: 1\n    kernel_size: 3\n    stride: 1\n  }\n}\nlayer {\n  name: \"mixed_4/tower_2_conv_conv2d\"\n  type: \"Convolution\"\n  bottom: \"mixed_4/tower_2_AVG_pool\"\n  top: \"mixed_4/tower_2_conv_conv2d\"\n  convolution_param {\n    bias_term: false\n    num_output: 192\n    pad: 0\n    kernel_size: 1\n    stride: 1\n    weight_filler {\n        type: \"xavier\"\n    }\n  }\n\n}\nlayer {\n  name: \"mixed_4/tower_2_conv_conv2d_bn\"\n  type: \"BatchNorm\"\n  bottom: \"mixed_4/tower_2_conv_conv2d\"\n  top: \"mixed_4/tower_2_conv_conv2d_bn\"\n  batch_norm_param {\n    use_global_stats: false\n    eps: 0.001\n  }\n  param {\n    lr_mult: 0\n  }\n  param {\n    lr_mult: 0\n  }\n  param {\n    lr_mult: 0\n  }\n}\nlayer {\n  name: \"mixed_4/tower_2_conv_conv2d_relu\"\n  type: \"ReLU\"\n  bottom: \"mixed_4/tower_2_conv_conv2d_bn\"\n  top: \"mixed_4/tower_2_conv_conv2d_relu\"\n}\nlayer {\n  name: \"mixed_4/chconcat\"\n  bottom: \"mixed_4/conv_conv2d_relu\"\nbottom: \"mixed_4/tower_conv_2_conv2d_relu\"\nbottom: \"mixed_4/tower_1_conv_4_conv2d_relu\"\nbottom: \"mixed_4/tower_2_conv_conv2d_relu\"\n\n  top: \"mixed_4/chconcat\"\n  type: \"Concat\"\n  concat_param {\n    axis: 1\n  }\n}\nlayer {\n  name: \"mixed_5/conv_conv2d\"\n  type: \"Convolution\"\n  bottom: \"mixed_4/chconcat\"\n  top: \"mixed_5/conv_conv2d\"\n  convolution_param {\n    bias_term: false\n    num_output: 192\n    pad: 0\n    kernel_size: 1\n    stride: 1\n    weight_filler {\n        type: \"xavier\"\n    }\n  }\n\n}\nlayer {\n  name: \"mixed_5/conv_conv2d_bn\"\n  type: \"BatchNorm\"\n  bottom: \"mixed_5/conv_conv2d\"\n  top: \"mixed_5/conv_conv2d_bn\"\n  batch_norm_param {\n    use_global_stats: false\n    eps: 0.001\n  }\n  param {\n    lr_mult: 0\n  }\n  param {\n    lr_mult: 0\n  }\n  param {\n    lr_mult: 0\n  }\n}\nlayer {\n  name: \"mixed_5/conv_conv2d_relu\"\n  type: \"ReLU\"\n  bottom: \"mixed_5/conv_conv2d_bn\"\n  top: \"mixed_5/conv_conv2d_relu\"\n}\nlayer {\n  name: \"mixed_5/tower_conv_conv2d\"\n  type: \"Convolution\"\n  bottom: \"mixed_4/chconcat\"\n  top: \"mixed_5/tower_conv_conv2d\"\n  convolution_param {\n    bias_term: false\n    num_output: 160\n    pad: 0\n    kernel_size: 1\n    stride: 1\n    weight_filler {\n        type: \"xavier\"\n    }\n  }\n\n}\nlayer {\n  name: \"mixed_5/tower_conv_conv2d_bn\"\n  type: \"BatchNorm\"\n  bottom: \"mixed_5/tower_conv_conv2d\"\n  top: \"mixed_5/tower_conv_conv2d_bn\"\n  batch_norm_param {\n    use_global_stats: false\n    eps: 0.001\n  }\n  param {\n    lr_mult: 0\n  }\n  param {\n    lr_mult: 0\n  }\n  param {\n    lr_mult: 0\n  }\n}\nlayer {\n  name: \"mixed_5/tower_conv_conv2d_relu\"\n  type: \"ReLU\"\n  bottom: \"mixed_5/tower_conv_conv2d_bn\"\n  top: \"mixed_5/tower_conv_conv2d_relu\"\n}\nlayer {\n  name: \"mixed_5/tower_conv_1_conv2d\"\n  type: \"Convolution\"\n  bottom: \"mixed_5/tower_conv_conv2d_relu\"\n  top: \"mixed_5/tower_conv_1_conv2d\"\n  convolution_param {\n    bias_term: false\n    num_output: 160\n    pad_h: 0\npad_w: 3\n    kernel_h: 1\nkernel_w: 7\n    stride: 1\n    weight_filler {\n        type: \"xavier\"\n    }\n  }\n\n}\nlayer {\n  name: \"mixed_5/tower_conv_1_conv2d_bn\"\n  type: \"BatchNorm\"\n  bottom: \"mixed_5/tower_conv_1_conv2d\"\n  top: \"mixed_5/tower_conv_1_conv2d_bn\"\n  batch_norm_param {\n    use_global_stats: false\n    eps: 0.001\n  }\n  param {\n    lr_mult: 0\n  }\n  param {\n    lr_mult: 0\n  }\n  param {\n    lr_mult: 0\n  }\n}\nlayer {\n  name: \"mixed_5/tower_conv_1_conv2d_relu\"\n  type: \"ReLU\"\n  bottom: \"mixed_5/tower_conv_1_conv2d_bn\"\n  top: \"mixed_5/tower_conv_1_conv2d_relu\"\n}\nlayer {\n  name: \"mixed_5/tower_conv_2_conv2d\"\n  type: \"Convolution\"\n  bottom: \"mixed_5/tower_conv_1_conv2d_relu\"\n  top: \"mixed_5/tower_conv_2_conv2d\"\n  convolution_param {\n    bias_term: false\n    num_output: 192\n    pad_h: 3\npad_w: 0\n    kernel_h: 7\nkernel_w: 1\n    stride: 1\n    weight_filler {\n        type: \"xavier\"\n    }\n  }\n\n}\nlayer {\n  name: \"mixed_5/tower_conv_2_conv2d_bn\"\n  type: \"BatchNorm\"\n  bottom: \"mixed_5/tower_conv_2_conv2d\"\n  top: \"mixed_5/tower_conv_2_conv2d_bn\"\n  batch_norm_param {\n    use_global_stats: false\n    eps: 0.001\n  }\n  param {\n    lr_mult: 0\n  }\n  param {\n    lr_mult: 0\n  }\n  param {\n    lr_mult: 0\n  }\n}\nlayer {\n  name: \"mixed_5/tower_conv_2_conv2d_relu\"\n  type: \"ReLU\"\n  bottom: \"mixed_5/tower_conv_2_conv2d_bn\"\n  top: \"mixed_5/tower_conv_2_conv2d_relu\"\n}\nlayer {\n  name: \"mixed_5/tower_1_conv_conv2d\"\n  type: \"Convolution\"\n  bottom: \"mixed_4/chconcat\"\n  top: \"mixed_5/tower_1_conv_conv2d\"\n  convolution_param {\n    bias_term: false\n    num_output: 160\n    pad: 0\n    kernel_size: 1\n    stride: 1\n    weight_filler {\n        type: \"xavier\"\n    }\n  }\n\n}\nlayer {\n  name: \"mixed_5/tower_1_conv_conv2d_bn\"\n  type: \"BatchNorm\"\n  bottom: \"mixed_5/tower_1_conv_conv2d\"\n  top: \"mixed_5/tower_1_conv_conv2d_bn\"\n  batch_norm_param {\n    use_global_stats: false\n    eps: 0.001\n  }\n  param {\n    lr_mult: 0\n  }\n  param {\n    lr_mult: 0\n  }\n  param {\n    lr_mult: 0\n  }\n}\nlayer {\n  name: \"mixed_5/tower_1_conv_conv2d_relu\"\n  type: \"ReLU\"\n  bottom: \"mixed_5/tower_1_conv_conv2d_bn\"\n  top: \"mixed_5/tower_1_conv_conv2d_relu\"\n}\nlayer {\n  name: \"mixed_5/tower_1_conv_1_conv2d\"\n  type: \"Convolution\"\n  bottom: \"mixed_5/tower_1_conv_conv2d_relu\"\n  top: \"mixed_5/tower_1_conv_1_conv2d\"\n  convolution_param {\n    bias_term: false\n    num_output: 160\n    pad_h: 3\npad_w: 0\n    kernel_h: 7\nkernel_w: 1\n    stride: 1\n    weight_filler {\n        type: \"xavier\"\n    }\n  }\n\n}\nlayer {\n  name: \"mixed_5/tower_1_conv_1_conv2d_bn\"\n  type: \"BatchNorm\"\n  bottom: \"mixed_5/tower_1_conv_1_conv2d\"\n  top: \"mixed_5/tower_1_conv_1_conv2d_bn\"\n  batch_norm_param {\n    use_global_stats: false\n    eps: 0.001\n  }\n  param {\n    lr_mult: 0\n  }\n  param {\n    lr_mult: 0\n  }\n  param {\n    lr_mult: 0\n  }\n}\nlayer {\n  name: \"mixed_5/tower_1_conv_1_conv2d_relu\"\n  type: \"ReLU\"\n  bottom: \"mixed_5/tower_1_conv_1_conv2d_bn\"\n  top: \"mixed_5/tower_1_conv_1_conv2d_relu\"\n}\nlayer {\n  name: \"mixed_5/tower_1_conv_2_conv2d\"\n  type: \"Convolution\"\n  bottom: \"mixed_5/tower_1_conv_1_conv2d_relu\"\n  top: \"mixed_5/tower_1_conv_2_conv2d\"\n  convolution_param {\n    bias_term: false\n    num_output: 160\n    pad_h: 0\npad_w: 3\n    kernel_h: 1\nkernel_w: 7\n    stride: 1\n    weight_filler {\n        type: \"xavier\"\n    }\n  }\n\n}\nlayer {\n  name: \"mixed_5/tower_1_conv_2_conv2d_bn\"\n  type: \"BatchNorm\"\n  bottom: \"mixed_5/tower_1_conv_2_conv2d\"\n  top: \"mixed_5/tower_1_conv_2_conv2d_bn\"\n  batch_norm_param {\n    use_global_stats: false\n    eps: 0.001\n  }\n  param {\n    lr_mult: 0\n  }\n  param {\n    lr_mult: 0\n  }\n  param {\n    lr_mult: 0\n  }\n}\nlayer {\n  name: \"mixed_5/tower_1_conv_2_conv2d_relu\"\n  type: \"ReLU\"\n  bottom: \"mixed_5/tower_1_conv_2_conv2d_bn\"\n  top: \"mixed_5/tower_1_conv_2_conv2d_relu\"\n}\nlayer {\n  name: \"mixed_5/tower_1_conv_3_conv2d\"\n  type: \"Convolution\"\n  bottom: \"mixed_5/tower_1_conv_2_conv2d_relu\"\n  top: \"mixed_5/tower_1_conv_3_conv2d\"\n  convolution_param {\n    bias_term: false\n    num_output: 160\n    pad_h: 3\npad_w: 0\n    kernel_h: 7\nkernel_w: 1\n    stride: 1\n    weight_filler {\n        type: \"xavier\"\n    }\n  }\n\n}\nlayer {\n  name: \"mixed_5/tower_1_conv_3_conv2d_bn\"\n  type: \"BatchNorm\"\n  bottom: \"mixed_5/tower_1_conv_3_conv2d\"\n  top: \"mixed_5/tower_1_conv_3_conv2d_bn\"\n  batch_norm_param {\n    use_global_stats: false\n    eps: 0.001\n  }\n  param {\n    lr_mult: 0\n  }\n  param {\n    lr_mult: 0\n  }\n  param {\n    lr_mult: 0\n  }\n}\nlayer {\n  name: \"mixed_5/tower_1_conv_3_conv2d_relu\"\n  type: \"ReLU\"\n  bottom: \"mixed_5/tower_1_conv_3_conv2d_bn\"\n  top: \"mixed_5/tower_1_conv_3_conv2d_relu\"\n}\nlayer {\n  name: \"mixed_5/tower_1_conv_4_conv2d\"\n  type: \"Convolution\"\n  bottom: \"mixed_5/tower_1_conv_3_conv2d_relu\"\n  top: \"mixed_5/tower_1_conv_4_conv2d\"\n  convolution_param {\n    bias_term: false\n    num_output: 192\n    pad_h: 0\npad_w: 3\n    kernel_h: 1\nkernel_w: 7\n    stride: 1\n    weight_filler {\n        type: \"xavier\"\n    }\n  }\n\n}\nlayer {\n  name: \"mixed_5/tower_1_conv_4_conv2d_bn\"\n  type: \"BatchNorm\"\n  bottom: \"mixed_5/tower_1_conv_4_conv2d\"\n  top: \"mixed_5/tower_1_conv_4_conv2d_bn\"\n  batch_norm_param {\n    use_global_stats: false\n    eps: 0.001\n  }\n  param {\n    lr_mult: 0\n  }\n  param {\n    lr_mult: 0\n  }\n  param {\n    lr_mult: 0\n  }\n}\nlayer {\n  name: \"mixed_5/tower_1_conv_4_conv2d_relu\"\n  type: \"ReLU\"\n  bottom: \"mixed_5/tower_1_conv_4_conv2d_bn\"\n  top: \"mixed_5/tower_1_conv_4_conv2d_relu\"\n}\nlayer {\n  name: \"mixed_5/tower_2_AVG_pool\"\n  type: \"Pooling\"\n  bottom: \"mixed_4/chconcat\"\n  top: \"mixed_5/tower_2_AVG_pool\"\n  pooling_param {\n    pool: AVE\n    pad: 1\n    kernel_size: 3\n    stride: 1\n  }\n}\nlayer {\n  name: \"mixed_5/tower_2_conv_conv2d\"\n  type: \"Convolution\"\n  bottom: \"mixed_5/tower_2_AVG_pool\"\n  top: \"mixed_5/tower_2_conv_conv2d\"\n  convolution_param {\n    bias_term: false\n    num_output: 192\n    pad: 0\n    kernel_size: 1\n    stride: 1\n    weight_filler {\n        type: \"xavier\"\n    }\n  }\n\n}\nlayer {\n  name: \"mixed_5/tower_2_conv_conv2d_bn\"\n  type: \"BatchNorm\"\n  bottom: \"mixed_5/tower_2_conv_conv2d\"\n  top: \"mixed_5/tower_2_conv_conv2d_bn\"\n  batch_norm_param {\n    use_global_stats: false\n    eps: 0.001\n  }\n  param {\n    lr_mult: 0\n  }\n  param {\n    lr_mult: 0\n  }\n  param {\n    lr_mult: 0\n  }\n}\nlayer {\n  name: \"mixed_5/tower_2_conv_conv2d_relu\"\n  type: \"ReLU\"\n  bottom: \"mixed_5/tower_2_conv_conv2d_bn\"\n  top: \"mixed_5/tower_2_conv_conv2d_relu\"\n}\nlayer {\n  name: \"mixed_5/chconcat\"\n  bottom: \"mixed_5/conv_conv2d_relu\"\nbottom: \"mixed_5/tower_conv_2_conv2d_relu\"\nbottom: \"mixed_5/tower_1_conv_4_conv2d_relu\"\nbottom: \"mixed_5/tower_2_conv_conv2d_relu\"\n\n  top: \"mixed_5/chconcat\"\n  type: \"Concat\"\n  concat_param {\n    axis: 1\n  }\n}\nlayer {\n  name: \"mixed_6/conv_conv2d\"\n  type: \"Convolution\"\n  bottom: \"mixed_5/chconcat\"\n  top: \"mixed_6/conv_conv2d\"\n  convolution_param {\n    bias_term: false\n    num_output: 192\n    pad: 0\n    kernel_size: 1\n    stride: 1\n    weight_filler {\n        type: \"xavier\"\n    }\n  }\n\n}\nlayer {\n  name: \"mixed_6/conv_conv2d_bn\"\n  type: \"BatchNorm\"\n  bottom: \"mixed_6/conv_conv2d\"\n  top: \"mixed_6/conv_conv2d_bn\"\n  batch_norm_param {\n    use_global_stats: false\n    eps: 0.001\n  }\n  param {\n    lr_mult: 0\n  }\n  param {\n    lr_mult: 0\n  }\n  param {\n    lr_mult: 0\n  }\n}\nlayer {\n  name: \"mixed_6/conv_conv2d_relu\"\n  type: \"ReLU\"\n  bottom: \"mixed_6/conv_conv2d_bn\"\n  top: \"mixed_6/conv_conv2d_relu\"\n}\nlayer {\n  name: \"mixed_6/tower_conv_conv2d\"\n  type: \"Convolution\"\n  bottom: \"mixed_5/chconcat\"\n  top: \"mixed_6/tower_conv_conv2d\"\n  convolution_param {\n    bias_term: false\n    num_output: 160\n    pad: 0\n    kernel_size: 1\n    stride: 1\n    weight_filler {\n        type: \"xavier\"\n    }\n  }\n\n}\nlayer {\n  name: \"mixed_6/tower_conv_conv2d_bn\"\n  type: \"BatchNorm\"\n  bottom: \"mixed_6/tower_conv_conv2d\"\n  top: \"mixed_6/tower_conv_conv2d_bn\"\n  batch_norm_param {\n    use_global_stats: false\n    eps: 0.001\n  }\n  param {\n    lr_mult: 0\n  }\n  param {\n    lr_mult: 0\n  }\n  param {\n    lr_mult: 0\n  }\n}\nlayer {\n  name: \"mixed_6/tower_conv_conv2d_relu\"\n  type: \"ReLU\"\n  bottom: \"mixed_6/tower_conv_conv2d_bn\"\n  top: \"mixed_6/tower_conv_conv2d_relu\"\n}\nlayer {\n  name: \"mixed_6/tower_conv_1_conv2d\"\n  type: \"Convolution\"\n  bottom: \"mixed_6/tower_conv_conv2d_relu\"\n  top: \"mixed_6/tower_conv_1_conv2d\"\n  convolution_param {\n    bias_term: false\n    num_output: 160\n    pad_h: 0\npad_w: 3\n    kernel_h: 1\nkernel_w: 7\n    stride: 1\n    weight_filler {\n        type: \"xavier\"\n    }\n  }\n\n}\nlayer {\n  name: \"mixed_6/tower_conv_1_conv2d_bn\"\n  type: \"BatchNorm\"\n  bottom: \"mixed_6/tower_conv_1_conv2d\"\n  top: \"mixed_6/tower_conv_1_conv2d_bn\"\n  batch_norm_param {\n    use_global_stats: false\n    eps: 0.001\n  }\n  param {\n    lr_mult: 0\n  }\n  param {\n    lr_mult: 0\n  }\n  param {\n    lr_mult: 0\n  }\n}\nlayer {\n  name: \"mixed_6/tower_conv_1_conv2d_relu\"\n  type: \"ReLU\"\n  bottom: \"mixed_6/tower_conv_1_conv2d_bn\"\n  top: \"mixed_6/tower_conv_1_conv2d_relu\"\n}\nlayer {\n  name: \"mixed_6/tower_conv_2_conv2d\"\n  type: \"Convolution\"\n  bottom: \"mixed_6/tower_conv_1_conv2d_relu\"\n  top: \"mixed_6/tower_conv_2_conv2d\"\n  convolution_param {\n    bias_term: false\n    num_output: 192\n    pad_h: 3\npad_w: 0\n    kernel_h: 7\nkernel_w: 1\n    stride: 1\n    weight_filler {\n        type: \"xavier\"\n    }\n  }\n\n}\nlayer {\n  name: \"mixed_6/tower_conv_2_conv2d_bn\"\n  type: \"BatchNorm\"\n  bottom: \"mixed_6/tower_conv_2_conv2d\"\n  top: \"mixed_6/tower_conv_2_conv2d_bn\"\n  batch_norm_param {\n    use_global_stats: false\n    eps: 0.001\n  }\n  param {\n    lr_mult: 0\n  }\n  param {\n    lr_mult: 0\n  }\n  param {\n    lr_mult: 0\n  }\n}\nlayer {\n  name: \"mixed_6/tower_conv_2_conv2d_relu\"\n  type: \"ReLU\"\n  bottom: \"mixed_6/tower_conv_2_conv2d_bn\"\n  top: \"mixed_6/tower_conv_2_conv2d_relu\"\n}\nlayer {\n  name: \"mixed_6/tower_1_conv_conv2d\"\n  type: \"Convolution\"\n  bottom: \"mixed_5/chconcat\"\n  top: \"mixed_6/tower_1_conv_conv2d\"\n  convolution_param {\n    bias_term: false\n    num_output: 160\n    pad: 0\n    kernel_size: 1\n    stride: 1\n    weight_filler {\n        type: \"xavier\"\n    }\n  }\n\n}\nlayer {\n  name: \"mixed_6/tower_1_conv_conv2d_bn\"\n  type: \"BatchNorm\"\n  bottom: \"mixed_6/tower_1_conv_conv2d\"\n  top: \"mixed_6/tower_1_conv_conv2d_bn\"\n  batch_norm_param {\n    use_global_stats: false\n    eps: 0.001\n  }\n  param {\n    lr_mult: 0\n  }\n  param {\n    lr_mult: 0\n  }\n  param {\n    lr_mult: 0\n  }\n}\nlayer {\n  name: \"mixed_6/tower_1_conv_conv2d_relu\"\n  type: \"ReLU\"\n  bottom: \"mixed_6/tower_1_conv_conv2d_bn\"\n  top: \"mixed_6/tower_1_conv_conv2d_relu\"\n}\nlayer {\n  name: \"mixed_6/tower_1_conv_1_conv2d\"\n  type: \"Convolution\"\n  bottom: \"mixed_6/tower_1_conv_conv2d_relu\"\n  top: \"mixed_6/tower_1_conv_1_conv2d\"\n  convolution_param {\n    bias_term: false\n    num_output: 160\n    pad_h: 3\npad_w: 0\n    kernel_h: 7\nkernel_w: 1\n    stride: 1\n    weight_filler {\n        type: \"xavier\"\n    }\n  }\n\n}\nlayer {\n  name: \"mixed_6/tower_1_conv_1_conv2d_bn\"\n  type: \"BatchNorm\"\n  bottom: \"mixed_6/tower_1_conv_1_conv2d\"\n  top: \"mixed_6/tower_1_conv_1_conv2d_bn\"\n  batch_norm_param {\n    use_global_stats: false\n    eps: 0.001\n  }\n  param {\n    lr_mult: 0\n  }\n  param {\n    lr_mult: 0\n  }\n  param {\n    lr_mult: 0\n  }\n}\nlayer {\n  name: \"mixed_6/tower_1_conv_1_conv2d_relu\"\n  type: \"ReLU\"\n  bottom: \"mixed_6/tower_1_conv_1_conv2d_bn\"\n  top: \"mixed_6/tower_1_conv_1_conv2d_relu\"\n}\nlayer {\n  name: \"mixed_6/tower_1_conv_2_conv2d\"\n  type: \"Convolution\"\n  bottom: \"mixed_6/tower_1_conv_1_conv2d_relu\"\n  top: \"mixed_6/tower_1_conv_2_conv2d\"\n  convolution_param {\n    bias_term: false\n    num_output: 160\n    pad_h: 0\npad_w: 3\n    kernel_h: 1\nkernel_w: 7\n    stride: 1\n    weight_filler {\n        type: \"xavier\"\n    }\n  }\n\n}\nlayer {\n  name: \"mixed_6/tower_1_conv_2_conv2d_bn\"\n  type: \"BatchNorm\"\n  bottom: \"mixed_6/tower_1_conv_2_conv2d\"\n  top: \"mixed_6/tower_1_conv_2_conv2d_bn\"\n  batch_norm_param {\n    use_global_stats: false\n    eps: 0.001\n  }\n  param {\n    lr_mult: 0\n  }\n  param {\n    lr_mult: 0\n  }\n  param {\n    lr_mult: 0\n  }\n}\nlayer {\n  name: \"mixed_6/tower_1_conv_2_conv2d_relu\"\n  type: \"ReLU\"\n  bottom: \"mixed_6/tower_1_conv_2_conv2d_bn\"\n  top: \"mixed_6/tower_1_conv_2_conv2d_relu\"\n}\nlayer {\n  name: \"mixed_6/tower_1_conv_3_conv2d\"\n  type: \"Convolution\"\n  bottom: \"mixed_6/tower_1_conv_2_conv2d_relu\"\n  top: \"mixed_6/tower_1_conv_3_conv2d\"\n  convolution_param {\n    bias_term: false\n    num_output: 160\n    pad_h: 3\npad_w: 0\n    kernel_h: 7\nkernel_w: 1\n    stride: 1\n    weight_filler {\n        type: \"xavier\"\n    }\n  }\n\n}\nlayer {\n  name: \"mixed_6/tower_1_conv_3_conv2d_bn\"\n  type: \"BatchNorm\"\n  bottom: \"mixed_6/tower_1_conv_3_conv2d\"\n  top: \"mixed_6/tower_1_conv_3_conv2d_bn\"\n  batch_norm_param {\n    use_global_stats: false\n    eps: 0.001\n  }\n  param {\n    lr_mult: 0\n  }\n  param {\n    lr_mult: 0\n  }\n  param {\n    lr_mult: 0\n  }\n}\nlayer {\n  name: \"mixed_6/tower_1_conv_3_conv2d_relu\"\n  type: \"ReLU\"\n  bottom: \"mixed_6/tower_1_conv_3_conv2d_bn\"\n  top: \"mixed_6/tower_1_conv_3_conv2d_relu\"\n}\nlayer {\n  name: \"mixed_6/tower_1_conv_4_conv2d\"\n  type: \"Convolution\"\n  bottom: \"mixed_6/tower_1_conv_3_conv2d_relu\"\n  top: \"mixed_6/tower_1_conv_4_conv2d\"\n  convolution_param {\n    bias_term: false\n    num_output: 192\n    pad_h: 0\npad_w: 3\n    kernel_h: 1\nkernel_w: 7\n    stride: 1\n    weight_filler {\n        type: \"xavier\"\n    }\n  }\n\n}\nlayer {\n  name: \"mixed_6/tower_1_conv_4_conv2d_bn\"\n  type: \"BatchNorm\"\n  bottom: \"mixed_6/tower_1_conv_4_conv2d\"\n  top: \"mixed_6/tower_1_conv_4_conv2d_bn\"\n  batch_norm_param {\n    use_global_stats: false\n    eps: 0.001\n  }\n  param {\n    lr_mult: 0\n  }\n  param {\n    lr_mult: 0\n  }\n  param {\n    lr_mult: 0\n  }\n}\nlayer {\n  name: \"mixed_6/tower_1_conv_4_conv2d_relu\"\n  type: \"ReLU\"\n  bottom: \"mixed_6/tower_1_conv_4_conv2d_bn\"\n  top: \"mixed_6/tower_1_conv_4_conv2d_relu\"\n}\nlayer {\n  name: \"mixed_6/tower_2_AVG_pool\"\n  type: \"Pooling\"\n  bottom: \"mixed_5/chconcat\"\n  top: \"mixed_6/tower_2_AVG_pool\"\n  pooling_param {\n    pool: AVE\n    pad: 1\n    kernel_size: 3\n    stride: 1\n  }\n}\nlayer {\n  name: \"mixed_6/tower_2_conv_conv2d\"\n  type: \"Convolution\"\n  bottom: \"mixed_6/tower_2_AVG_pool\"\n  top: \"mixed_6/tower_2_conv_conv2d\"\n  convolution_param {\n    bias_term: false\n    num_output: 192\n    pad: 0\n    kernel_size: 1\n    stride: 1\n    weight_filler {\n        type: \"xavier\"\n    }\n  }\n\n}\nlayer {\n  name: \"mixed_6/tower_2_conv_conv2d_bn\"\n  type: \"BatchNorm\"\n  bottom: \"mixed_6/tower_2_conv_conv2d\"\n  top: \"mixed_6/tower_2_conv_conv2d_bn\"\n  batch_norm_param {\n    use_global_stats: false\n    eps: 0.001\n  }\n  param {\n    lr_mult: 0\n  }\n  param {\n    lr_mult: 0\n  }\n  param {\n    lr_mult: 0\n  }\n}\nlayer {\n  name: \"mixed_6/tower_2_conv_conv2d_relu\"\n  type: \"ReLU\"\n  bottom: \"mixed_6/tower_2_conv_conv2d_bn\"\n  top: \"mixed_6/tower_2_conv_conv2d_relu\"\n}\nlayer {\n  name: \"mixed_6/chconcat\"\n  bottom: \"mixed_6/conv_conv2d_relu\"\nbottom: \"mixed_6/tower_conv_2_conv2d_relu\"\nbottom: \"mixed_6/tower_1_conv_4_conv2d_relu\"\nbottom: \"mixed_6/tower_2_conv_conv2d_relu\"\n\n  top: \"mixed_6/chconcat\"\n  type: \"Concat\"\n  concat_param {\n    axis: 1\n  }\n}\nlayer {\n  name: \"mixed_7/conv_conv2d\"\n  type: \"Convolution\"\n  bottom: \"mixed_6/chconcat\"\n  top: \"mixed_7/conv_conv2d\"\n  convolution_param {\n    bias_term: false\n    num_output: 192\n    pad: 0\n    kernel_size: 1\n    stride: 1\n    weight_filler {\n        type: \"xavier\"\n    }\n  }\n\n}\nlayer {\n  name: \"mixed_7/conv_conv2d_bn\"\n  type: \"BatchNorm\"\n  bottom: \"mixed_7/conv_conv2d\"\n  top: \"mixed_7/conv_conv2d_bn\"\n  batch_norm_param {\n    use_global_stats: false\n    eps: 0.001\n  }\n  param {\n    lr_mult: 0\n  }\n  param {\n    lr_mult: 0\n  }\n  param {\n    lr_mult: 0\n  }\n}\nlayer {\n  name: \"mixed_7/conv_conv2d_relu\"\n  type: \"ReLU\"\n  bottom: \"mixed_7/conv_conv2d_bn\"\n  top: \"mixed_7/conv_conv2d_relu\"\n}\nlayer {\n  name: \"mixed_7/tower_conv_conv2d\"\n  type: \"Convolution\"\n  bottom: \"mixed_6/chconcat\"\n  top: \"mixed_7/tower_conv_conv2d\"\n  convolution_param {\n    bias_term: false\n    num_output: 192\n    pad: 0\n    kernel_size: 1\n    stride: 1\n    weight_filler {\n        type: \"xavier\"\n    }\n  }\n\n}\nlayer {\n  name: \"mixed_7/tower_conv_conv2d_bn\"\n  type: \"BatchNorm\"\n  bottom: \"mixed_7/tower_conv_conv2d\"\n  top: \"mixed_7/tower_conv_conv2d_bn\"\n  batch_norm_param {\n    use_global_stats: false\n    eps: 0.001\n  }\n  param {\n    lr_mult: 0\n  }\n  param {\n    lr_mult: 0\n  }\n  param {\n    lr_mult: 0\n  }\n}\nlayer {\n  name: \"mixed_7/tower_conv_conv2d_relu\"\n  type: \"ReLU\"\n  bottom: \"mixed_7/tower_conv_conv2d_bn\"\n  top: \"mixed_7/tower_conv_conv2d_relu\"\n}\nlayer {\n  name: \"mixed_7/tower_conv_1_conv2d\"\n  type: \"Convolution\"\n  bottom: \"mixed_7/tower_conv_conv2d_relu\"\n  top: \"mixed_7/tower_conv_1_conv2d\"\n  convolution_param {\n    bias_term: false\n    num_output: 192\n    pad_h: 0\npad_w: 3\n    kernel_h: 1\nkernel_w: 7\n    stride: 1\n    weight_filler {\n        type: \"xavier\"\n    }\n  }\n\n}\nlayer {\n  name: \"mixed_7/tower_conv_1_conv2d_bn\"\n  type: \"BatchNorm\"\n  bottom: \"mixed_7/tower_conv_1_conv2d\"\n  top: \"mixed_7/tower_conv_1_conv2d_bn\"\n  batch_norm_param {\n    use_global_stats: false\n    eps: 0.001\n  }\n  param {\n    lr_mult: 0\n  }\n  param {\n    lr_mult: 0\n  }\n  param {\n    lr_mult: 0\n  }\n}\nlayer {\n  name: \"mixed_7/tower_conv_1_conv2d_relu\"\n  type: \"ReLU\"\n  bottom: \"mixed_7/tower_conv_1_conv2d_bn\"\n  top: \"mixed_7/tower_conv_1_conv2d_relu\"\n}\nlayer {\n  name: \"mixed_7/tower_conv_2_conv2d\"\n  type: \"Convolution\"\n  bottom: \"mixed_7/tower_conv_1_conv2d_relu\"\n  top: \"mixed_7/tower_conv_2_conv2d\"\n  convolution_param {\n    bias_term: false\n    num_output: 192\n    pad_h: 3\npad_w: 0\n    kernel_h: 7\nkernel_w: 1\n    stride: 1\n    weight_filler {\n        type: \"xavier\"\n    }\n  }\n\n}\nlayer {\n  name: \"mixed_7/tower_conv_2_conv2d_bn\"\n  type: \"BatchNorm\"\n  bottom: \"mixed_7/tower_conv_2_conv2d\"\n  top: \"mixed_7/tower_conv_2_conv2d_bn\"\n  batch_norm_param {\n    use_global_stats: false\n    eps: 0.001\n  }\n  param {\n    lr_mult: 0\n  }\n  param {\n    lr_mult: 0\n  }\n  param {\n    lr_mult: 0\n  }\n}\nlayer {\n  name: \"mixed_7/tower_conv_2_conv2d_relu\"\n  type: \"ReLU\"\n  bottom: \"mixed_7/tower_conv_2_conv2d_bn\"\n  top: \"mixed_7/tower_conv_2_conv2d_relu\"\n}\nlayer {\n  name: \"mixed_7/tower_1_conv_conv2d\"\n  type: \"Convolution\"\n  bottom: \"mixed_6/chconcat\"\n  top: \"mixed_7/tower_1_conv_conv2d\"\n  convolution_param {\n    bias_term: false\n    num_output: 192\n    pad: 0\n    kernel_size: 1\n    stride: 1\n    weight_filler {\n        type: \"xavier\"\n    }\n  }\n\n}\nlayer {\n  name: \"mixed_7/tower_1_conv_conv2d_bn\"\n  type: \"BatchNorm\"\n  bottom: \"mixed_7/tower_1_conv_conv2d\"\n  top: \"mixed_7/tower_1_conv_conv2d_bn\"\n  batch_norm_param {\n    use_global_stats: false\n    eps: 0.001\n  }\n  param {\n    lr_mult: 0\n  }\n  param {\n    lr_mult: 0\n  }\n  param {\n    lr_mult: 0\n  }\n}\nlayer {\n  name: \"mixed_7/tower_1_conv_conv2d_relu\"\n  type: \"ReLU\"\n  bottom: \"mixed_7/tower_1_conv_conv2d_bn\"\n  top: \"mixed_7/tower_1_conv_conv2d_relu\"\n}\nlayer {\n  name: \"mixed_7/tower_1_conv_1_conv2d\"\n  type: \"Convolution\"\n  bottom: \"mixed_7/tower_1_conv_conv2d_relu\"\n  top: \"mixed_7/tower_1_conv_1_conv2d\"\n  convolution_param {\n    bias_term: false\n    num_output: 192\n    pad_h: 3\npad_w: 0\n    kernel_h: 7\nkernel_w: 1\n    stride: 1\n    weight_filler {\n        type: \"xavier\"\n    }\n  }\n\n}\nlayer {\n  name: \"mixed_7/tower_1_conv_1_conv2d_bn\"\n  type: \"BatchNorm\"\n  bottom: \"mixed_7/tower_1_conv_1_conv2d\"\n  top: \"mixed_7/tower_1_conv_1_conv2d_bn\"\n  batch_norm_param {\n    use_global_stats: false\n    eps: 0.001\n  }\n  param {\n    lr_mult: 0\n  }\n  param {\n    lr_mult: 0\n  }\n  param {\n    lr_mult: 0\n  }\n}\nlayer {\n  name: \"mixed_7/tower_1_conv_1_conv2d_relu\"\n  type: \"ReLU\"\n  bottom: \"mixed_7/tower_1_conv_1_conv2d_bn\"\n  top: \"mixed_7/tower_1_conv_1_conv2d_relu\"\n}\nlayer {\n  name: \"mixed_7/tower_1_conv_2_conv2d\"\n  type: \"Convolution\"\n  bottom: \"mixed_7/tower_1_conv_1_conv2d_relu\"\n  top: \"mixed_7/tower_1_conv_2_conv2d\"\n  convolution_param {\n    bias_term: false\n    num_output: 192\n    pad_h: 0\npad_w: 3\n    kernel_h: 1\nkernel_w: 7\n    stride: 1\n    weight_filler {\n        type: \"xavier\"\n    }\n  }\n\n}\nlayer {\n  name: \"mixed_7/tower_1_conv_2_conv2d_bn\"\n  type: \"BatchNorm\"\n  bottom: \"mixed_7/tower_1_conv_2_conv2d\"\n  top: \"mixed_7/tower_1_conv_2_conv2d_bn\"\n  batch_norm_param {\n    use_global_stats: false\n    eps: 0.001\n  }\n  param {\n    lr_mult: 0\n  }\n  param {\n    lr_mult: 0\n  }\n  param {\n    lr_mult: 0\n  }\n}\nlayer {\n  name: \"mixed_7/tower_1_conv_2_conv2d_relu\"\n  type: \"ReLU\"\n  bottom: \"mixed_7/tower_1_conv_2_conv2d_bn\"\n  top: \"mixed_7/tower_1_conv_2_conv2d_relu\"\n}\nlayer {\n  name: \"mixed_7/tower_1_conv_3_conv2d\"\n  type: \"Convolution\"\n  bottom: \"mixed_7/tower_1_conv_2_conv2d_relu\"\n  top: \"mixed_7/tower_1_conv_3_conv2d\"\n  convolution_param {\n    bias_term: false\n    num_output: 192\n    pad_h: 3\npad_w: 0\n    kernel_h: 7\nkernel_w: 1\n    stride: 1\n    weight_filler {\n        type: \"xavier\"\n    }\n  }\n\n}\nlayer {\n  name: \"mixed_7/tower_1_conv_3_conv2d_bn\"\n  type: \"BatchNorm\"\n  bottom: \"mixed_7/tower_1_conv_3_conv2d\"\n  top: \"mixed_7/tower_1_conv_3_conv2d_bn\"\n  batch_norm_param {\n    use_global_stats: false\n    eps: 0.001\n  }\n  param {\n    lr_mult: 0\n  }\n  param {\n    lr_mult: 0\n  }\n  param {\n    lr_mult: 0\n  }\n}\nlayer {\n  name: \"mixed_7/tower_1_conv_3_conv2d_relu\"\n  type: \"ReLU\"\n  bottom: \"mixed_7/tower_1_conv_3_conv2d_bn\"\n  top: \"mixed_7/tower_1_conv_3_conv2d_relu\"\n}\nlayer {\n  name: \"mixed_7/tower_1_conv_4_conv2d\"\n  type: \"Convolution\"\n  bottom: \"mixed_7/tower_1_conv_3_conv2d_relu\"\n  top: \"mixed_7/tower_1_conv_4_conv2d\"\n  convolution_param {\n    bias_term: false\n    num_output: 192\n    pad_h: 0\npad_w: 3\n    kernel_h: 1\nkernel_w: 7\n    stride: 1\n    weight_filler {\n        type: \"xavier\"\n    }\n  }\n\n}\nlayer {\n  name: \"mixed_7/tower_1_conv_4_conv2d_bn\"\n  type: \"BatchNorm\"\n  bottom: \"mixed_7/tower_1_conv_4_conv2d\"\n  top: \"mixed_7/tower_1_conv_4_conv2d_bn\"\n  batch_norm_param {\n    use_global_stats: false\n    eps: 0.001\n  }\n  param {\n    lr_mult: 0\n  }\n  param {\n    lr_mult: 0\n  }\n  param {\n    lr_mult: 0\n  }\n}\nlayer {\n  name: \"mixed_7/tower_1_conv_4_conv2d_relu\"\n  type: \"ReLU\"\n  bottom: \"mixed_7/tower_1_conv_4_conv2d_bn\"\n  top: \"mixed_7/tower_1_conv_4_conv2d_relu\"\n}\nlayer {\n  name: \"mixed_7/tower_2_AVG_pool\"\n  type: \"Pooling\"\n  bottom: \"mixed_6/chconcat\"\n  top: \"mixed_7/tower_2_AVG_pool\"\n  pooling_param {\n    pool: AVE\n    pad: 1\n    kernel_size: 3\n    stride: 1\n  }\n}\nlayer {\n  name: \"mixed_7/tower_2_conv_conv2d\"\n  type: \"Convolution\"\n  bottom: \"mixed_7/tower_2_AVG_pool\"\n  top: \"mixed_7/tower_2_conv_conv2d\"\n  convolution_param {\n    bias_term: false\n    num_output: 192\n    pad: 0\n    kernel_size: 1\n    stride: 1\n    weight_filler {\n        type: \"xavier\"\n    }\n  }\n\n}\nlayer {\n  name: \"mixed_7/tower_2_conv_conv2d_bn\"\n  type: \"BatchNorm\"\n  bottom: \"mixed_7/tower_2_conv_conv2d\"\n  top: \"mixed_7/tower_2_conv_conv2d_bn\"\n  batch_norm_param {\n    use_global_stats: false\n    eps: 0.001\n  }\n  param {\n    lr_mult: 0\n  }\n  param {\n    lr_mult: 0\n  }\n  param {\n    lr_mult: 0\n  }\n}\nlayer {\n  name: \"mixed_7/tower_2_conv_conv2d_relu\"\n  type: \"ReLU\"\n  bottom: \"mixed_7/tower_2_conv_conv2d_bn\"\n  top: \"mixed_7/tower_2_conv_conv2d_relu\"\n}\nlayer {\n  name: \"mixed_7/chconcat\"\n  bottom: \"mixed_7/conv_conv2d_relu\"\nbottom: \"mixed_7/tower_conv_2_conv2d_relu\"\nbottom: \"mixed_7/tower_1_conv_4_conv2d_relu\"\nbottom: \"mixed_7/tower_2_conv_conv2d_relu\"\n\n  top: \"mixed_7/chconcat\"\n  type: \"Concat\"\n  concat_param {\n    axis: 1\n  }\n}\nlayer {\n  name: \"mixed_8/tower_conv_conv2d\"\n  type: \"Convolution\"\n  bottom: \"mixed_7/chconcat\"\n  top: \"mixed_8/tower_conv_conv2d\"\n  convolution_param {\n    bias_term: false\n    num_output: 192\n    pad: 0\n    kernel_size: 1\n    stride: 1\n    weight_filler {\n        type: \"xavier\"\n    }\n  }\n\n}\nlayer {\n  name: \"mixed_8/tower_conv_conv2d_bn\"\n  type: \"BatchNorm\"\n  bottom: \"mixed_8/tower_conv_conv2d\"\n  top: \"mixed_8/tower_conv_conv2d_bn\"\n  batch_norm_param {\n    use_global_stats: false\n    eps: 0.001\n  }\n  param {\n    lr_mult: 0\n  }\n  param {\n    lr_mult: 0\n  }\n  param {\n    lr_mult: 0\n  }\n}\nlayer {\n  name: \"mixed_8/tower_conv_conv2d_relu\"\n  type: \"ReLU\"\n  bottom: \"mixed_8/tower_conv_conv2d_bn\"\n  top: \"mixed_8/tower_conv_conv2d_relu\"\n}\nlayer {\n  name: \"mixed_8/tower_conv_1_conv2d\"\n  type: \"Convolution\"\n  bottom: \"mixed_8/tower_conv_conv2d_relu\"\n  top: \"mixed_8/tower_conv_1_conv2d\"\n  convolution_param {\n    bias_term: false\n    num_output: 320\n    pad: 0\n    kernel_size: 3\n    stride: 2\n    weight_filler {\n        type: \"xavier\"\n    }\n  }\n\n}\nlayer {\n  name: \"mixed_8/tower_conv_1_conv2d_bn\"\n  type: \"BatchNorm\"\n  bottom: \"mixed_8/tower_conv_1_conv2d\"\n  top: \"mixed_8/tower_conv_1_conv2d_bn\"\n  batch_norm_param {\n    use_global_stats: false\n    eps: 0.001\n  }\n  param {\n    lr_mult: 0\n  }\n  param {\n    lr_mult: 0\n  }\n  param {\n    lr_mult: 0\n  }\n}\nlayer {\n  name: \"mixed_8/tower_conv_1_conv2d_relu\"\n  type: \"ReLU\"\n  bottom: \"mixed_8/tower_conv_1_conv2d_bn\"\n  top: \"mixed_8/tower_conv_1_conv2d_relu\"\n}\nlayer {\n  name: \"mixed_8/tower_1_conv_conv2d\"\n  type: \"Convolution\"\n  bottom: \"mixed_7/chconcat\"\n  top: \"mixed_8/tower_1_conv_conv2d\"\n  convolution_param {\n    bias_term: false\n    num_output: 192\n    pad: 0\n    kernel_size: 1\n    stride: 1\n    weight_filler {\n        type: \"xavier\"\n    }\n  }\n\n}\nlayer {\n  name: \"mixed_8/tower_1_conv_conv2d_bn\"\n  type: \"BatchNorm\"\n  bottom: \"mixed_8/tower_1_conv_conv2d\"\n  top: \"mixed_8/tower_1_conv_conv2d_bn\"\n  batch_norm_param {\n    use_global_stats: false\n    eps: 0.001\n  }\n  param {\n    lr_mult: 0\n  }\n  param {\n    lr_mult: 0\n  }\n  param {\n    lr_mult: 0\n  }\n}\nlayer {\n  name: \"mixed_8/tower_1_conv_conv2d_relu\"\n  type: \"ReLU\"\n  bottom: \"mixed_8/tower_1_conv_conv2d_bn\"\n  top: \"mixed_8/tower_1_conv_conv2d_relu\"\n}\nlayer {\n  name: \"mixed_8/tower_1_conv_1_conv2d\"\n  type: \"Convolution\"\n  bottom: \"mixed_8/tower_1_conv_conv2d_relu\"\n  top: \"mixed_8/tower_1_conv_1_conv2d\"\n  convolution_param {\n    bias_term: false\n    num_output: 192\n    pad_h: 0\npad_w: 3\n    kernel_h: 1\nkernel_w: 7\n    stride: 1\n    weight_filler {\n        type: \"xavier\"\n    }\n  }\n\n}\nlayer {\n  name: \"mixed_8/tower_1_conv_1_conv2d_bn\"\n  type: \"BatchNorm\"\n  bottom: \"mixed_8/tower_1_conv_1_conv2d\"\n  top: \"mixed_8/tower_1_conv_1_conv2d_bn\"\n  batch_norm_param {\n    use_global_stats: false\n    eps: 0.001\n  }\n  param {\n    lr_mult: 0\n  }\n  param {\n    lr_mult: 0\n  }\n  param {\n    lr_mult: 0\n  }\n}\nlayer {\n  name: \"mixed_8/tower_1_conv_1_conv2d_relu\"\n  type: \"ReLU\"\n  bottom: \"mixed_8/tower_1_conv_1_conv2d_bn\"\n  top: \"mixed_8/tower_1_conv_1_conv2d_relu\"\n}\nlayer {\n  name: \"mixed_8/tower_1_conv_2_conv2d\"\n  type: \"Convolution\"\n  bottom: \"mixed_8/tower_1_conv_1_conv2d_relu\"\n  top: \"mixed_8/tower_1_conv_2_conv2d\"\n  convolution_param {\n    bias_term: false\n    num_output: 192\n    pad_h: 3\npad_w: 0\n    kernel_h: 7\nkernel_w: 1\n    stride: 1\n    weight_filler {\n        type: \"xavier\"\n    }\n  }\n\n}\nlayer {\n  name: \"mixed_8/tower_1_conv_2_conv2d_bn\"\n  type: \"BatchNorm\"\n  bottom: \"mixed_8/tower_1_conv_2_conv2d\"\n  top: \"mixed_8/tower_1_conv_2_conv2d_bn\"\n  batch_norm_param {\n    use_global_stats: false\n    eps: 0.001\n  }\n  param {\n    lr_mult: 0\n  }\n  param {\n    lr_mult: 0\n  }\n  param {\n    lr_mult: 0\n  }\n}\nlayer {\n  name: \"mixed_8/tower_1_conv_2_conv2d_relu\"\n  type: \"ReLU\"\n  bottom: \"mixed_8/tower_1_conv_2_conv2d_bn\"\n  top: \"mixed_8/tower_1_conv_2_conv2d_relu\"\n}\nlayer {\n  name: \"mixed_8/tower_1_conv_3_conv2d\"\n  type: \"Convolution\"\n  bottom: \"mixed_8/tower_1_conv_2_conv2d_relu\"\n  top: \"mixed_8/tower_1_conv_3_conv2d\"\n  convolution_param {\n    bias_term: false\n    num_output: 192\n    pad: 0\n    kernel_size: 3\n    stride: 2\n    weight_filler {\n        type: \"xavier\"\n    }\n  }\n\n}\nlayer {\n  name: \"mixed_8/tower_1_conv_3_conv2d_bn\"\n  type: \"BatchNorm\"\n  bottom: \"mixed_8/tower_1_conv_3_conv2d\"\n  top: \"mixed_8/tower_1_conv_3_conv2d_bn\"\n  batch_norm_param {\n    use_global_stats: false\n    eps: 0.001\n  }\n  param {\n    lr_mult: 0\n  }\n  param {\n    lr_mult: 0\n  }\n  param {\n    lr_mult: 0\n  }\n}\nlayer {\n  name: \"mixed_8/tower_1_conv_3_conv2d_relu\"\n  type: \"ReLU\"\n  bottom: \"mixed_8/tower_1_conv_3_conv2d_bn\"\n  top: \"mixed_8/tower_1_conv_3_conv2d_relu\"\n}\nlayer {\n  name: \"mixed_8/max_pool\"\n  type: \"Pooling\"\n  bottom: \"mixed_7/chconcat\"\n  top: \"mixed_8/max_pool\"\n  pooling_param {\n    pool: MAX\n    pad: 0\n    kernel_size: 3\n    stride: 2\n  }\n}\nlayer {\n  name: \"mixed_8/chconcat\"\n  bottom: \"mixed_8/tower_conv_1_conv2d_relu\"\nbottom: \"mixed_8/tower_1_conv_3_conv2d_relu\"\nbottom: \"mixed_8/max_pool\"\n\n  top: \"mixed_8/chconcat\"\n  type: \"Concat\"\n  concat_param {\n    axis: 1\n  }\n}\nlayer {\n  name: \"mixed_9/conv_conv2d\"\n  type: \"Convolution\"\n  bottom: \"mixed_8/chconcat\"\n  top: \"mixed_9/conv_conv2d\"\n  convolution_param {\n    bias_term: false\n    num_output: 320\n    pad: 0\n    kernel_h: 1\nkernel_w: 1\n    stride: 1\n    weight_filler {\n        type: \"xavier\"\n    }\n  }\n\n}\nlayer {\n  name: \"mixed_9/conv_conv2d_bn\"\n  type: \"BatchNorm\"\n  bottom: \"mixed_9/conv_conv2d\"\n  top: \"mixed_9/conv_conv2d_bn\"\n  batch_norm_param {\n    use_global_stats: false\n    eps: 0.001\n  }\n  param {\n    lr_mult: 0\n  }\n  param {\n    lr_mult: 0\n  }\n  param {\n    lr_mult: 0\n  }\n}\nlayer {\n  name: \"mixed_9/conv_conv2d_relu\"\n  type: \"ReLU\"\n  bottom: \"mixed_9/conv_conv2d_bn\"\n  top: \"mixed_9/conv_conv2d_relu\"\n}\nlayer {\n  name: \"mixed_9/tower_conv_conv2d\"\n  type: \"Convolution\"\n  bottom: \"mixed_8/chconcat\"\n  top: \"mixed_9/tower_conv_conv2d\"\n  convolution_param {\n    bias_term: false\n    num_output: 384\n    pad: 0\n    kernel_size: 1\n    stride: 1\n    weight_filler {\n        type: \"xavier\"\n    }\n  }\n\n}\nlayer {\n  name: \"mixed_9/tower_conv_conv2d_bn\"\n  type: \"BatchNorm\"\n  bottom: \"mixed_9/tower_conv_conv2d\"\n  top: \"mixed_9/tower_conv_conv2d_bn\"\n  batch_norm_param {\n    use_global_stats: false\n    eps: 0.001\n  }\n  param {\n    lr_mult: 0\n  }\n  param {\n    lr_mult: 0\n  }\n  param {\n    lr_mult: 0\n  }\n}\nlayer {\n  name: \"mixed_9/tower_conv_conv2d_relu\"\n  type: \"ReLU\"\n  bottom: \"mixed_9/tower_conv_conv2d_bn\"\n  top: \"mixed_9/tower_conv_conv2d_relu\"\n}\nlayer {\n  name: \"mixed_9/tower_mixed_conv/conv2d\"\n  type: \"Convolution\"\n  bottom: \"mixed_9/tower_conv_conv2d_relu\"\n  top: \"mixed_9/tower_mixed_conv/conv2d\"\n  convolution_param {\n    bias_term: false\n    num_output: 384\n    pad_h: 0\npad_w: 1\n    kernel_h: 1\nkernel_w: 3\n    stride: 1\n    weight_filler {\n        type: \"xavier\"\n    }\n  }\n\n}\nlayer {\n  name: \"mixed_9/tower_mixed_conv/conv2d_bn\"\n  type: \"BatchNorm\"\n  bottom: \"mixed_9/tower_mixed_conv/conv2d\"\n  top: \"mixed_9/tower_mixed_conv/conv2d_bn\"\n  batch_norm_param {\n    use_global_stats: false\n    eps: 0.001\n  }\n  param {\n    lr_mult: 0\n  }\n  param {\n    lr_mult: 0\n  }\n  param {\n    lr_mult: 0\n  }\n}\nlayer {\n  name: \"mixed_9/tower_mixed_conv/conv2d_relu\"\n  type: \"ReLU\"\n  bottom: \"mixed_9/tower_mixed_conv/conv2d_bn\"\n  top: \"mixed_9/tower_mixed_conv/conv2d_relu\"\n}\nlayer {\n  name: \"mixed_9/tower_mixed_conv/1_conv2d\"\n  type: \"Convolution\"\n  bottom: \"mixed_9/tower_conv_conv2d_relu\"\n  top: \"mixed_9/tower_mixed_conv/1_conv2d\"\n  convolution_param {\n    bias_term: false\n    num_output: 384\n    pad_h: 1\npad_w: 0\n    kernel_h: 3\nkernel_w: 1\n    stride: 1\n    weight_filler {\n        type: \"xavier\"\n    }\n  }\n\n}\nlayer {\n  name: \"mixed_9/tower_mixed_conv/1_conv2d_bn\"\n  type: \"BatchNorm\"\n  bottom: \"mixed_9/tower_mixed_conv/1_conv2d\"\n  top: \"mixed_9/tower_mixed_conv/1_conv2d_bn\"\n  batch_norm_param {\n    use_global_stats: false\n    eps: 0.001\n  }\n  param {\n    lr_mult: 0\n  }\n  param {\n    lr_mult: 0\n  }\n  param {\n    lr_mult: 0\n  }\n}\nlayer {\n  name: \"mixed_9/tower_mixed_conv/1_conv2d_relu\"\n  type: \"ReLU\"\n  bottom: \"mixed_9/tower_mixed_conv/1_conv2d_bn\"\n  top: \"mixed_9/tower_mixed_conv/1_conv2d_relu\"\n}\nlayer {\n  name: \"mixed_9/tower_1_conv_conv2d\"\n  type: \"Convolution\"\n  bottom: \"mixed_8/chconcat\"\n  top: \"mixed_9/tower_1_conv_conv2d\"\n  convolution_param {\n    bias_term: false\n    num_output: 448\n    pad: 0\n    kernel_size: 1\n    stride: 1\n    weight_filler {\n        type: \"xavier\"\n    }\n  }\n\n}\nlayer {\n  name: \"mixed_9/tower_1_conv_conv2d_bn\"\n  type: \"BatchNorm\"\n  bottom: \"mixed_9/tower_1_conv_conv2d\"\n  top: \"mixed_9/tower_1_conv_conv2d_bn\"\n  batch_norm_param {\n    use_global_stats: false\n    eps: 0.001\n  }\n  param {\n    lr_mult: 0\n  }\n  param {\n    lr_mult: 0\n  }\n  param {\n    lr_mult: 0\n  }\n}\nlayer {\n  name: \"mixed_9/tower_1_conv_conv2d_relu\"\n  type: \"ReLU\"\n  bottom: \"mixed_9/tower_1_conv_conv2d_bn\"\n  top: \"mixed_9/tower_1_conv_conv2d_relu\"\n}\nlayer {\n  name: \"mixed_9/tower_1_conv_1_conv2d\"\n  type: \"Convolution\"\n  bottom: \"mixed_9/tower_1_conv_conv2d_relu\"\n  top: \"mixed_9/tower_1_conv_1_conv2d\"\n  convolution_param {\n    bias_term: false\n    num_output: 384\n    pad: 1\n    kernel_size: 3\n    stride: 1\n    weight_filler {\n        type: \"xavier\"\n    }\n  }\n\n}\nlayer {\n  name: \"mixed_9/tower_1_conv_1_conv2d_bn\"\n  type: \"BatchNorm\"\n  bottom: \"mixed_9/tower_1_conv_1_conv2d\"\n  top: \"mixed_9/tower_1_conv_1_conv2d_bn\"\n  batch_norm_param {\n    use_global_stats: false\n    eps: 0.001\n  }\n  param {\n    lr_mult: 0\n  }\n  param {\n    lr_mult: 0\n  }\n  param {\n    lr_mult: 0\n  }\n}\nlayer {\n  name: \"mixed_9/tower_1_conv_1_conv2d_relu\"\n  type: \"ReLU\"\n  bottom: \"mixed_9/tower_1_conv_1_conv2d_bn\"\n  top: \"mixed_9/tower_1_conv_1_conv2d_relu\"\n}\nlayer {\n  name: \"mixed_9/tower_1_mixed_conv/conv2d\"\n  type: \"Convolution\"\n  bottom: \"mixed_9/tower_1_conv_1_conv2d_relu\"\n  top: \"mixed_9/tower_1_mixed_conv/conv2d\"\n  convolution_param {\n    bias_term: false\n    num_output: 384\n    pad_h: 0\npad_w: 1\n    kernel_h: 1\nkernel_w: 3\n    stride: 1\n    weight_filler {\n        type: \"xavier\"\n    }\n  }\n\n}\nlayer {\n  name: \"mixed_9/tower_1_mixed_conv/conv2d_bn\"\n  type: \"BatchNorm\"\n  bottom: \"mixed_9/tower_1_mixed_conv/conv2d\"\n  top: \"mixed_9/tower_1_mixed_conv/conv2d_bn\"\n  batch_norm_param {\n    use_global_stats: false\n    eps: 0.001\n  }\n  param {\n    lr_mult: 0\n  }\n  param {\n    lr_mult: 0\n  }\n  param {\n    lr_mult: 0\n  }\n}\nlayer {\n  name: \"mixed_9/tower_1_mixed_conv/conv2d_relu\"\n  type: \"ReLU\"\n  bottom: \"mixed_9/tower_1_mixed_conv/conv2d_bn\"\n  top: \"mixed_9/tower_1_mixed_conv/conv2d_relu\"\n}\nlayer {\n  name: \"mixed_9/tower_1_mixed_conv/1_conv2d\"\n  type: \"Convolution\"\n  bottom: \"mixed_9/tower_1_conv_1_conv2d_relu\"\n  top: \"mixed_9/tower_1_mixed_conv/1_conv2d\"\n  convolution_param {\n    bias_term: false\n    num_output: 384\n    pad_h: 1\npad_w: 0\n    kernel_h: 3\nkernel_w: 1\n    stride: 1\n    weight_filler {\n        type: \"xavier\"\n    }\n  }\n\n}\nlayer {\n  name: \"mixed_9/tower_1_mixed_conv/1_conv2d_bn\"\n  type: \"BatchNorm\"\n  bottom: \"mixed_9/tower_1_mixed_conv/1_conv2d\"\n  top: \"mixed_9/tower_1_mixed_conv/1_conv2d_bn\"\n  batch_norm_param {\n    use_global_stats: false\n    eps: 0.001\n  }\n  param {\n    lr_mult: 0\n  }\n  param {\n    lr_mult: 0\n  }\n  param {\n    lr_mult: 0\n  }\n}\nlayer {\n  name: \"mixed_9/tower_1_mixed_conv/1_conv2d_relu\"\n  type: \"ReLU\"\n  bottom: \"mixed_9/tower_1_mixed_conv/1_conv2d_bn\"\n  top: \"mixed_9/tower_1_mixed_conv/1_conv2d_relu\"\n}\nlayer {\n  name: \"mixed_9/tower_2_AVG_pool\"\n  type: \"Pooling\"\n  bottom: \"mixed_8/chconcat\"\n  top: \"mixed_9/tower_2_AVG_pool\"\n  pooling_param {\n    pool: AVE\n    pad: 1\n    kernel_size: 3\n    stride: 1\n  }\n}\nlayer {\n  name: \"mixed_9/tower_2_conv_conv2d\"\n  type: \"Convolution\"\n  bottom: \"mixed_9/tower_2_AVG_pool\"\n  top: \"mixed_9/tower_2_conv_conv2d\"\n  convolution_param {\n    bias_term: false\n    num_output: 192\n    pad: 0\n    kernel_size: 1\n    stride: 1\n    weight_filler {\n        type: \"xavier\"\n    }\n  }\n\n}\nlayer {\n  name: \"mixed_9/tower_2_conv_conv2d_bn\"\n  type: \"BatchNorm\"\n  bottom: \"mixed_9/tower_2_conv_conv2d\"\n  top: \"mixed_9/tower_2_conv_conv2d_bn\"\n  batch_norm_param {\n    use_global_stats: false\n    eps: 0.001\n  }\n  param {\n    lr_mult: 0\n  }\n  param {\n    lr_mult: 0\n  }\n  param {\n    lr_mult: 0\n  }\n}\nlayer {\n  name: \"mixed_9/tower_2_conv_conv2d_relu\"\n  type: \"ReLU\"\n  bottom: \"mixed_9/tower_2_conv_conv2d_bn\"\n  top: \"mixed_9/tower_2_conv_conv2d_relu\"\n}\nlayer {\n  name: \"mixed_9/chconcat\"\n  bottom: \"mixed_9/conv_conv2d_relu\"\nbottom: \"mixed_9/tower_mixed_conv/conv2d_relu\"\nbottom: \"mixed_9/tower_mixed_conv/1_conv2d_relu\"\nbottom: \"mixed_9/tower_1_mixed_conv/conv2d_relu\"\nbottom: \"mixed_9/tower_1_mixed_conv/1_conv2d_relu\"\nbottom: \"mixed_9/tower_2_conv_conv2d_relu\"\n\n  top: \"mixed_9/chconcat\"\n  type: \"Concat\"\n  concat_param {\n    axis: 1\n  }\n}\nlayer {\n  name: \"mixed_10/conv_conv2d\"\n  type: \"Convolution\"\n  bottom: \"mixed_9/chconcat\"\n  top: \"mixed_10/conv_conv2d\"\n  convolution_param {\n    bias_term: false\n    num_output: 320\n    pad: 0\n    kernel_h: 1\nkernel_w: 1\n    stride: 1\n    weight_filler {\n        type: \"xavier\"\n    }\n  }\n\n}\nlayer {\n  name: \"mixed_10/conv_conv2d_bn\"\n  type: \"BatchNorm\"\n  bottom: \"mixed_10/conv_conv2d\"\n  top: \"mixed_10/conv_conv2d_bn\"\n  batch_norm_param {\n    use_global_stats: false\n    eps: 0.001\n  }\n  param {\n    lr_mult: 0\n  }\n  param {\n    lr_mult: 0\n  }\n  param {\n    lr_mult: 0\n  }\n}\nlayer {\n  name: \"mixed_10/conv_conv2d_relu\"\n  type: \"ReLU\"\n  bottom: \"mixed_10/conv_conv2d_bn\"\n  top: \"mixed_10/conv_conv2d_relu\"\n}\nlayer {\n  name: \"mixed_10/tower_conv_conv2d\"\n  type: \"Convolution\"\n  bottom: \"mixed_9/chconcat\"\n  top: \"mixed_10/tower_conv_conv2d\"\n  convolution_param {\n    bias_term: false\n    num_output: 384\n    pad: 0\n    kernel_size: 1\n    stride: 1\n    weight_filler {\n        type: \"xavier\"\n    }\n  }\n\n}\nlayer {\n  name: \"mixed_10/tower_conv_conv2d_bn\"\n  type: \"BatchNorm\"\n  bottom: \"mixed_10/tower_conv_conv2d\"\n  top: \"mixed_10/tower_conv_conv2d_bn\"\n  batch_norm_param {\n    use_global_stats: false\n    eps: 0.001\n  }\n  param {\n    lr_mult: 0\n  }\n  param {\n    lr_mult: 0\n  }\n  param {\n    lr_mult: 0\n  }\n}\nlayer {\n  name: \"mixed_10/tower_conv_conv2d_relu\"\n  type: \"ReLU\"\n  bottom: \"mixed_10/tower_conv_conv2d_bn\"\n  top: \"mixed_10/tower_conv_conv2d_relu\"\n}\nlayer {\n  name: \"mixed_10/tower_mixed_conv/conv2d\"\n  type: \"Convolution\"\n  bottom: \"mixed_10/tower_conv_conv2d_relu\"\n  top: \"mixed_10/tower_mixed_conv/conv2d\"\n  convolution_param {\n    bias_term: false\n    num_output: 384\n    pad_h: 0\npad_w: 1\n    kernel_h: 1\nkernel_w: 3\n    stride: 1\n    weight_filler {\n        type: \"xavier\"\n    }\n  }\n\n}\nlayer {\n  name: \"mixed_10/tower_mixed_conv/conv2d_bn\"\n  type: \"BatchNorm\"\n  bottom: \"mixed_10/tower_mixed_conv/conv2d\"\n  top: \"mixed_10/tower_mixed_conv/conv2d_bn\"\n  batch_norm_param {\n    use_global_stats: false\n    eps: 0.001\n  }\n  param {\n    lr_mult: 0\n  }\n  param {\n    lr_mult: 0\n  }\n  param {\n    lr_mult: 0\n  }\n}\nlayer {\n  name: \"mixed_10/tower_mixed_conv/conv2d_relu\"\n  type: \"ReLU\"\n  bottom: \"mixed_10/tower_mixed_conv/conv2d_bn\"\n  top: \"mixed_10/tower_mixed_conv/conv2d_relu\"\n}\nlayer {\n  name: \"mixed_10/tower_mixed_conv/1_conv2d\"\n  type: \"Convolution\"\n  bottom: \"mixed_10/tower_conv_conv2d_relu\"\n  top: \"mixed_10/tower_mixed_conv/1_conv2d\"\n  convolution_param {\n    bias_term: false\n    num_output: 384\n    pad_h: 1\npad_w: 0\n    kernel_h: 3\nkernel_w: 1\n    stride: 1\n    weight_filler {\n        type: \"xavier\"\n    }\n  }\n\n}\nlayer {\n  name: \"mixed_10/tower_mixed_conv/1_conv2d_bn\"\n  type: \"BatchNorm\"\n  bottom: \"mixed_10/tower_mixed_conv/1_conv2d\"\n  top: \"mixed_10/tower_mixed_conv/1_conv2d_bn\"\n  batch_norm_param {\n    use_global_stats: false\n    eps: 0.001\n  }\n  param {\n    lr_mult: 0\n  }\n  param {\n    lr_mult: 0\n  }\n  param {\n    lr_mult: 0\n  }\n}\nlayer {\n  name: \"mixed_10/tower_mixed_conv/1_conv2d_relu\"\n  type: \"ReLU\"\n  bottom: \"mixed_10/tower_mixed_conv/1_conv2d_bn\"\n  top: \"mixed_10/tower_mixed_conv/1_conv2d_relu\"\n}\nlayer {\n  name: \"mixed_10/tower_1_conv_conv2d\"\n  type: \"Convolution\"\n  bottom: \"mixed_9/chconcat\"\n  top: \"mixed_10/tower_1_conv_conv2d\"\n  convolution_param {\n    bias_term: false\n    num_output: 448\n    pad: 0\n    kernel_size: 1\n    stride: 1\n    weight_filler {\n        type: \"xavier\"\n    }\n  }\n\n}\nlayer {\n  name: \"mixed_10/tower_1_conv_conv2d_bn\"\n  type: \"BatchNorm\"\n  bottom: \"mixed_10/tower_1_conv_conv2d\"\n  top: \"mixed_10/tower_1_conv_conv2d_bn\"\n  batch_norm_param {\n    use_global_stats: false\n    eps: 0.001\n  }\n  param {\n    lr_mult: 0\n  }\n  param {\n    lr_mult: 0\n  }\n  param {\n    lr_mult: 0\n  }\n}\nlayer {\n  name: \"mixed_10/tower_1_conv_conv2d_relu\"\n  type: \"ReLU\"\n  bottom: \"mixed_10/tower_1_conv_conv2d_bn\"\n  top: \"mixed_10/tower_1_conv_conv2d_relu\"\n}\nlayer {\n  name: \"mixed_10/tower_1_conv_1_conv2d\"\n  type: \"Convolution\"\n  bottom: \"mixed_10/tower_1_conv_conv2d_relu\"\n  top: \"mixed_10/tower_1_conv_1_conv2d\"\n  convolution_param {\n    bias_term: false\n    num_output: 384\n    pad: 1\n    kernel_size: 3\n    stride: 1\n    weight_filler {\n        type: \"xavier\"\n    }\n  }\n\n}\nlayer {\n  name: \"mixed_10/tower_1_conv_1_conv2d_bn\"\n  type: \"BatchNorm\"\n  bottom: \"mixed_10/tower_1_conv_1_conv2d\"\n  top: \"mixed_10/tower_1_conv_1_conv2d_bn\"\n  batch_norm_param {\n    use_global_stats: false\n    eps: 0.001\n  }\n  param {\n    lr_mult: 0\n  }\n  param {\n    lr_mult: 0\n  }\n  param {\n    lr_mult: 0\n  }\n}\nlayer {\n  name: \"mixed_10/tower_1_conv_1_conv2d_relu\"\n  type: \"ReLU\"\n  bottom: \"mixed_10/tower_1_conv_1_conv2d_bn\"\n  top: \"mixed_10/tower_1_conv_1_conv2d_relu\"\n}\nlayer {\n  name: \"mixed_10/tower_1_mixed_conv/conv2d\"\n  type: \"Convolution\"\n  bottom: \"mixed_10/tower_1_conv_1_conv2d_relu\"\n  top: \"mixed_10/tower_1_mixed_conv/conv2d\"\n  convolution_param {\n    bias_term: false\n    num_output: 384\n    pad_h: 0\npad_w: 1\n    kernel_h: 1\nkernel_w: 3\n    stride: 1\n    weight_filler {\n        type: \"xavier\"\n    }\n  }\n\n}\nlayer {\n  name: \"mixed_10/tower_1_mixed_conv/conv2d_bn\"\n  type: \"BatchNorm\"\n  bottom: \"mixed_10/tower_1_mixed_conv/conv2d\"\n  top: \"mixed_10/tower_1_mixed_conv/conv2d_bn\"\n  batch_norm_param {\n    use_global_stats: false\n    eps: 0.001\n  }\n  param {\n    lr_mult: 0\n  }\n  param {\n    lr_mult: 0\n  }\n  param {\n    lr_mult: 0\n  }\n}\nlayer {\n  name: \"mixed_10/tower_1_mixed_conv/conv2d_relu\"\n  type: \"ReLU\"\n  bottom: \"mixed_10/tower_1_mixed_conv/conv2d_bn\"\n  top: \"mixed_10/tower_1_mixed_conv/conv2d_relu\"\n}\nlayer {\n  name: \"mixed_10/tower_1_mixed_conv/1_conv2d\"\n  type: \"Convolution\"\n  bottom: \"mixed_10/tower_1_conv_1_conv2d_relu\"\n  top: \"mixed_10/tower_1_mixed_conv/1_conv2d\"\n  convolution_param {\n    bias_term: false\n    num_output: 384\n    pad_h: 1\npad_w: 0\n    kernel_h: 3\nkernel_w: 1\n    stride: 1\n    weight_filler {\n        type: \"xavier\"\n    }\n  }\n\n}\nlayer {\n  name: \"mixed_10/tower_1_mixed_conv/1_conv2d_bn\"\n  type: \"BatchNorm\"\n  bottom: \"mixed_10/tower_1_mixed_conv/1_conv2d\"\n  top: \"mixed_10/tower_1_mixed_conv/1_conv2d_bn\"\n  batch_norm_param {\n    use_global_stats: false\n    eps: 0.001\n  }\n  param {\n    lr_mult: 0\n  }\n  param {\n    lr_mult: 0\n  }\n  param {\n    lr_mult: 0\n  }\n}\nlayer {\n  name: \"mixed_10/tower_1_mixed_conv/1_conv2d_relu\"\n  type: \"ReLU\"\n  bottom: \"mixed_10/tower_1_mixed_conv/1_conv2d_bn\"\n  top: \"mixed_10/tower_1_mixed_conv/1_conv2d_relu\"\n}\nlayer {\n  name: \"mixed_10/max_pool\"\n  type: \"Pooling\"\n  bottom: \"mixed_9/chconcat\"\n  top: \"mixed_10/max_pool\"\n  pooling_param {\n    pool: MAX\n    pad: 1\n    kernel_size: 3\n    stride: 1\n  }\n}\nlayer {\n  name: \"mixed_10/tower_2_conv_conv2d\"\n  type: \"Convolution\"\n  bottom: \"mixed_10/max_pool\"\n  top: \"mixed_10/tower_2_conv_conv2d\"\n  convolution_param {\n    bias_term: false\n    num_output: 192\n    pad: 0\n    kernel_size: 1\n    stride: 1\n    weight_filler {\n        type: \"xavier\"\n    }\n  }\n\n}\nlayer {\n  name: \"mixed_10/tower_2_conv_conv2d_bn\"\n  type: \"BatchNorm\"\n  bottom: \"mixed_10/tower_2_conv_conv2d\"\n  top: \"mixed_10/tower_2_conv_conv2d_bn\"\n  batch_norm_param {\n    use_global_stats: false\n    eps: 0.001\n  }\n  param {\n    lr_mult: 0\n  }\n  param {\n    lr_mult: 0\n  }\n  param {\n    lr_mult: 0\n  }\n}\nlayer {\n  name: \"mixed_10/tower_2_conv_conv2d_relu\"\n  type: \"ReLU\"\n  bottom: \"mixed_10/tower_2_conv_conv2d_bn\"\n  top: \"mixed_10/tower_2_conv_conv2d_relu\"\n}\nlayer {\n  name: \"mixed_10/chconcat\"\n  bottom: \"mixed_10/conv_conv2d_relu\"\nbottom: \"mixed_10/tower_mixed_conv/conv2d_relu\"\nbottom: \"mixed_10/tower_mixed_conv/1_conv2d_relu\"\nbottom: \"mixed_10/tower_1_mixed_conv/conv2d_relu\"\nbottom: \"mixed_10/tower_1_mixed_conv/1_conv2d_relu\"\nbottom: \"mixed_10/tower_2_conv_conv2d_relu\"\n\n  top: \"mixed_10/chconcat\"\n  type: \"Concat\"\n  concat_param {\n    axis: 1\n  }\n}\nlayer {\n  name: \"global_pool\"\n  type: \"Pooling\"\n  bottom: \"mixed_10/chconcat\"\n  top: \"global_pool\"\n  pooling_param {\n    pool: AVE\n    pad: 0\n    kernel_size: 8\n    stride: 1\n  }\n}\nlayer {\n  name: \"flatten\"\n  type: \"Flatten\"\n  bottom: \"global_pool\"\n  top: \"flatten\"\n}\nlayer {\n  name: \"fc1\"\n  type: \"InnerProduct\"\n  bottom: \"flatten\"\n  top: \"fc1\"\n  param {\n    lr_mult: 1\n    decay_mult: 1\n  }\n  param {\n    lr_mult: 2\n    decay_mult: 0\n  }\n  inner_product_param {\n     num_output: 1000\n     weight_filler {\n       type: \"xavier\"\n     }\n     bias_filler {\n       type: \"constant\"\n       value: 0\n     }\n  }\n}\nlayer {\n  name: \"loss\"\n  type: \"SoftmaxWithLoss\"\n  bottom: \"fc1\"\n  top: \"loss\"\n}\nlayer {\n  name: \"acc/top-1\"\n  type: \"Accuracy\"\n  bottom: \"fc1\"\n  top: \"acc/top-1\"\n  include {\n    phase: TEST\n  }\n}\nlayer {\n  name: \"acc/top-5\"\n  type: \"Accuracy\"\n  bottom: \"fc1\"\n  top: \"acc/top-5\"\n  include {\n    phase: TEST\n  }\n  accuracy_param {\n    top_k: 5\n  }\n}"
  },
  {
    "path": "presets/inceptionv4.prototxt",
    "content": "#downloaded from http://github.com/soeaver/caffe-model\nname: \"Inception v4\"\nlayer {\n  name: \"data\"\n  type: \"Data\"\n  top: \"data\"\n  input_param {\n      shape: {\n          dim: 1\n          dim: 3\n          dim: 299\n          dim: 299\n      }\n  }\n}\nlayer {\n  name: \"conv1_3x3_s2\"\n  type: \"Convolution\"\n  bottom: \"data\"\n  top: \"conv1_3x3_s2\"\n  param {\n    lr_mult: 1\n    decay_mult: 1\n  }\n  param {\n    lr_mult: 2\n    decay_mult: 0\n  }\n  convolution_param {\n    num_output: 32\n    pad: 0\n    kernel_size: 3\n    stride: 2\n    weight_filler {\n      type: \"xavier\"\n      std: 0.01\n    }\n    bias_filler {\n      type: \"constant\"\n      value: 0.2\n    }\n  }\n}\nlayer {\n  name: \"conv1_3x3_s2_bn\"\n  type: \"BatchNorm\"\n  bottom: \"conv1_3x3_s2\"\n  top: \"conv1_3x3_s2\"\n  batch_norm_param {\n    use_global_stats: false\n  }\n}\nlayer {\n  name: \"conv1_3x3_s2_scale\"\n  type: \"Scale\"\n  bottom: \"conv1_3x3_s2\"\n  top: \"conv1_3x3_s2\"\n  scale_param {\n    bias_term: true\n  }\n}\nlayer {\n  name: \"conv1_3x3_s2_relu\"\n  type: \"ReLU\"\n  bottom: \"conv1_3x3_s2\"\n  top: \"conv1_3x3_s2\"\n}\nlayer {\n  name: \"conv2_3x3_s1\"\n  type: \"Convolution\"\n  bottom: \"conv1_3x3_s2\"\n  top: \"conv2_3x3_s1\"\n  param {\n    lr_mult: 1\n    decay_mult: 1\n  }\n  param {\n    lr_mult: 2\n    decay_mult: 0\n  }\n  convolution_param {\n    num_output: 32\n    pad: 0\n    kernel_size: 3\n    stride: 1\n    weight_filler {\n      type: \"xavier\"\n      std: 0.01\n    }\n    bias_filler {\n      type: \"constant\"\n      value: 0.2\n    }\n  }\n}\nlayer {\n  name: \"conv2_3x3_s1_bn\"\n  type: \"BatchNorm\"\n  bottom: \"conv2_3x3_s1\"\n  top: \"conv2_3x3_s1\"\n  batch_norm_param {\n    use_global_stats: false\n  }\n}\nlayer {\n  name: \"conv2_3x3_s1_scale\"\n  type: \"Scale\"\n  bottom: \"conv2_3x3_s1\"\n  top: \"conv2_3x3_s1\"\n  scale_param {\n    bias_term: true\n  }\n}\nlayer {\n  name: \"conv2_3x3_s1_relu\"\n  type: \"ReLU\"\n  bottom: \"conv2_3x3_s1\"\n  top: \"conv2_3x3_s1\"\n}\nlayer {\n  name: \"conv3_3x3_s1\"\n  type: \"Convolution\"\n  bottom: \"conv2_3x3_s1\"\n  top: \"conv3_3x3_s1\"\n  param {\n    lr_mult: 1\n    decay_mult: 1\n  }\n  param {\n    lr_mult: 2\n    decay_mult: 0\n  }\n  convolution_param {\n    num_output: 64\n    pad: 1\n    kernel_size: 3\n    stride: 1\n    weight_filler {\n      type: \"xavier\"\n      std: 0.01\n    }\n    bias_filler {\n      type: \"constant\"\n      value: 0.2\n    }\n  }\n}\nlayer {\n  name: \"conv3_3x3_s1_bn\"\n  type: \"BatchNorm\"\n  bottom: \"conv3_3x3_s1\"\n  top: \"conv3_3x3_s1\"\n  batch_norm_param {\n    use_global_stats: false\n  }\n}\nlayer {\n  name: \"conv3_3x3_s1_scale\"\n  type: \"Scale\"\n  bottom: \"conv3_3x3_s1\"\n  top: \"conv3_3x3_s1\"\n  scale_param {\n    bias_term: true\n  }\n}\nlayer {\n  name: \"conv3_3x3_s1_relu\"\n  type: \"ReLU\"\n  bottom: \"conv3_3x3_s1\"\n  top: \"conv3_3x3_s1\"\n}\nlayer {\n  name: \"inception_stem1_3x3_s2\"\n  type: \"Convolution\"\n  bottom: \"conv3_3x3_s1\"\n  top: \"inception_stem1_3x3_s2\"\n  param {\n    lr_mult: 1\n    decay_mult: 1\n  }\n  param {\n    lr_mult: 2\n    decay_mult: 0\n  }\n  convolution_param {\n    num_output: 96\n    pad: 0\n    kernel_size: 3\n    stride: 2\n    weight_filler {\n      type: \"xavier\"\n      std: 0.01\n    }\n    bias_filler {\n      type: \"constant\"\n      value: 0.2\n    }\n  }\n}\nlayer {\n  name: \"inception_stem1_3x3_s2_bn\"\n  type: \"BatchNorm\"\n  bottom: \"inception_stem1_3x3_s2\"\n  top: \"inception_stem1_3x3_s2\"\n  batch_norm_param {\n    use_global_stats: false\n  }\n}\nlayer {\n  name: \"inception_stem1_3x3_s2_scale\"\n  type: \"Scale\"\n  bottom: \"inception_stem1_3x3_s2\"\n  top: \"inception_stem1_3x3_s2\"\n  scale_param {\n    bias_term: true\n  }\n}\nlayer {\n  name: \"inception_stem1_3x3_s2_relu\"\n  type: \"ReLU\"\n  bottom: \"inception_stem1_3x3_s2\"\n  top: \"inception_stem1_3x3_s2\"\n}\nlayer {\n  name: \"inception_stem1_pool\"\n  type: \"Pooling\"\n  bottom: \"conv3_3x3_s1\"\n  top: \"inception_stem1_pool\"\n  pooling_param {\n    pool: MAX\n    kernel_size: 3\n    stride: 2\n  }\n}\nlayer {\n  name: \"inception_stem1\"\n  type: \"Concat\"\n  bottom: \"inception_stem1_3x3_s2\"\n  bottom: \"inception_stem1_pool\"\n  top: \"inception_stem1\"\n}\nlayer {\n  name: \"inception_stem2_3x3_reduce\"\n  type: \"Convolution\"\n  bottom: \"inception_stem1\"\n  top: \"inception_stem2_3x3_reduce\"\n  param {\n    lr_mult: 1\n    decay_mult: 1\n  }\n  param {\n    lr_mult: 2\n    decay_mult: 0\n  }\n  convolution_param {\n    num_output: 64\n    pad: 0\n    kernel_size: 1\n    stride: 1\n    weight_filler {\n      type: \"xavier\"\n      std: 0.01\n    }\n    bias_filler {\n      type: \"constant\"\n      value: 0.2\n    }\n  }\n}\nlayer {\n  name: \"inception_stem2_3x3_reduce_bn\"\n  type: \"BatchNorm\"\n  bottom: \"inception_stem2_3x3_reduce\"\n  top: \"inception_stem2_3x3_reduce\"\n  batch_norm_param {\n    use_global_stats: false\n  }\n}\nlayer {\n  name: \"inception_stem2_3x3_reduce_scale\"\n  type: \"Scale\"\n  bottom: \"inception_stem2_3x3_reduce\"\n  top: \"inception_stem2_3x3_reduce\"\n  scale_param {\n    bias_term: true\n  }\n}\nlayer {\n  name: \"inception_stem2_3x3_reduce_relu\"\n  type: \"ReLU\"\n  bottom: \"inception_stem2_3x3_reduce\"\n  top: \"inception_stem2_3x3_reduce\"\n}\nlayer {\n  name: \"inception_stem2_3x3\"\n  type: \"Convolution\"\n  bottom: \"inception_stem2_3x3_reduce\"\n  top: \"inception_stem2_3x3\"\n  param {\n    lr_mult: 1\n    decay_mult: 1\n  }\n  param {\n    lr_mult: 2\n    decay_mult: 0\n  }\n  convolution_param {\n    num_output: 96\n    pad: 0\n    kernel_size: 3\n    stride: 1\n    weight_filler {\n      type: \"xavier\"\n      std: 0.01\n    }\n    bias_filler {\n      type: \"constant\"\n      value: 0.2\n    }\n  }\n}\nlayer {\n  name: \"inception_stem2_3x3_bn\"\n  type: \"BatchNorm\"\n  bottom: \"inception_stem2_3x3\"\n  top: \"inception_stem2_3x3\"\n  batch_norm_param {\n    use_global_stats: false\n  }\n}\nlayer {\n  name: \"inception_stem2_3x3_scale\"\n  type: \"Scale\"\n  bottom: \"inception_stem2_3x3\"\n  top: \"inception_stem2_3x3\"\n  scale_param {\n    bias_term: true\n  }\n}\nlayer {\n  name: \"inception_stem2_3x3_relu\"\n  type: \"ReLU\"\n  bottom: \"inception_stem2_3x3\"\n  top: \"inception_stem2_3x3\"\n}\nlayer {\n  name: \"inception_stem2_7x1_reduce\"\n  type: \"Convolution\"\n  bottom: \"inception_stem1\"\n  top: \"inception_stem2_7x1_reduce\"\n  param {\n    lr_mult: 1\n    decay_mult: 1\n  }\n  param {\n    lr_mult: 2\n    decay_mult: 0\n  }\n  convolution_param {\n    num_output: 64\n    pad: 0\n    kernel_size: 1\n    stride: 1\n    weight_filler {\n      type: \"xavier\"\n      std: 0.01\n    }\n    bias_filler {\n      type: \"constant\"\n      value: 0.2\n    }\n  }\n}\nlayer {\n  name: \"inception_stem2_7x1_reduce_bn\"\n  type: \"BatchNorm\"\n  bottom: \"inception_stem2_7x1_reduce\"\n  top: \"inception_stem2_7x1_reduce\"\n  batch_norm_param {\n    use_global_stats: false\n  }\n}\nlayer {\n  name: \"inception_stem2_7x1_reduce_scale\"\n  type: \"Scale\"\n  bottom: \"inception_stem2_7x1_reduce\"\n  top: \"inception_stem2_7x1_reduce\"\n  scale_param {\n    bias_term: true\n  }\n}\nlayer {\n  name: \"inception_stem2_7x1_reduce_relu\"\n  type: \"ReLU\"\n  bottom: \"inception_stem2_7x1_reduce\"\n  top: \"inception_stem2_7x1_reduce\"\n}\nlayer {\n  name: \"inception_stem2_7x1\"\n  type: \"Convolution\"\n  bottom: \"inception_stem2_7x1_reduce\"\n  top: \"inception_stem2_7x1\"\n  param {\n    lr_mult: 1\n    decay_mult: 1\n  }\n  param {\n    lr_mult: 2\n    decay_mult: 0\n  }\n  convolution_param {\n    num_output: 64\n    stride: 1\n    weight_filler {\n      type: \"xavier\"\n      std: 0.01\n    }\n    bias_filler {\n      type: \"constant\"\n      value: 0.2\n    }\n    pad_h: 3\n    pad_w: 0\n    kernel_h: 7\n    kernel_w: 1\n  }\n}\nlayer {\n  name: \"inception_stem2_7x1_bn\"\n  type: \"BatchNorm\"\n  bottom: \"inception_stem2_7x1\"\n  top: \"inception_stem2_7x1\"\n  batch_norm_param {\n    use_global_stats: false\n  }\n}\nlayer {\n  name: \"inception_stem2_7x1_scale\"\n  type: \"Scale\"\n  bottom: \"inception_stem2_7x1\"\n  top: \"inception_stem2_7x1\"\n  scale_param {\n    bias_term: true\n  }\n}\nlayer {\n  name: \"inception_stem2_7x1_relu\"\n  type: \"ReLU\"\n  bottom: \"inception_stem2_7x1\"\n  top: \"inception_stem2_7x1\"\n}\nlayer {\n  name: \"inception_stem2_1x7\"\n  type: \"Convolution\"\n  bottom: \"inception_stem2_7x1\"\n  top: \"inception_stem2_1x7\"\n  param {\n    lr_mult: 1\n    decay_mult: 1\n  }\n  param {\n    lr_mult: 2\n    decay_mult: 0\n  }\n  convolution_param {\n    num_output: 64\n    stride: 1\n    weight_filler {\n      type: \"xavier\"\n      std: 0.01\n    }\n    bias_filler {\n      type: \"constant\"\n      value: 0.2\n    }\n    pad_h: 0\n    pad_w: 3\n    kernel_h: 1\n    kernel_w: 7\n  }\n}\nlayer {\n  name: \"inception_stem2_1x7_bn\"\n  type: \"BatchNorm\"\n  bottom: \"inception_stem2_1x7\"\n  top: \"inception_stem2_1x7\"\n  batch_norm_param {\n    use_global_stats: false\n  }\n}\nlayer {\n  name: \"inception_stem2_1x7_scale\"\n  type: \"Scale\"\n  bottom: \"inception_stem2_1x7\"\n  top: \"inception_stem2_1x7\"\n  scale_param {\n    bias_term: true\n  }\n}\nlayer {\n  name: \"inception_stem2_1x7_relu\"\n  type: \"ReLU\"\n  bottom: \"inception_stem2_1x7\"\n  top: \"inception_stem2_1x7\"\n}\nlayer {\n  name: \"inception_stem2_3x3_2\"\n  type: \"Convolution\"\n  bottom: \"inception_stem2_1x7\"\n  top: \"inception_stem2_3x3_2\"\n  param {\n    lr_mult: 1\n    decay_mult: 1\n  }\n  param {\n    lr_mult: 2\n    decay_mult: 0\n  }\n  convolution_param {\n    num_output: 96\n    pad: 0\n    kernel_size: 3\n    stride: 1\n    weight_filler {\n      type: \"xavier\"\n      std: 0.01\n    }\n    bias_filler {\n      type: \"constant\"\n      value: 0.2\n    }\n  }\n}\nlayer {\n  name: \"inception_stem2_3x3_2_bn\"\n  type: \"BatchNorm\"\n  bottom: \"inception_stem2_3x3_2\"\n  top: \"inception_stem2_3x3_2\"\n  batch_norm_param {\n    use_global_stats: false\n  }\n}\nlayer {\n  name: \"inception_stem2_3x3_2_scale\"\n  type: \"Scale\"\n  bottom: \"inception_stem2_3x3_2\"\n  top: \"inception_stem2_3x3_2\"\n  scale_param {\n    bias_term: true\n  }\n}\nlayer {\n  name: \"inception_stem2_3x3_2_relu\"\n  type: \"ReLU\"\n  bottom: \"inception_stem2_3x3_2\"\n  top: \"inception_stem2_3x3_2\"\n}\nlayer {\n  name: \"inception_stem2\"\n  type: \"Concat\"\n  bottom: \"inception_stem2_3x3\"\n  bottom: \"inception_stem2_3x3_2\"\n  top: \"inception_stem2\"\n}\nlayer {\n  name: \"inception_stem3_3x3_s2\"\n  type: \"Convolution\"\n  bottom: \"inception_stem2\"\n  top: \"inception_stem3_3x3_s2\"\n  param {\n    lr_mult: 1\n    decay_mult: 1\n  }\n  param {\n    lr_mult: 2\n    decay_mult: 0\n  }\n  convolution_param {\n    num_output: 192\n    pad: 0\n    kernel_size: 3\n    stride: 2\n    weight_filler {\n      type: \"xavier\"\n      std: 0.01\n    }\n    bias_filler {\n      type: \"constant\"\n      value: 0.2\n    }\n  }\n}\nlayer {\n  name: \"inception_stem3_3x3_s2_bn\"\n  type: \"BatchNorm\"\n  bottom: \"inception_stem3_3x3_s2\"\n  top: \"inception_stem3_3x3_s2\"\n  batch_norm_param {\n    use_global_stats: false\n  }\n}\nlayer {\n  name: \"inception_stem3_3x3_s2_scale\"\n  type: \"Scale\"\n  bottom: \"inception_stem3_3x3_s2\"\n  top: \"inception_stem3_3x3_s2\"\n  scale_param {\n    bias_term: true\n  }\n}\nlayer {\n  name: \"inception_stem3_3x3_s2_relu\"\n  type: \"ReLU\"\n  bottom: \"inception_stem3_3x3_s2\"\n  top: \"inception_stem3_3x3_s2\"\n}\nlayer {\n  name: \"inception_stem3_pool\"\n  type: \"Pooling\"\n  bottom: \"inception_stem2\"\n  top: \"inception_stem3_pool\"\n  pooling_param {\n    pool: MAX\n    kernel_size: 3\n    stride: 2\n  }\n}\nlayer {\n  name: \"inception_stem3\"\n  type: \"Concat\"\n  bottom: \"inception_stem3_3x3_s2\"\n  bottom: \"inception_stem3_pool\"\n  top: \"inception_stem3\"\n}\nlayer {\n  name: \"inception_a1_pool_ave\"\n  type: \"Pooling\"\n  bottom: \"inception_stem3\"\n  top: \"inception_a1_pool_ave\"\n  pooling_param {\n    pool: AVE\n    kernel_size: 3\n    stride: 1\n    pad: 1\n  }\n}\nlayer {\n  name: \"inception_a1_1x1\"\n  type: \"Convolution\"\n  bottom: \"inception_a1_pool_ave\"\n  top: \"inception_a1_1x1\"\n  param {\n    lr_mult: 1\n    decay_mult: 1\n  }\n  param {\n    lr_mult: 2\n    decay_mult: 0\n  }\n  convolution_param {\n    num_output: 96\n    pad: 0\n    kernel_size: 1\n    stride: 1\n    weight_filler {\n      type: \"xavier\"\n      std: 0.01\n    }\n    bias_filler {\n      type: \"constant\"\n      value: 0.2\n    }\n  }\n}\nlayer {\n  name: \"inception_a1_1x1_bn\"\n  type: \"BatchNorm\"\n  bottom: \"inception_a1_1x1\"\n  top: \"inception_a1_1x1\"\n  batch_norm_param {\n    use_global_stats: false\n  }\n}\nlayer {\n  name: \"inception_a1_1x1_scale\"\n  type: \"Scale\"\n  bottom: \"inception_a1_1x1\"\n  top: \"inception_a1_1x1\"\n  scale_param {\n    bias_term: true\n  }\n}\nlayer {\n  name: \"inception_a1_1x1_relu\"\n  type: \"ReLU\"\n  bottom: \"inception_a1_1x1\"\n  top: \"inception_a1_1x1\"\n}\nlayer {\n  name: \"inception_a1_1x1_2\"\n  type: \"Convolution\"\n  bottom: \"inception_stem3\"\n  top: \"inception_a1_1x1_2\"\n  param {\n    lr_mult: 1\n    decay_mult: 1\n  }\n  param {\n    lr_mult: 2\n    decay_mult: 0\n  }\n  convolution_param {\n    num_output: 96\n    pad: 0\n    kernel_size: 1\n    stride: 1\n    weight_filler {\n      type: \"xavier\"\n      std: 0.01\n    }\n    bias_filler {\n      type: \"constant\"\n      value: 0.2\n    }\n  }\n}\nlayer {\n  name: \"inception_a1_1x1_2_bn\"\n  type: \"BatchNorm\"\n  bottom: \"inception_a1_1x1_2\"\n  top: \"inception_a1_1x1_2\"\n  batch_norm_param {\n    use_global_stats: false\n  }\n}\nlayer {\n  name: \"inception_a1_1x1_2_scale\"\n  type: \"Scale\"\n  bottom: \"inception_a1_1x1_2\"\n  top: \"inception_a1_1x1_2\"\n  scale_param {\n    bias_term: true\n  }\n}\nlayer {\n  name: \"inception_a1_1x1_2_relu\"\n  type: \"ReLU\"\n  bottom: \"inception_a1_1x1_2\"\n  top: \"inception_a1_1x1_2\"\n}\nlayer {\n  name: \"inception_a1_3x3_reduce\"\n  type: \"Convolution\"\n  bottom: \"inception_stem3\"\n  top: \"inception_a1_3x3_reduce\"\n  param {\n    lr_mult: 1\n    decay_mult: 1\n  }\n  param {\n    lr_mult: 2\n    decay_mult: 0\n  }\n  convolution_param {\n    num_output: 64\n    pad: 0\n    kernel_size: 1\n    stride: 1\n    weight_filler {\n      type: \"xavier\"\n      std: 0.01\n    }\n    bias_filler {\n      type: \"constant\"\n      value: 0.2\n    }\n  }\n}\nlayer {\n  name: \"inception_a1_3x3_reduce_bn\"\n  type: \"BatchNorm\"\n  bottom: \"inception_a1_3x3_reduce\"\n  top: \"inception_a1_3x3_reduce\"\n  batch_norm_param {\n    use_global_stats: false\n  }\n}\nlayer {\n  name: \"inception_a1_3x3_reduce_scale\"\n  type: \"Scale\"\n  bottom: \"inception_a1_3x3_reduce\"\n  top: \"inception_a1_3x3_reduce\"\n  scale_param {\n    bias_term: true\n  }\n}\nlayer {\n  name: \"inception_a1_3x3_reduce_relu\"\n  type: \"ReLU\"\n  bottom: \"inception_a1_3x3_reduce\"\n  top: \"inception_a1_3x3_reduce\"\n}\nlayer {\n  name: \"inception_a1_3x3\"\n  type: \"Convolution\"\n  bottom: \"inception_a1_3x3_reduce\"\n  top: \"inception_a1_3x3\"\n  param {\n    lr_mult: 1\n    decay_mult: 1\n  }\n  param {\n    lr_mult: 2\n    decay_mult: 0\n  }\n  convolution_param {\n    num_output: 96\n    pad: 1\n    kernel_size: 3\n    stride: 1\n    weight_filler {\n      type: \"xavier\"\n      std: 0.01\n    }\n    bias_filler {\n      type: \"constant\"\n      value: 0.2\n    }\n  }\n}\nlayer {\n  name: \"inception_a1_3x3_bn\"\n  type: \"BatchNorm\"\n  bottom: \"inception_a1_3x3\"\n  top: \"inception_a1_3x3\"\n  batch_norm_param {\n    use_global_stats: false\n  }\n}\nlayer {\n  name: \"inception_a1_3x3_scale\"\n  type: \"Scale\"\n  bottom: \"inception_a1_3x3\"\n  top: \"inception_a1_3x3\"\n  scale_param {\n    bias_term: true\n  }\n}\nlayer {\n  name: \"inception_a1_3x3_relu\"\n  type: \"ReLU\"\n  bottom: \"inception_a1_3x3\"\n  top: \"inception_a1_3x3\"\n}\nlayer {\n  name: \"inception_a1_3x3_2_reduce\"\n  type: \"Convolution\"\n  bottom: \"inception_stem3\"\n  top: \"inception_a1_3x3_2_reduce\"\n  param {\n    lr_mult: 1\n    decay_mult: 1\n  }\n  param {\n    lr_mult: 2\n    decay_mult: 0\n  }\n  convolution_param {\n    num_output: 64\n    pad: 0\n    kernel_size: 1\n    stride: 1\n    weight_filler {\n      type: \"xavier\"\n      std: 0.01\n    }\n    bias_filler {\n      type: \"constant\"\n      value: 0.2\n    }\n  }\n}\nlayer {\n  name: \"inception_a1_3x3_2_reduce_bn\"\n  type: \"BatchNorm\"\n  bottom: \"inception_a1_3x3_2_reduce\"\n  top: \"inception_a1_3x3_2_reduce\"\n  batch_norm_param {\n    use_global_stats: false\n  }\n}\nlayer {\n  name: \"inception_a1_3x3_2_reduce_scale\"\n  type: \"Scale\"\n  bottom: \"inception_a1_3x3_2_reduce\"\n  top: \"inception_a1_3x3_2_reduce\"\n  scale_param {\n    bias_term: true\n  }\n}\nlayer {\n  name: \"inception_a1_3x3_2_reduce_relu\"\n  type: \"ReLU\"\n  bottom: \"inception_a1_3x3_2_reduce\"\n  top: \"inception_a1_3x3_2_reduce\"\n}\nlayer {\n  name: \"inception_a1_3x3_2\"\n  type: \"Convolution\"\n  bottom: \"inception_a1_3x3_2_reduce\"\n  top: \"inception_a1_3x3_2\"\n  param {\n    lr_mult: 1\n    decay_mult: 1\n  }\n  param {\n    lr_mult: 2\n    decay_mult: 0\n  }\n  convolution_param {\n    num_output: 96\n    pad: 1\n    kernel_size: 3\n    stride: 1\n    weight_filler {\n      type: \"xavier\"\n      std: 0.01\n    }\n    bias_filler {\n      type: \"constant\"\n      value: 0.2\n    }\n  }\n}\nlayer {\n  name: \"inception_a1_3x3_2_bn\"\n  type: \"BatchNorm\"\n  bottom: \"inception_a1_3x3_2\"\n  top: \"inception_a1_3x3_2\"\n  batch_norm_param {\n    use_global_stats: false\n  }\n}\nlayer {\n  name: \"inception_a1_3x3_2_scale\"\n  type: \"Scale\"\n  bottom: \"inception_a1_3x3_2\"\n  top: \"inception_a1_3x3_2\"\n  scale_param {\n    bias_term: true\n  }\n}\nlayer {\n  name: \"inception_a1_3x3_2_relu\"\n  type: \"ReLU\"\n  bottom: \"inception_a1_3x3_2\"\n  top: \"inception_a1_3x3_2\"\n}\nlayer {\n  name: \"inception_a1_3x3_3\"\n  type: \"Convolution\"\n  bottom: \"inception_a1_3x3_2\"\n  top: \"inception_a1_3x3_3\"\n  param {\n    lr_mult: 1\n    decay_mult: 1\n  }\n  param {\n    lr_mult: 2\n    decay_mult: 0\n  }\n  convolution_param {\n    num_output: 96\n    pad: 1\n    kernel_size: 3\n    stride: 1\n    weight_filler {\n      type: \"xavier\"\n      std: 0.01\n    }\n    bias_filler {\n      type: \"constant\"\n      value: 0.2\n    }\n  }\n}\nlayer {\n  name: \"inception_a1_3x3_3_bn\"\n  type: \"BatchNorm\"\n  bottom: \"inception_a1_3x3_3\"\n  top: \"inception_a1_3x3_3\"\n  batch_norm_param {\n    use_global_stats: false\n  }\n}\nlayer {\n  name: \"inception_a1_3x3_3_scale\"\n  type: \"Scale\"\n  bottom: \"inception_a1_3x3_3\"\n  top: \"inception_a1_3x3_3\"\n  scale_param {\n    bias_term: true\n  }\n}\nlayer {\n  name: \"inception_a1_3x3_3_relu\"\n  type: \"ReLU\"\n  bottom: \"inception_a1_3x3_3\"\n  top: \"inception_a1_3x3_3\"\n}\nlayer {\n  name: \"inception_a1_concat\"\n  type: \"Concat\"\n  bottom: \"inception_a1_1x1\"\n  bottom: \"inception_a1_1x1_2\"\n  bottom: \"inception_a1_3x3\"\n  bottom: \"inception_a1_3x3_3\"\n  top: \"inception_a1_concat\"\n}\nlayer {\n  name: \"inception_a2_pool_ave\"\n  type: \"Pooling\"\n  bottom: \"inception_a1_concat\"\n  top: \"inception_a2_pool_ave\"\n  pooling_param {\n    pool: AVE\n    kernel_size: 3\n    stride: 1\n    pad: 1\n  }\n}\nlayer {\n  name: \"inception_a2_1x1\"\n  type: \"Convolution\"\n  bottom: \"inception_a2_pool_ave\"\n  top: \"inception_a2_1x1\"\n  param {\n    lr_mult: 1\n    decay_mult: 1\n  }\n  param {\n    lr_mult: 2\n    decay_mult: 0\n  }\n  convolution_param {\n    num_output: 96\n    pad: 0\n    kernel_size: 1\n    stride: 1\n    weight_filler {\n      type: \"xavier\"\n      std: 0.01\n    }\n    bias_filler {\n      type: \"constant\"\n      value: 0.2\n    }\n  }\n}\nlayer {\n  name: \"inception_a2_1x1_bn\"\n  type: \"BatchNorm\"\n  bottom: \"inception_a2_1x1\"\n  top: \"inception_a2_1x1\"\n  batch_norm_param {\n    use_global_stats: false\n  }\n}\nlayer {\n  name: \"inception_a2_1x1_scale\"\n  type: \"Scale\"\n  bottom: \"inception_a2_1x1\"\n  top: \"inception_a2_1x1\"\n  scale_param {\n    bias_term: true\n  }\n}\nlayer {\n  name: \"inception_a2_1x1_relu\"\n  type: \"ReLU\"\n  bottom: \"inception_a2_1x1\"\n  top: \"inception_a2_1x1\"\n}\nlayer {\n  name: \"inception_a2_1x1_2\"\n  type: \"Convolution\"\n  bottom: \"inception_a1_concat\"\n  top: \"inception_a2_1x1_2\"\n  param {\n    lr_mult: 1\n    decay_mult: 1\n  }\n  param {\n    lr_mult: 2\n    decay_mult: 0\n  }\n  convolution_param {\n    num_output: 96\n    pad: 0\n    kernel_size: 1\n    stride: 1\n    weight_filler {\n      type: \"xavier\"\n      std: 0.01\n    }\n    bias_filler {\n      type: \"constant\"\n      value: 0.2\n    }\n  }\n}\nlayer {\n  name: \"inception_a2_1x1_2_bn\"\n  type: \"BatchNorm\"\n  bottom: \"inception_a2_1x1_2\"\n  top: \"inception_a2_1x1_2\"\n  batch_norm_param {\n    use_global_stats: false\n  }\n}\nlayer {\n  name: \"inception_a2_1x1_2_scale\"\n  type: \"Scale\"\n  bottom: \"inception_a2_1x1_2\"\n  top: \"inception_a2_1x1_2\"\n  scale_param {\n    bias_term: true\n  }\n}\nlayer {\n  name: \"inception_a2_1x1_2_relu\"\n  type: \"ReLU\"\n  bottom: \"inception_a2_1x1_2\"\n  top: \"inception_a2_1x1_2\"\n}\nlayer {\n  name: \"inception_a2_3x3_reduce\"\n  type: \"Convolution\"\n  bottom: \"inception_a1_concat\"\n  top: \"inception_a2_3x3_reduce\"\n  param {\n    lr_mult: 1\n    decay_mult: 1\n  }\n  param {\n    lr_mult: 2\n    decay_mult: 0\n  }\n  convolution_param {\n    num_output: 64\n    pad: 0\n    kernel_size: 1\n    stride: 1\n    weight_filler {\n      type: \"xavier\"\n      std: 0.01\n    }\n    bias_filler {\n      type: \"constant\"\n      value: 0.2\n    }\n  }\n}\nlayer {\n  name: \"inception_a2_3x3_reduce_bn\"\n  type: \"BatchNorm\"\n  bottom: \"inception_a2_3x3_reduce\"\n  top: \"inception_a2_3x3_reduce\"\n  batch_norm_param {\n    use_global_stats: false\n  }\n}\nlayer {\n  name: \"inception_a2_3x3_reduce_scale\"\n  type: \"Scale\"\n  bottom: \"inception_a2_3x3_reduce\"\n  top: \"inception_a2_3x3_reduce\"\n  scale_param {\n    bias_term: true\n  }\n}\nlayer {\n  name: \"inception_a2_3x3_reduce_relu\"\n  type: \"ReLU\"\n  bottom: \"inception_a2_3x3_reduce\"\n  top: \"inception_a2_3x3_reduce\"\n}\nlayer {\n  name: \"inception_a2_3x3\"\n  type: \"Convolution\"\n  bottom: \"inception_a2_3x3_reduce\"\n  top: \"inception_a2_3x3\"\n  param {\n    lr_mult: 1\n    decay_mult: 1\n  }\n  param {\n    lr_mult: 2\n    decay_mult: 0\n  }\n  convolution_param {\n    num_output: 96\n    pad: 1\n    kernel_size: 3\n    stride: 1\n    weight_filler {\n      type: \"xavier\"\n      std: 0.01\n    }\n    bias_filler {\n      type: \"constant\"\n      value: 0.2\n    }\n  }\n}\nlayer {\n  name: \"inception_a2_3x3_bn\"\n  type: \"BatchNorm\"\n  bottom: \"inception_a2_3x3\"\n  top: \"inception_a2_3x3\"\n  batch_norm_param {\n    use_global_stats: false\n  }\n}\nlayer {\n  name: \"inception_a2_3x3_scale\"\n  type: \"Scale\"\n  bottom: \"inception_a2_3x3\"\n  top: \"inception_a2_3x3\"\n  scale_param {\n    bias_term: true\n  }\n}\nlayer {\n  name: \"inception_a2_3x3_relu\"\n  type: \"ReLU\"\n  bottom: \"inception_a2_3x3\"\n  top: \"inception_a2_3x3\"\n}\nlayer {\n  name: \"inception_a2_3x3_2_reduce\"\n  type: \"Convolution\"\n  bottom: \"inception_a1_concat\"\n  top: \"inception_a2_3x3_2_reduce\"\n  param {\n    lr_mult: 1\n    decay_mult: 1\n  }\n  param {\n    lr_mult: 2\n    decay_mult: 0\n  }\n  convolution_param {\n    num_output: 64\n    pad: 0\n    kernel_size: 1\n    stride: 1\n    weight_filler {\n      type: \"xavier\"\n      std: 0.01\n    }\n    bias_filler {\n      type: \"constant\"\n      value: 0.2\n    }\n  }\n}\nlayer {\n  name: \"inception_a2_3x3_2_reduce_bn\"\n  type: \"BatchNorm\"\n  bottom: \"inception_a2_3x3_2_reduce\"\n  top: \"inception_a2_3x3_2_reduce\"\n  batch_norm_param {\n    use_global_stats: false\n  }\n}\nlayer {\n  name: \"inception_a2_3x3_2_reduce_scale\"\n  type: \"Scale\"\n  bottom: \"inception_a2_3x3_2_reduce\"\n  top: \"inception_a2_3x3_2_reduce\"\n  scale_param {\n    bias_term: true\n  }\n}\nlayer {\n  name: \"inception_a2_3x3_2_reduce_relu\"\n  type: \"ReLU\"\n  bottom: \"inception_a2_3x3_2_reduce\"\n  top: \"inception_a2_3x3_2_reduce\"\n}\nlayer {\n  name: \"inception_a2_3x3_2\"\n  type: \"Convolution\"\n  bottom: \"inception_a2_3x3_2_reduce\"\n  top: \"inception_a2_3x3_2\"\n  param {\n    lr_mult: 1\n    decay_mult: 1\n  }\n  param {\n    lr_mult: 2\n    decay_mult: 0\n  }\n  convolution_param {\n    num_output: 96\n    pad: 1\n    kernel_size: 3\n    stride: 1\n    weight_filler {\n      type: \"xavier\"\n      std: 0.01\n    }\n    bias_filler {\n      type: \"constant\"\n      value: 0.2\n    }\n  }\n}\nlayer {\n  name: \"inception_a2_3x3_2_bn\"\n  type: \"BatchNorm\"\n  bottom: \"inception_a2_3x3_2\"\n  top: \"inception_a2_3x3_2\"\n  batch_norm_param {\n    use_global_stats: false\n  }\n}\nlayer {\n  name: \"inception_a2_3x3_2_scale\"\n  type: \"Scale\"\n  bottom: \"inception_a2_3x3_2\"\n  top: \"inception_a2_3x3_2\"\n  scale_param {\n    bias_term: true\n  }\n}\nlayer {\n  name: \"inception_a2_3x3_2_relu\"\n  type: \"ReLU\"\n  bottom: \"inception_a2_3x3_2\"\n  top: \"inception_a2_3x3_2\"\n}\nlayer {\n  name: \"inception_a2_3x3_3\"\n  type: \"Convolution\"\n  bottom: \"inception_a2_3x3_2\"\n  top: \"inception_a2_3x3_3\"\n  param {\n    lr_mult: 1\n    decay_mult: 1\n  }\n  param {\n    lr_mult: 2\n    decay_mult: 0\n  }\n  convolution_param {\n    num_output: 96\n    pad: 1\n    kernel_size: 3\n    stride: 1\n    weight_filler {\n      type: \"xavier\"\n      std: 0.01\n    }\n    bias_filler {\n      type: \"constant\"\n      value: 0.2\n    }\n  }\n}\nlayer {\n  name: \"inception_a2_3x3_3_bn\"\n  type: \"BatchNorm\"\n  bottom: \"inception_a2_3x3_3\"\n  top: \"inception_a2_3x3_3\"\n  batch_norm_param {\n    use_global_stats: false\n  }\n}\nlayer {\n  name: \"inception_a2_3x3_3_scale\"\n  type: \"Scale\"\n  bottom: \"inception_a2_3x3_3\"\n  top: \"inception_a2_3x3_3\"\n  scale_param {\n    bias_term: true\n  }\n}\nlayer {\n  name: \"inception_a2_3x3_3_relu\"\n  type: \"ReLU\"\n  bottom: \"inception_a2_3x3_3\"\n  top: \"inception_a2_3x3_3\"\n}\nlayer {\n  name: \"inception_a2_concat\"\n  type: \"Concat\"\n  bottom: \"inception_a2_1x1\"\n  bottom: \"inception_a2_1x1_2\"\n  bottom: \"inception_a2_3x3\"\n  bottom: \"inception_a2_3x3_3\"\n  top: \"inception_a2_concat\"\n}\nlayer {\n  name: \"inception_a3_pool_ave\"\n  type: \"Pooling\"\n  bottom: \"inception_a2_concat\"\n  top: \"inception_a3_pool_ave\"\n  pooling_param {\n    pool: AVE\n    kernel_size: 3\n    stride: 1\n    pad: 1\n  }\n}\nlayer {\n  name: \"inception_a3_1x1\"\n  type: \"Convolution\"\n  bottom: \"inception_a3_pool_ave\"\n  top: \"inception_a3_1x1\"\n  param {\n    lr_mult: 1\n    decay_mult: 1\n  }\n  param {\n    lr_mult: 2\n    decay_mult: 0\n  }\n  convolution_param {\n    num_output: 96\n    pad: 0\n    kernel_size: 1\n    stride: 1\n    weight_filler {\n      type: \"xavier\"\n      std: 0.01\n    }\n    bias_filler {\n      type: \"constant\"\n      value: 0.2\n    }\n  }\n}\nlayer {\n  name: \"inception_a3_1x1_bn\"\n  type: \"BatchNorm\"\n  bottom: \"inception_a3_1x1\"\n  top: \"inception_a3_1x1\"\n  batch_norm_param {\n    use_global_stats: false\n  }\n}\nlayer {\n  name: \"inception_a3_1x1_scale\"\n  type: \"Scale\"\n  bottom: \"inception_a3_1x1\"\n  top: \"inception_a3_1x1\"\n  scale_param {\n    bias_term: true\n  }\n}\nlayer {\n  name: \"inception_a3_1x1_relu\"\n  type: \"ReLU\"\n  bottom: \"inception_a3_1x1\"\n  top: \"inception_a3_1x1\"\n}\nlayer {\n  name: \"inception_a3_1x1_2\"\n  type: \"Convolution\"\n  bottom: \"inception_a2_concat\"\n  top: \"inception_a3_1x1_2\"\n  param {\n    lr_mult: 1\n    decay_mult: 1\n  }\n  param {\n    lr_mult: 2\n    decay_mult: 0\n  }\n  convolution_param {\n    num_output: 96\n    pad: 0\n    kernel_size: 1\n    stride: 1\n    weight_filler {\n      type: \"xavier\"\n      std: 0.01\n    }\n    bias_filler {\n      type: \"constant\"\n      value: 0.2\n    }\n  }\n}\nlayer {\n  name: \"inception_a3_1x1_2_bn\"\n  type: \"BatchNorm\"\n  bottom: \"inception_a3_1x1_2\"\n  top: \"inception_a3_1x1_2\"\n  batch_norm_param {\n    use_global_stats: false\n  }\n}\nlayer {\n  name: \"inception_a3_1x1_2_scale\"\n  type: \"Scale\"\n  bottom: \"inception_a3_1x1_2\"\n  top: \"inception_a3_1x1_2\"\n  scale_param {\n    bias_term: true\n  }\n}\nlayer {\n  name: \"inception_a3_1x1_2_relu\"\n  type: \"ReLU\"\n  bottom: \"inception_a3_1x1_2\"\n  top: \"inception_a3_1x1_2\"\n}\nlayer {\n  name: \"inception_a3_3x3_reduce\"\n  type: \"Convolution\"\n  bottom: \"inception_a2_concat\"\n  top: \"inception_a3_3x3_reduce\"\n  param {\n    lr_mult: 1\n    decay_mult: 1\n  }\n  param {\n    lr_mult: 2\n    decay_mult: 0\n  }\n  convolution_param {\n    num_output: 64\n    pad: 0\n    kernel_size: 1\n    stride: 1\n    weight_filler {\n      type: \"xavier\"\n      std: 0.01\n    }\n    bias_filler {\n      type: \"constant\"\n      value: 0.2\n    }\n  }\n}\nlayer {\n  name: \"inception_a3_3x3_reduce_bn\"\n  type: \"BatchNorm\"\n  bottom: \"inception_a3_3x3_reduce\"\n  top: \"inception_a3_3x3_reduce\"\n  batch_norm_param {\n    use_global_stats: false\n  }\n}\nlayer {\n  name: \"inception_a3_3x3_reduce_scale\"\n  type: \"Scale\"\n  bottom: \"inception_a3_3x3_reduce\"\n  top: \"inception_a3_3x3_reduce\"\n  scale_param {\n    bias_term: true\n  }\n}\nlayer {\n  name: \"inception_a3_3x3_reduce_relu\"\n  type: \"ReLU\"\n  bottom: \"inception_a3_3x3_reduce\"\n  top: \"inception_a3_3x3_reduce\"\n}\nlayer {\n  name: \"inception_a3_3x3\"\n  type: \"Convolution\"\n  bottom: \"inception_a3_3x3_reduce\"\n  top: \"inception_a3_3x3\"\n  param {\n    lr_mult: 1\n    decay_mult: 1\n  }\n  param {\n    lr_mult: 2\n    decay_mult: 0\n  }\n  convolution_param {\n    num_output: 96\n    pad: 1\n    kernel_size: 3\n    stride: 1\n    weight_filler {\n      type: \"xavier\"\n      std: 0.01\n    }\n    bias_filler {\n      type: \"constant\"\n      value: 0.2\n    }\n  }\n}\nlayer {\n  name: \"inception_a3_3x3_bn\"\n  type: \"BatchNorm\"\n  bottom: \"inception_a3_3x3\"\n  top: \"inception_a3_3x3\"\n  batch_norm_param {\n    use_global_stats: false\n  }\n}\nlayer {\n  name: \"inception_a3_3x3_scale\"\n  type: \"Scale\"\n  bottom: \"inception_a3_3x3\"\n  top: \"inception_a3_3x3\"\n  scale_param {\n    bias_term: true\n  }\n}\nlayer {\n  name: \"inception_a3_3x3_relu\"\n  type: \"ReLU\"\n  bottom: \"inception_a3_3x3\"\n  top: \"inception_a3_3x3\"\n}\nlayer {\n  name: \"inception_a3_3x3_2_reduce\"\n  type: \"Convolution\"\n  bottom: \"inception_a2_concat\"\n  top: \"inception_a3_3x3_2_reduce\"\n  param {\n    lr_mult: 1\n    decay_mult: 1\n  }\n  param {\n    lr_mult: 2\n    decay_mult: 0\n  }\n  convolution_param {\n    num_output: 64\n    pad: 0\n    kernel_size: 1\n    stride: 1\n    weight_filler {\n      type: \"xavier\"\n      std: 0.01\n    }\n    bias_filler {\n      type: \"constant\"\n      value: 0.2\n    }\n  }\n}\nlayer {\n  name: \"inception_a3_3x3_2_reduce_bn\"\n  type: \"BatchNorm\"\n  bottom: \"inception_a3_3x3_2_reduce\"\n  top: \"inception_a3_3x3_2_reduce\"\n  batch_norm_param {\n    use_global_stats: false\n  }\n}\nlayer {\n  name: \"inception_a3_3x3_2_reduce_scale\"\n  type: \"Scale\"\n  bottom: \"inception_a3_3x3_2_reduce\"\n  top: \"inception_a3_3x3_2_reduce\"\n  scale_param {\n    bias_term: true\n  }\n}\nlayer {\n  name: \"inception_a3_3x3_2_reduce_relu\"\n  type: \"ReLU\"\n  bottom: \"inception_a3_3x3_2_reduce\"\n  top: \"inception_a3_3x3_2_reduce\"\n}\nlayer {\n  name: \"inception_a3_3x3_2\"\n  type: \"Convolution\"\n  bottom: \"inception_a3_3x3_2_reduce\"\n  top: \"inception_a3_3x3_2\"\n  param {\n    lr_mult: 1\n    decay_mult: 1\n  }\n  param {\n    lr_mult: 2\n    decay_mult: 0\n  }\n  convolution_param {\n    num_output: 96\n    pad: 1\n    kernel_size: 3\n    stride: 1\n    weight_filler {\n      type: \"xavier\"\n      std: 0.01\n    }\n    bias_filler {\n      type: \"constant\"\n      value: 0.2\n    }\n  }\n}\nlayer {\n  name: \"inception_a3_3x3_2_bn\"\n  type: \"BatchNorm\"\n  bottom: \"inception_a3_3x3_2\"\n  top: \"inception_a3_3x3_2\"\n  batch_norm_param {\n    use_global_stats: false\n  }\n}\nlayer {\n  name: \"inception_a3_3x3_2_scale\"\n  type: \"Scale\"\n  bottom: \"inception_a3_3x3_2\"\n  top: \"inception_a3_3x3_2\"\n  scale_param {\n    bias_term: true\n  }\n}\nlayer {\n  name: \"inception_a3_3x3_2_relu\"\n  type: \"ReLU\"\n  bottom: \"inception_a3_3x3_2\"\n  top: \"inception_a3_3x3_2\"\n}\nlayer {\n  name: \"inception_a3_3x3_3\"\n  type: \"Convolution\"\n  bottom: \"inception_a3_3x3_2\"\n  top: \"inception_a3_3x3_3\"\n  param {\n    lr_mult: 1\n    decay_mult: 1\n  }\n  param {\n    lr_mult: 2\n    decay_mult: 0\n  }\n  convolution_param {\n    num_output: 96\n    pad: 1\n    kernel_size: 3\n    stride: 1\n    weight_filler {\n      type: \"xavier\"\n      std: 0.01\n    }\n    bias_filler {\n      type: \"constant\"\n      value: 0.2\n    }\n  }\n}\nlayer {\n  name: \"inception_a3_3x3_3_bn\"\n  type: \"BatchNorm\"\n  bottom: \"inception_a3_3x3_3\"\n  top: \"inception_a3_3x3_3\"\n  batch_norm_param {\n    use_global_stats: false\n  }\n}\nlayer {\n  name: \"inception_a3_3x3_3_scale\"\n  type: \"Scale\"\n  bottom: \"inception_a3_3x3_3\"\n  top: \"inception_a3_3x3_3\"\n  scale_param {\n    bias_term: true\n  }\n}\nlayer {\n  name: \"inception_a3_3x3_3_relu\"\n  type: \"ReLU\"\n  bottom: \"inception_a3_3x3_3\"\n  top: \"inception_a3_3x3_3\"\n}\nlayer {\n  name: \"inception_a3_concat\"\n  type: \"Concat\"\n  bottom: \"inception_a3_1x1\"\n  bottom: \"inception_a3_1x1_2\"\n  bottom: \"inception_a3_3x3\"\n  bottom: \"inception_a3_3x3_3\"\n  top: \"inception_a3_concat\"\n}\nlayer {\n  name: \"inception_a4_pool_ave\"\n  type: \"Pooling\"\n  bottom: \"inception_a3_concat\"\n  top: \"inception_a4_pool_ave\"\n  pooling_param {\n    pool: AVE\n    kernel_size: 3\n    stride: 1\n    pad: 1\n  }\n}\nlayer {\n  name: \"inception_a4_1x1\"\n  type: \"Convolution\"\n  bottom: \"inception_a4_pool_ave\"\n  top: \"inception_a4_1x1\"\n  param {\n    lr_mult: 1\n    decay_mult: 1\n  }\n  param {\n    lr_mult: 2\n    decay_mult: 0\n  }\n  convolution_param {\n    num_output: 96\n    pad: 0\n    kernel_size: 1\n    stride: 1\n    weight_filler {\n      type: \"xavier\"\n      std: 0.01\n    }\n    bias_filler {\n      type: \"constant\"\n      value: 0.2\n    }\n  }\n}\nlayer {\n  name: \"inception_a4_1x1_bn\"\n  type: \"BatchNorm\"\n  bottom: \"inception_a4_1x1\"\n  top: \"inception_a4_1x1\"\n  batch_norm_param {\n    use_global_stats: false\n  }\n}\nlayer {\n  name: \"inception_a4_1x1_scale\"\n  type: \"Scale\"\n  bottom: \"inception_a4_1x1\"\n  top: \"inception_a4_1x1\"\n  scale_param {\n    bias_term: true\n  }\n}\nlayer {\n  name: \"inception_a4_1x1_relu\"\n  type: \"ReLU\"\n  bottom: \"inception_a4_1x1\"\n  top: \"inception_a4_1x1\"\n}\nlayer {\n  name: \"inception_a4_1x1_2\"\n  type: \"Convolution\"\n  bottom: \"inception_a3_concat\"\n  top: \"inception_a4_1x1_2\"\n  param {\n    lr_mult: 1\n    decay_mult: 1\n  }\n  param {\n    lr_mult: 2\n    decay_mult: 0\n  }\n  convolution_param {\n    num_output: 96\n    pad: 0\n    kernel_size: 1\n    stride: 1\n    weight_filler {\n      type: \"xavier\"\n      std: 0.01\n    }\n    bias_filler {\n      type: \"constant\"\n      value: 0.2\n    }\n  }\n}\nlayer {\n  name: \"inception_a4_1x1_2_bn\"\n  type: \"BatchNorm\"\n  bottom: \"inception_a4_1x1_2\"\n  top: \"inception_a4_1x1_2\"\n  batch_norm_param {\n    use_global_stats: false\n  }\n}\nlayer {\n  name: \"inception_a4_1x1_2_scale\"\n  type: \"Scale\"\n  bottom: \"inception_a4_1x1_2\"\n  top: \"inception_a4_1x1_2\"\n  scale_param {\n    bias_term: true\n  }\n}\nlayer {\n  name: \"inception_a4_1x1_2_relu\"\n  type: \"ReLU\"\n  bottom: \"inception_a4_1x1_2\"\n  top: \"inception_a4_1x1_2\"\n}\nlayer {\n  name: \"inception_a4_3x3_reduce\"\n  type: \"Convolution\"\n  bottom: \"inception_a3_concat\"\n  top: \"inception_a4_3x3_reduce\"\n  param {\n    lr_mult: 1\n    decay_mult: 1\n  }\n  param {\n    lr_mult: 2\n    decay_mult: 0\n  }\n  convolution_param {\n    num_output: 64\n    pad: 0\n    kernel_size: 1\n    stride: 1\n    weight_filler {\n      type: \"xavier\"\n      std: 0.01\n    }\n    bias_filler {\n      type: \"constant\"\n      value: 0.2\n    }\n  }\n}\nlayer {\n  name: \"inception_a4_3x3_reduce_bn\"\n  type: \"BatchNorm\"\n  bottom: \"inception_a4_3x3_reduce\"\n  top: \"inception_a4_3x3_reduce\"\n  batch_norm_param {\n    use_global_stats: false\n  }\n}\nlayer {\n  name: \"inception_a4_3x3_reduce_scale\"\n  type: \"Scale\"\n  bottom: \"inception_a4_3x3_reduce\"\n  top: \"inception_a4_3x3_reduce\"\n  scale_param {\n    bias_term: true\n  }\n}\nlayer {\n  name: \"inception_a4_3x3_reduce_relu\"\n  type: \"ReLU\"\n  bottom: \"inception_a4_3x3_reduce\"\n  top: \"inception_a4_3x3_reduce\"\n}\nlayer {\n  name: \"inception_a4_3x3\"\n  type: \"Convolution\"\n  bottom: \"inception_a4_3x3_reduce\"\n  top: \"inception_a4_3x3\"\n  param {\n    lr_mult: 1\n    decay_mult: 1\n  }\n  param {\n    lr_mult: 2\n    decay_mult: 0\n  }\n  convolution_param {\n    num_output: 96\n    pad: 1\n    kernel_size: 3\n    stride: 1\n    weight_filler {\n      type: \"xavier\"\n      std: 0.01\n    }\n    bias_filler {\n      type: \"constant\"\n      value: 0.2\n    }\n  }\n}\nlayer {\n  name: \"inception_a4_3x3_bn\"\n  type: \"BatchNorm\"\n  bottom: \"inception_a4_3x3\"\n  top: \"inception_a4_3x3\"\n  batch_norm_param {\n    use_global_stats: false\n  }\n}\nlayer {\n  name: \"inception_a4_3x3_scale\"\n  type: \"Scale\"\n  bottom: \"inception_a4_3x3\"\n  top: \"inception_a4_3x3\"\n  scale_param {\n    bias_term: true\n  }\n}\nlayer {\n  name: \"inception_a4_3x3_relu\"\n  type: \"ReLU\"\n  bottom: \"inception_a4_3x3\"\n  top: \"inception_a4_3x3\"\n}\nlayer {\n  name: \"inception_a4_3x3_2_reduce\"\n  type: \"Convolution\"\n  bottom: \"inception_a3_concat\"\n  top: \"inception_a4_3x3_2_reduce\"\n  param {\n    lr_mult: 1\n    decay_mult: 1\n  }\n  param {\n    lr_mult: 2\n    decay_mult: 0\n  }\n  convolution_param {\n    num_output: 64\n    pad: 0\n    kernel_size: 1\n    stride: 1\n    weight_filler {\n      type: \"xavier\"\n      std: 0.01\n    }\n    bias_filler {\n      type: \"constant\"\n      value: 0.2\n    }\n  }\n}\nlayer {\n  name: \"inception_a4_3x3_2_reduce_bn\"\n  type: \"BatchNorm\"\n  bottom: \"inception_a4_3x3_2_reduce\"\n  top: \"inception_a4_3x3_2_reduce\"\n  batch_norm_param {\n    use_global_stats: false\n  }\n}\nlayer {\n  name: \"inception_a4_3x3_2_reduce_scale\"\n  type: \"Scale\"\n  bottom: \"inception_a4_3x3_2_reduce\"\n  top: \"inception_a4_3x3_2_reduce\"\n  scale_param {\n    bias_term: true\n  }\n}\nlayer {\n  name: \"inception_a4_3x3_2_reduce_relu\"\n  type: \"ReLU\"\n  bottom: \"inception_a4_3x3_2_reduce\"\n  top: \"inception_a4_3x3_2_reduce\"\n}\nlayer {\n  name: \"inception_a4_3x3_2\"\n  type: \"Convolution\"\n  bottom: \"inception_a4_3x3_2_reduce\"\n  top: \"inception_a4_3x3_2\"\n  param {\n    lr_mult: 1\n    decay_mult: 1\n  }\n  param {\n    lr_mult: 2\n    decay_mult: 0\n  }\n  convolution_param {\n    num_output: 96\n    pad: 1\n    kernel_size: 3\n    stride: 1\n    weight_filler {\n      type: \"xavier\"\n      std: 0.01\n    }\n    bias_filler {\n      type: \"constant\"\n      value: 0.2\n    }\n  }\n}\nlayer {\n  name: \"inception_a4_3x3_2_bn\"\n  type: \"BatchNorm\"\n  bottom: \"inception_a4_3x3_2\"\n  top: \"inception_a4_3x3_2\"\n  batch_norm_param {\n    use_global_stats: false\n  }\n}\nlayer {\n  name: \"inception_a4_3x3_2_scale\"\n  type: \"Scale\"\n  bottom: \"inception_a4_3x3_2\"\n  top: \"inception_a4_3x3_2\"\n  scale_param {\n    bias_term: true\n  }\n}\nlayer {\n  name: \"inception_a4_3x3_2_relu\"\n  type: \"ReLU\"\n  bottom: \"inception_a4_3x3_2\"\n  top: \"inception_a4_3x3_2\"\n}\nlayer {\n  name: \"inception_a4_3x3_3\"\n  type: \"Convolution\"\n  bottom: \"inception_a4_3x3_2\"\n  top: \"inception_a4_3x3_3\"\n  param {\n    lr_mult: 1\n    decay_mult: 1\n  }\n  param {\n    lr_mult: 2\n    decay_mult: 0\n  }\n  convolution_param {\n    num_output: 96\n    pad: 1\n    kernel_size: 3\n    stride: 1\n    weight_filler {\n      type: \"xavier\"\n      std: 0.01\n    }\n    bias_filler {\n      type: \"constant\"\n      value: 0.2\n    }\n  }\n}\nlayer {\n  name: \"inception_a4_3x3_3_bn\"\n  type: \"BatchNorm\"\n  bottom: \"inception_a4_3x3_3\"\n  top: \"inception_a4_3x3_3\"\n  batch_norm_param {\n    use_global_stats: false\n  }\n}\nlayer {\n  name: \"inception_a4_3x3_3_scale\"\n  type: \"Scale\"\n  bottom: \"inception_a4_3x3_3\"\n  top: \"inception_a4_3x3_3\"\n  scale_param {\n    bias_term: true\n  }\n}\nlayer {\n  name: \"inception_a4_3x3_3_relu\"\n  type: \"ReLU\"\n  bottom: \"inception_a4_3x3_3\"\n  top: \"inception_a4_3x3_3\"\n}\nlayer {\n  name: \"inception_a4_concat\"\n  type: \"Concat\"\n  bottom: \"inception_a4_1x1\"\n  bottom: \"inception_a4_1x1_2\"\n  bottom: \"inception_a4_3x3\"\n  bottom: \"inception_a4_3x3_3\"\n  top: \"inception_a4_concat\"\n}\nlayer {\n  name: \"reduction_a_pool\"\n  type: \"Pooling\"\n  bottom: \"inception_a4_concat\"\n  top: \"reduction_a_pool\"\n  pooling_param {\n    pool: MAX\n    kernel_size: 3\n    stride: 2\n  }\n}\nlayer {\n  name: \"reduction_a_3x3\"\n  type: \"Convolution\"\n  bottom: \"inception_a4_concat\"\n  top: \"reduction_a_3x3\"\n  param {\n    lr_mult: 1\n    decay_mult: 1\n  }\n  param {\n    lr_mult: 2\n    decay_mult: 0\n  }\n  convolution_param {\n    num_output: 384\n    pad: 0\n    kernel_size: 3\n    stride: 2\n    weight_filler {\n      type: \"xavier\"\n      std: 0.01\n    }\n    bias_filler {\n      type: \"constant\"\n      value: 0.2\n    }\n  }\n}\nlayer {\n  name: \"reduction_a_3x3_bn\"\n  type: \"BatchNorm\"\n  bottom: \"reduction_a_3x3\"\n  top: \"reduction_a_3x3\"\n  batch_norm_param {\n    use_global_stats: false\n  }\n}\nlayer {\n  name: \"reduction_a_3x3_scale\"\n  type: \"Scale\"\n  bottom: \"reduction_a_3x3\"\n  top: \"reduction_a_3x3\"\n  scale_param {\n    bias_term: true\n  }\n}\nlayer {\n  name: \"reduction_a_3x3_relu\"\n  type: \"ReLU\"\n  bottom: \"reduction_a_3x3\"\n  top: \"reduction_a_3x3\"\n}\nlayer {\n  name: \"reduction_a_3x3_2_reduce\"\n  type: \"Convolution\"\n  bottom: \"inception_a4_concat\"\n  top: \"reduction_a_3x3_2_reduce\"\n  param {\n    lr_mult: 1\n    decay_mult: 1\n  }\n  param {\n    lr_mult: 2\n    decay_mult: 0\n  }\n  convolution_param {\n    num_output: 192\n    pad: 0\n    kernel_size: 1\n    stride: 1\n    weight_filler {\n      type: \"xavier\"\n      std: 0.01\n    }\n    bias_filler {\n      type: \"constant\"\n      value: 0.2\n    }\n  }\n}\nlayer {\n  name: \"reduction_a_3x3_2_reduce_bn\"\n  type: \"BatchNorm\"\n  bottom: \"reduction_a_3x3_2_reduce\"\n  top: \"reduction_a_3x3_2_reduce\"\n  batch_norm_param {\n    use_global_stats: false\n  }\n}\nlayer {\n  name: \"reduction_a_3x3_2_reduce_scale\"\n  type: \"Scale\"\n  bottom: \"reduction_a_3x3_2_reduce\"\n  top: \"reduction_a_3x3_2_reduce\"\n  scale_param {\n    bias_term: true\n  }\n}\nlayer {\n  name: \"reduction_a_3x3_2_reduce_relu\"\n  type: \"ReLU\"\n  bottom: \"reduction_a_3x3_2_reduce\"\n  top: \"reduction_a_3x3_2_reduce\"\n}\nlayer {\n  name: \"reduction_a_3x3_2\"\n  type: \"Convolution\"\n  bottom: \"reduction_a_3x3_2_reduce\"\n  top: \"reduction_a_3x3_2\"\n  param {\n    lr_mult: 1\n    decay_mult: 1\n  }\n  param {\n    lr_mult: 2\n    decay_mult: 0\n  }\n  convolution_param {\n    num_output: 224\n    pad: 1\n    kernel_size: 3\n    stride: 1\n    weight_filler {\n      type: \"xavier\"\n      std: 0.01\n    }\n    bias_filler {\n      type: \"constant\"\n      value: 0.2\n    }\n  }\n}\nlayer {\n  name: \"reduction_a_3x3_2_bn\"\n  type: \"BatchNorm\"\n  bottom: \"reduction_a_3x3_2\"\n  top: \"reduction_a_3x3_2\"\n  batch_norm_param {\n    use_global_stats: false\n  }\n}\nlayer {\n  name: \"reduction_a_3x3_2_scale\"\n  type: \"Scale\"\n  bottom: \"reduction_a_3x3_2\"\n  top: \"reduction_a_3x3_2\"\n  scale_param {\n    bias_term: true\n  }\n}\nlayer {\n  name: \"reduction_a_3x3_2_relu\"\n  type: \"ReLU\"\n  bottom: \"reduction_a_3x3_2\"\n  top: \"reduction_a_3x3_2\"\n}\nlayer {\n  name: \"reduction_a_3x3_3\"\n  type: \"Convolution\"\n  bottom: \"reduction_a_3x3_2\"\n  top: \"reduction_a_3x3_3\"\n  param {\n    lr_mult: 1\n    decay_mult: 1\n  }\n  param {\n    lr_mult: 2\n    decay_mult: 0\n  }\n  convolution_param {\n    num_output: 256\n    pad: 0\n    kernel_size: 3\n    stride: 2\n    weight_filler {\n      type: \"xavier\"\n      std: 0.01\n    }\n    bias_filler {\n      type: \"constant\"\n      value: 0.2\n    }\n  }\n}\nlayer {\n  name: \"reduction_a_3x3_3_bn\"\n  type: \"BatchNorm\"\n  bottom: \"reduction_a_3x3_3\"\n  top: \"reduction_a_3x3_3\"\n  batch_norm_param {\n    use_global_stats: false\n  }\n}\nlayer {\n  name: \"reduction_a_3x3_3_scale\"\n  type: \"Scale\"\n  bottom: \"reduction_a_3x3_3\"\n  top: \"reduction_a_3x3_3\"\n  scale_param {\n    bias_term: true\n  }\n}\nlayer {\n  name: \"reduction_a_3x3_3_relu\"\n  type: \"ReLU\"\n  bottom: \"reduction_a_3x3_3\"\n  top: \"reduction_a_3x3_3\"\n}\nlayer {\n  name: \"reduction_a_concat\"\n  type: \"Concat\"\n  bottom: \"reduction_a_pool\"\n  bottom: \"reduction_a_3x3\"\n  bottom: \"reduction_a_3x3_3\"\n  top: \"reduction_a_concat\"\n}\nlayer {\n  name: \"inception_b1_pool_ave\"\n  type: \"Pooling\"\n  bottom: \"reduction_a_concat\"\n  top: \"inception_b1_pool_ave\"\n  pooling_param {\n    pool: AVE\n    kernel_size: 3\n    stride: 1\n    pad: 1\n  }\n}\nlayer {\n  name: \"inception_b1_1x1\"\n  type: \"Convolution\"\n  bottom: \"inception_b1_pool_ave\"\n  top: \"inception_b1_1x1\"\n  param {\n    lr_mult: 1\n    decay_mult: 1\n  }\n  param {\n    lr_mult: 2\n    decay_mult: 0\n  }\n  convolution_param {\n    num_output: 128\n    pad: 0\n    kernel_size: 1\n    stride: 1\n    weight_filler {\n      type: \"xavier\"\n      std: 0.01\n    }\n    bias_filler {\n      type: \"constant\"\n      value: 0.2\n    }\n  }\n}\nlayer {\n  name: \"inception_b1_1x1_bn\"\n  type: \"BatchNorm\"\n  bottom: \"inception_b1_1x1\"\n  top: \"inception_b1_1x1\"\n  batch_norm_param {\n    use_global_stats: false\n  }\n}\nlayer {\n  name: \"inception_b1_1x1_scale\"\n  type: \"Scale\"\n  bottom: \"inception_b1_1x1\"\n  top: \"inception_b1_1x1\"\n  scale_param {\n    bias_term: true\n  }\n}\nlayer {\n  name: \"inception_b1_1x1_relu\"\n  type: \"ReLU\"\n  bottom: \"inception_b1_1x1\"\n  top: \"inception_b1_1x1\"\n}\nlayer {\n  name: \"inception_b1_1x1_2\"\n  type: \"Convolution\"\n  bottom: \"reduction_a_concat\"\n  top: \"inception_b1_1x1_2\"\n  param {\n    lr_mult: 1\n    decay_mult: 1\n  }\n  param {\n    lr_mult: 2\n    decay_mult: 0\n  }\n  convolution_param {\n    num_output: 384\n    pad: 0\n    kernel_size: 1\n    stride: 1\n    weight_filler {\n      type: \"xavier\"\n      std: 0.01\n    }\n    bias_filler {\n      type: \"constant\"\n      value: 0.2\n    }\n  }\n}\nlayer {\n  name: \"inception_b1_1x1_2_bn\"\n  type: \"BatchNorm\"\n  bottom: \"inception_b1_1x1_2\"\n  top: \"inception_b1_1x1_2\"\n  batch_norm_param {\n    use_global_stats: false\n  }\n}\nlayer {\n  name: \"inception_b1_1x1_2_scale\"\n  type: \"Scale\"\n  bottom: \"inception_b1_1x1_2\"\n  top: \"inception_b1_1x1_2\"\n  scale_param {\n    bias_term: true\n  }\n}\nlayer {\n  name: \"inception_b1_1x1_2_relu\"\n  type: \"ReLU\"\n  bottom: \"inception_b1_1x1_2\"\n  top: \"inception_b1_1x1_2\"\n}\nlayer {\n  name: \"inception_b1_1x7_reduce\"\n  type: \"Convolution\"\n  bottom: \"reduction_a_concat\"\n  top: \"inception_b1_1x7_reduce\"\n  param {\n    lr_mult: 1\n    decay_mult: 1\n  }\n  param {\n    lr_mult: 2\n    decay_mult: 0\n  }\n  convolution_param {\n    num_output: 192\n    pad: 0\n    kernel_size: 1\n    stride: 1\n    weight_filler {\n      type: \"xavier\"\n      std: 0.01\n    }\n    bias_filler {\n      type: \"constant\"\n      value: 0.2\n    }\n  }\n}\nlayer {\n  name: \"inception_b1_1x7_reduce_bn\"\n  type: \"BatchNorm\"\n  bottom: \"inception_b1_1x7_reduce\"\n  top: \"inception_b1_1x7_reduce\"\n  batch_norm_param {\n    use_global_stats: false\n  }\n}\nlayer {\n  name: \"inception_b1_1x7_reduce_scale\"\n  type: \"Scale\"\n  bottom: \"inception_b1_1x7_reduce\"\n  top: \"inception_b1_1x7_reduce\"\n  scale_param {\n    bias_term: true\n  }\n}\nlayer {\n  name: \"inception_b1_1x7_reduce_relu\"\n  type: \"ReLU\"\n  bottom: \"inception_b1_1x7_reduce\"\n  top: \"inception_b1_1x7_reduce\"\n}\nlayer {\n  name: \"inception_b1_1x7\"\n  type: \"Convolution\"\n  bottom: \"inception_b1_1x7_reduce\"\n  top: \"inception_b1_1x7\"\n  param {\n    lr_mult: 1\n    decay_mult: 1\n  }\n  param {\n    lr_mult: 2\n    decay_mult: 0\n  }\n  convolution_param {\n    num_output: 224\n    stride: 1\n    weight_filler {\n      type: \"xavier\"\n      std: 0.01\n    }\n    bias_filler {\n      type: \"constant\"\n      value: 0.2\n    }\n    pad_h: 0\n    pad_w: 3\n    kernel_h: 1\n    kernel_w: 7\n  }\n}\nlayer {\n  name: \"inception_b1_1x7_bn\"\n  type: \"BatchNorm\"\n  bottom: \"inception_b1_1x7\"\n  top: \"inception_b1_1x7\"\n  batch_norm_param {\n    use_global_stats: false\n  }\n}\nlayer {\n  name: \"inception_b1_1x7_scale\"\n  type: \"Scale\"\n  bottom: \"inception_b1_1x7\"\n  top: \"inception_b1_1x7\"\n  scale_param {\n    bias_term: true\n  }\n}\nlayer {\n  name: \"inception_b1_1x7_relu\"\n  type: \"ReLU\"\n  bottom: \"inception_b1_1x7\"\n  top: \"inception_b1_1x7\"\n}\nlayer {\n  name: \"inception_b1_7x1\"\n  type: \"Convolution\"\n  bottom: \"inception_b1_1x7\"\n  top: \"inception_b1_7x1\"\n  param {\n    lr_mult: 1\n    decay_mult: 1\n  }\n  param {\n    lr_mult: 2\n    decay_mult: 0\n  }\n  convolution_param {\n    num_output: 256\n    stride: 1\n    weight_filler {\n      type: \"xavier\"\n      std: 0.01\n    }\n    bias_filler {\n      type: \"constant\"\n      value: 0.2\n    }\n    pad_h: 3\n    pad_w: 0\n    kernel_h: 7\n    kernel_w: 1\n  }\n}\nlayer {\n  name: \"inception_b1_7x1_bn\"\n  type: \"BatchNorm\"\n  bottom: \"inception_b1_7x1\"\n  top: \"inception_b1_7x1\"\n  batch_norm_param {\n    use_global_stats: false\n  }\n}\nlayer {\n  name: \"inception_b1_7x1_scale\"\n  type: \"Scale\"\n  bottom: \"inception_b1_7x1\"\n  top: \"inception_b1_7x1\"\n  scale_param {\n    bias_term: true\n  }\n}\nlayer {\n  name: \"inception_b1_7x1_relu\"\n  type: \"ReLU\"\n  bottom: \"inception_b1_7x1\"\n  top: \"inception_b1_7x1\"\n}\nlayer {\n  name: \"inception_b1_1x7_2_reduce\"\n  type: \"Convolution\"\n  bottom: \"reduction_a_concat\"\n  top: \"inception_b1_1x7_2_reduce\"\n  param {\n    lr_mult: 1\n    decay_mult: 1\n  }\n  param {\n    lr_mult: 2\n    decay_mult: 0\n  }\n  convolution_param {\n    num_output: 192\n    pad: 0\n    kernel_size: 1\n    stride: 1\n    weight_filler {\n      type: \"xavier\"\n      std: 0.01\n    }\n    bias_filler {\n      type: \"constant\"\n      value: 0.2\n    }\n  }\n}\nlayer {\n  name: \"inception_b1_1x7_2_reduce_bn\"\n  type: \"BatchNorm\"\n  bottom: \"inception_b1_1x7_2_reduce\"\n  top: \"inception_b1_1x7_2_reduce\"\n  batch_norm_param {\n    use_global_stats: false\n  }\n}\nlayer {\n  name: \"inception_b1_1x7_2_reduce_scale\"\n  type: \"Scale\"\n  bottom: \"inception_b1_1x7_2_reduce\"\n  top: \"inception_b1_1x7_2_reduce\"\n  scale_param {\n    bias_term: true\n  }\n}\nlayer {\n  name: \"inception_b1_1x7_2_reduce_relu\"\n  type: \"ReLU\"\n  bottom: \"inception_b1_1x7_2_reduce\"\n  top: \"inception_b1_1x7_2_reduce\"\n}\nlayer {\n  name: \"inception_b1_1x7_2\"\n  type: \"Convolution\"\n  bottom: \"inception_b1_1x7_2_reduce\"\n  top: \"inception_b1_1x7_2\"\n  param {\n    lr_mult: 1\n    decay_mult: 1\n  }\n  param {\n    lr_mult: 2\n    decay_mult: 0\n  }\n  convolution_param {\n    num_output: 192\n    stride: 1\n    weight_filler {\n      type: \"xavier\"\n      std: 0.01\n    }\n    bias_filler {\n      type: \"constant\"\n      value: 0.2\n    }\n    pad_h: 0\n    pad_w: 3\n    kernel_h: 1\n    kernel_w: 7\n  }\n}\nlayer {\n  name: \"inception_b1_1x7_2_bn\"\n  type: \"BatchNorm\"\n  bottom: \"inception_b1_1x7_2\"\n  top: \"inception_b1_1x7_2\"\n  batch_norm_param {\n    use_global_stats: false\n  }\n}\nlayer {\n  name: \"inception_b1_1x7_2_scale\"\n  type: \"Scale\"\n  bottom: \"inception_b1_1x7_2\"\n  top: \"inception_b1_1x7_2\"\n  scale_param {\n    bias_term: true\n  }\n}\nlayer {\n  name: \"inception_b1_1x7_2_relu\"\n  type: \"ReLU\"\n  bottom: \"inception_b1_1x7_2\"\n  top: \"inception_b1_1x7_2\"\n}\nlayer {\n  name: \"inception_b1_7x1_2\"\n  type: \"Convolution\"\n  bottom: \"inception_b1_1x7_2\"\n  top: \"inception_b1_7x1_2\"\n  param {\n    lr_mult: 1\n    decay_mult: 1\n  }\n  param {\n    lr_mult: 2\n    decay_mult: 0\n  }\n  convolution_param {\n    num_output: 224\n    stride: 1\n    weight_filler {\n      type: \"xavier\"\n      std: 0.01\n    }\n    bias_filler {\n      type: \"constant\"\n      value: 0.2\n    }\n    pad_h: 3\n    pad_w: 0\n    kernel_h: 7\n    kernel_w: 1\n  }\n}\nlayer {\n  name: \"inception_b1_7x1_2_bn\"\n  type: \"BatchNorm\"\n  bottom: \"inception_b1_7x1_2\"\n  top: \"inception_b1_7x1_2\"\n  batch_norm_param {\n    use_global_stats: false\n  }\n}\nlayer {\n  name: \"inception_b1_7x1_2_scale\"\n  type: \"Scale\"\n  bottom: \"inception_b1_7x1_2\"\n  top: \"inception_b1_7x1_2\"\n  scale_param {\n    bias_term: true\n  }\n}\nlayer {\n  name: \"inception_b1_7x1_2_relu\"\n  type: \"ReLU\"\n  bottom: \"inception_b1_7x1_2\"\n  top: \"inception_b1_7x1_2\"\n}\nlayer {\n  name: \"inception_b1_1x7_3\"\n  type: \"Convolution\"\n  bottom: \"inception_b1_7x1_2\"\n  top: \"inception_b1_1x7_3\"\n  param {\n    lr_mult: 1\n    decay_mult: 1\n  }\n  param {\n    lr_mult: 2\n    decay_mult: 0\n  }\n  convolution_param {\n    num_output: 224\n    stride: 1\n    weight_filler {\n      type: \"xavier\"\n      std: 0.01\n    }\n    bias_filler {\n      type: \"constant\"\n      value: 0.2\n    }\n    pad_h: 0\n    pad_w: 3\n    kernel_h: 1\n    kernel_w: 7\n  }\n}\nlayer {\n  name: \"inception_b1_1x7_3_bn\"\n  type: \"BatchNorm\"\n  bottom: \"inception_b1_1x7_3\"\n  top: \"inception_b1_1x7_3\"\n  batch_norm_param {\n    use_global_stats: false\n  }\n}\nlayer {\n  name: \"inception_b1_1x7_3_scale\"\n  type: \"Scale\"\n  bottom: \"inception_b1_1x7_3\"\n  top: \"inception_b1_1x7_3\"\n  scale_param {\n    bias_term: true\n  }\n}\nlayer {\n  name: \"inception_b1_1x7_3_relu\"\n  type: \"ReLU\"\n  bottom: \"inception_b1_1x7_3\"\n  top: \"inception_b1_1x7_3\"\n}\nlayer {\n  name: \"inception_b1_7x1_3\"\n  type: \"Convolution\"\n  bottom: \"inception_b1_1x7_3\"\n  top: \"inception_b1_7x1_3\"\n  param {\n    lr_mult: 1\n    decay_mult: 1\n  }\n  param {\n    lr_mult: 2\n    decay_mult: 0\n  }\n  convolution_param {\n    num_output: 256\n    stride: 1\n    weight_filler {\n      type: \"xavier\"\n      std: 0.01\n    }\n    bias_filler {\n      type: \"constant\"\n      value: 0.2\n    }\n    pad_h: 3\n    pad_w: 0\n    kernel_h: 7\n    kernel_w: 1\n  }\n}\nlayer {\n  name: \"inception_b1_7x1_3_bn\"\n  type: \"BatchNorm\"\n  bottom: \"inception_b1_7x1_3\"\n  top: \"inception_b1_7x1_3\"\n  batch_norm_param {\n    use_global_stats: false\n  }\n}\nlayer {\n  name: \"inception_b1_7x1_3_scale\"\n  type: \"Scale\"\n  bottom: \"inception_b1_7x1_3\"\n  top: \"inception_b1_7x1_3\"\n  scale_param {\n    bias_term: true\n  }\n}\nlayer {\n  name: \"inception_b1_7x1_3_relu\"\n  type: \"ReLU\"\n  bottom: \"inception_b1_7x1_3\"\n  top: \"inception_b1_7x1_3\"\n}\nlayer {\n  name: \"inception_b1_concat\"\n  type: \"Concat\"\n  bottom: \"inception_b1_1x1\"\n  bottom: \"inception_b1_1x1_2\"\n  bottom: \"inception_b1_7x1\"\n  bottom: \"inception_b1_7x1_3\"\n  top: \"inception_b1_concat\"\n}\nlayer {\n  name: \"inception_b2_pool_ave\"\n  type: \"Pooling\"\n  bottom: \"inception_b1_concat\"\n  top: \"inception_b2_pool_ave\"\n  pooling_param {\n    pool: AVE\n    kernel_size: 3\n    stride: 1\n    pad: 1\n  }\n}\nlayer {\n  name: \"inception_b2_1x1\"\n  type: \"Convolution\"\n  bottom: \"inception_b2_pool_ave\"\n  top: \"inception_b2_1x1\"\n  param {\n    lr_mult: 1\n    decay_mult: 1\n  }\n  param {\n    lr_mult: 2\n    decay_mult: 0\n  }\n  convolution_param {\n    num_output: 128\n    pad: 0\n    kernel_size: 1\n    stride: 1\n    weight_filler {\n      type: \"xavier\"\n      std: 0.01\n    }\n    bias_filler {\n      type: \"constant\"\n      value: 0.2\n    }\n  }\n}\nlayer {\n  name: \"inception_b2_1x1_bn\"\n  type: \"BatchNorm\"\n  bottom: \"inception_b2_1x1\"\n  top: \"inception_b2_1x1\"\n  batch_norm_param {\n    use_global_stats: false\n  }\n}\nlayer {\n  name: \"inception_b2_1x1_scale\"\n  type: \"Scale\"\n  bottom: \"inception_b2_1x1\"\n  top: \"inception_b2_1x1\"\n  scale_param {\n    bias_term: true\n  }\n}\nlayer {\n  name: \"inception_b2_1x1_relu\"\n  type: \"ReLU\"\n  bottom: \"inception_b2_1x1\"\n  top: \"inception_b2_1x1\"\n}\nlayer {\n  name: \"inception_b2_1x1_2\"\n  type: \"Convolution\"\n  bottom: \"inception_b1_concat\"\n  top: \"inception_b2_1x1_2\"\n  param {\n    lr_mult: 1\n    decay_mult: 1\n  }\n  param {\n    lr_mult: 2\n    decay_mult: 0\n  }\n  convolution_param {\n    num_output: 384\n    pad: 0\n    kernel_size: 1\n    stride: 1\n    weight_filler {\n      type: \"xavier\"\n      std: 0.01\n    }\n    bias_filler {\n      type: \"constant\"\n      value: 0.2\n    }\n  }\n}\nlayer {\n  name: \"inception_b2_1x1_2_bn\"\n  type: \"BatchNorm\"\n  bottom: \"inception_b2_1x1_2\"\n  top: \"inception_b2_1x1_2\"\n  batch_norm_param {\n    use_global_stats: false\n  }\n}\nlayer {\n  name: \"inception_b2_1x1_2_scale\"\n  type: \"Scale\"\n  bottom: \"inception_b2_1x1_2\"\n  top: \"inception_b2_1x1_2\"\n  scale_param {\n    bias_term: true\n  }\n}\nlayer {\n  name: \"inception_b2_1x1_2_relu\"\n  type: \"ReLU\"\n  bottom: \"inception_b2_1x1_2\"\n  top: \"inception_b2_1x1_2\"\n}\nlayer {\n  name: \"inception_b2_1x7_reduce\"\n  type: \"Convolution\"\n  bottom: \"inception_b1_concat\"\n  top: \"inception_b2_1x7_reduce\"\n  param {\n    lr_mult: 1\n    decay_mult: 1\n  }\n  param {\n    lr_mult: 2\n    decay_mult: 0\n  }\n  convolution_param {\n    num_output: 192\n    pad: 0\n    kernel_size: 1\n    stride: 1\n    weight_filler {\n      type: \"xavier\"\n      std: 0.01\n    }\n    bias_filler {\n      type: \"constant\"\n      value: 0.2\n    }\n  }\n}\nlayer {\n  name: \"inception_b2_1x7_reduce_bn\"\n  type: \"BatchNorm\"\n  bottom: \"inception_b2_1x7_reduce\"\n  top: \"inception_b2_1x7_reduce\"\n  batch_norm_param {\n    use_global_stats: false\n  }\n}\nlayer {\n  name: \"inception_b2_1x7_reduce_scale\"\n  type: \"Scale\"\n  bottom: \"inception_b2_1x7_reduce\"\n  top: \"inception_b2_1x7_reduce\"\n  scale_param {\n    bias_term: true\n  }\n}\nlayer {\n  name: \"inception_b2_1x7_reduce_relu\"\n  type: \"ReLU\"\n  bottom: \"inception_b2_1x7_reduce\"\n  top: \"inception_b2_1x7_reduce\"\n}\nlayer {\n  name: \"inception_b2_1x7\"\n  type: \"Convolution\"\n  bottom: \"inception_b2_1x7_reduce\"\n  top: \"inception_b2_1x7\"\n  param {\n    lr_mult: 1\n    decay_mult: 1\n  }\n  param {\n    lr_mult: 2\n    decay_mult: 0\n  }\n  convolution_param {\n    num_output: 224\n    stride: 1\n    weight_filler {\n      type: \"xavier\"\n      std: 0.01\n    }\n    bias_filler {\n      type: \"constant\"\n      value: 0.2\n    }\n    pad_h: 0\n    pad_w: 3\n    kernel_h: 1\n    kernel_w: 7\n  }\n}\nlayer {\n  name: \"inception_b2_1x7_bn\"\n  type: \"BatchNorm\"\n  bottom: \"inception_b2_1x7\"\n  top: \"inception_b2_1x7\"\n  batch_norm_param {\n    use_global_stats: false\n  }\n}\nlayer {\n  name: \"inception_b2_1x7_scale\"\n  type: \"Scale\"\n  bottom: \"inception_b2_1x7\"\n  top: \"inception_b2_1x7\"\n  scale_param {\n    bias_term: true\n  }\n}\nlayer {\n  name: \"inception_b2_1x7_relu\"\n  type: \"ReLU\"\n  bottom: \"inception_b2_1x7\"\n  top: \"inception_b2_1x7\"\n}\nlayer {\n  name: \"inception_b2_7x1\"\n  type: \"Convolution\"\n  bottom: \"inception_b2_1x7\"\n  top: \"inception_b2_7x1\"\n  param {\n    lr_mult: 1\n    decay_mult: 1\n  }\n  param {\n    lr_mult: 2\n    decay_mult: 0\n  }\n  convolution_param {\n    num_output: 256\n    stride: 1\n    weight_filler {\n      type: \"xavier\"\n      std: 0.01\n    }\n    bias_filler {\n      type: \"constant\"\n      value: 0.2\n    }\n    pad_h: 3\n    pad_w: 0\n    kernel_h: 7\n    kernel_w: 1\n  }\n}\nlayer {\n  name: \"inception_b2_7x1_bn\"\n  type: \"BatchNorm\"\n  bottom: \"inception_b2_7x1\"\n  top: \"inception_b2_7x1\"\n  batch_norm_param {\n    use_global_stats: false\n  }\n}\nlayer {\n  name: \"inception_b2_7x1_scale\"\n  type: \"Scale\"\n  bottom: \"inception_b2_7x1\"\n  top: \"inception_b2_7x1\"\n  scale_param {\n    bias_term: true\n  }\n}\nlayer {\n  name: \"inception_b2_7x1_relu\"\n  type: \"ReLU\"\n  bottom: \"inception_b2_7x1\"\n  top: \"inception_b2_7x1\"\n}\nlayer {\n  name: \"inception_b2_1x7_2_reduce\"\n  type: \"Convolution\"\n  bottom: \"inception_b1_concat\"\n  top: \"inception_b2_1x7_2_reduce\"\n  param {\n    lr_mult: 1\n    decay_mult: 1\n  }\n  param {\n    lr_mult: 2\n    decay_mult: 0\n  }\n  convolution_param {\n    num_output: 192\n    pad: 0\n    kernel_size: 1\n    stride: 1\n    weight_filler {\n      type: \"xavier\"\n      std: 0.01\n    }\n    bias_filler {\n      type: \"constant\"\n      value: 0.2\n    }\n  }\n}\nlayer {\n  name: \"inception_b2_1x7_2_reduce_bn\"\n  type: \"BatchNorm\"\n  bottom: \"inception_b2_1x7_2_reduce\"\n  top: \"inception_b2_1x7_2_reduce\"\n  batch_norm_param {\n    use_global_stats: false\n  }\n}\nlayer {\n  name: \"inception_b2_1x7_2_reduce_scale\"\n  type: \"Scale\"\n  bottom: \"inception_b2_1x7_2_reduce\"\n  top: \"inception_b2_1x7_2_reduce\"\n  scale_param {\n    bias_term: true\n  }\n}\nlayer {\n  name: \"inception_b2_1x7_2_reduce_relu\"\n  type: \"ReLU\"\n  bottom: \"inception_b2_1x7_2_reduce\"\n  top: \"inception_b2_1x7_2_reduce\"\n}\nlayer {\n  name: \"inception_b2_1x7_2\"\n  type: \"Convolution\"\n  bottom: \"inception_b2_1x7_2_reduce\"\n  top: \"inception_b2_1x7_2\"\n  param {\n    lr_mult: 1\n    decay_mult: 1\n  }\n  param {\n    lr_mult: 2\n    decay_mult: 0\n  }\n  convolution_param {\n    num_output: 192\n    stride: 1\n    weight_filler {\n      type: \"xavier\"\n      std: 0.01\n    }\n    bias_filler {\n      type: \"constant\"\n      value: 0.2\n    }\n    pad_h: 0\n    pad_w: 3\n    kernel_h: 1\n    kernel_w: 7\n  }\n}\nlayer {\n  name: \"inception_b2_1x7_2_bn\"\n  type: \"BatchNorm\"\n  bottom: \"inception_b2_1x7_2\"\n  top: \"inception_b2_1x7_2\"\n  batch_norm_param {\n    use_global_stats: false\n  }\n}\nlayer {\n  name: \"inception_b2_1x7_2_scale\"\n  type: \"Scale\"\n  bottom: \"inception_b2_1x7_2\"\n  top: \"inception_b2_1x7_2\"\n  scale_param {\n    bias_term: true\n  }\n}\nlayer {\n  name: \"inception_b2_1x7_2_relu\"\n  type: \"ReLU\"\n  bottom: \"inception_b2_1x7_2\"\n  top: \"inception_b2_1x7_2\"\n}\nlayer {\n  name: \"inception_b2_7x1_2\"\n  type: \"Convolution\"\n  bottom: \"inception_b2_1x7_2\"\n  top: \"inception_b2_7x1_2\"\n  param {\n    lr_mult: 1\n    decay_mult: 1\n  }\n  param {\n    lr_mult: 2\n    decay_mult: 0\n  }\n  convolution_param {\n    num_output: 224\n    stride: 1\n    weight_filler {\n      type: \"xavier\"\n      std: 0.01\n    }\n    bias_filler {\n      type: \"constant\"\n      value: 0.2\n    }\n    pad_h: 3\n    pad_w: 0\n    kernel_h: 7\n    kernel_w: 1\n  }\n}\nlayer {\n  name: \"inception_b2_7x1_2_bn\"\n  type: \"BatchNorm\"\n  bottom: \"inception_b2_7x1_2\"\n  top: \"inception_b2_7x1_2\"\n  batch_norm_param {\n    use_global_stats: false\n  }\n}\nlayer {\n  name: \"inception_b2_7x1_2_scale\"\n  type: \"Scale\"\n  bottom: \"inception_b2_7x1_2\"\n  top: \"inception_b2_7x1_2\"\n  scale_param {\n    bias_term: true\n  }\n}\nlayer {\n  name: \"inception_b2_7x1_2_relu\"\n  type: \"ReLU\"\n  bottom: \"inception_b2_7x1_2\"\n  top: \"inception_b2_7x1_2\"\n}\nlayer {\n  name: \"inception_b2_1x7_3\"\n  type: \"Convolution\"\n  bottom: \"inception_b2_7x1_2\"\n  top: \"inception_b2_1x7_3\"\n  param {\n    lr_mult: 1\n    decay_mult: 1\n  }\n  param {\n    lr_mult: 2\n    decay_mult: 0\n  }\n  convolution_param {\n    num_output: 224\n    stride: 1\n    weight_filler {\n      type: \"xavier\"\n      std: 0.01\n    }\n    bias_filler {\n      type: \"constant\"\n      value: 0.2\n    }\n    pad_h: 0\n    pad_w: 3\n    kernel_h: 1\n    kernel_w: 7\n  }\n}\nlayer {\n  name: \"inception_b2_1x7_3_bn\"\n  type: \"BatchNorm\"\n  bottom: \"inception_b2_1x7_3\"\n  top: \"inception_b2_1x7_3\"\n  batch_norm_param {\n    use_global_stats: false\n  }\n}\nlayer {\n  name: \"inception_b2_1x7_3_scale\"\n  type: \"Scale\"\n  bottom: \"inception_b2_1x7_3\"\n  top: \"inception_b2_1x7_3\"\n  scale_param {\n    bias_term: true\n  }\n}\nlayer {\n  name: \"inception_b2_1x7_3_relu\"\n  type: \"ReLU\"\n  bottom: \"inception_b2_1x7_3\"\n  top: \"inception_b2_1x7_3\"\n}\nlayer {\n  name: \"inception_b2_7x1_3\"\n  type: \"Convolution\"\n  bottom: \"inception_b2_1x7_3\"\n  top: \"inception_b2_7x1_3\"\n  param {\n    lr_mult: 1\n    decay_mult: 1\n  }\n  param {\n    lr_mult: 2\n    decay_mult: 0\n  }\n  convolution_param {\n    num_output: 256\n    stride: 1\n    weight_filler {\n      type: \"xavier\"\n      std: 0.01\n    }\n    bias_filler {\n      type: \"constant\"\n      value: 0.2\n    }\n    pad_h: 3\n    pad_w: 0\n    kernel_h: 7\n    kernel_w: 1\n  }\n}\nlayer {\n  name: \"inception_b2_7x1_3_bn\"\n  type: \"BatchNorm\"\n  bottom: \"inception_b2_7x1_3\"\n  top: \"inception_b2_7x1_3\"\n  batch_norm_param {\n    use_global_stats: false\n  }\n}\nlayer {\n  name: \"inception_b2_7x1_3_scale\"\n  type: \"Scale\"\n  bottom: \"inception_b2_7x1_3\"\n  top: \"inception_b2_7x1_3\"\n  scale_param {\n    bias_term: true\n  }\n}\nlayer {\n  name: \"inception_b2_7x1_3_relu\"\n  type: \"ReLU\"\n  bottom: \"inception_b2_7x1_3\"\n  top: \"inception_b2_7x1_3\"\n}\nlayer {\n  name: \"inception_b2_concat\"\n  type: \"Concat\"\n  bottom: \"inception_b2_1x1\"\n  bottom: \"inception_b2_1x1_2\"\n  bottom: \"inception_b2_7x1\"\n  bottom: \"inception_b2_7x1_3\"\n  top: \"inception_b2_concat\"\n}\nlayer {\n  name: \"inception_b3_pool_ave\"\n  type: \"Pooling\"\n  bottom: \"inception_b2_concat\"\n  top: \"inception_b3_pool_ave\"\n  pooling_param {\n    pool: AVE\n    kernel_size: 3\n    stride: 1\n    pad: 1\n  }\n}\nlayer {\n  name: \"inception_b3_1x1\"\n  type: \"Convolution\"\n  bottom: \"inception_b3_pool_ave\"\n  top: \"inception_b3_1x1\"\n  param {\n    lr_mult: 1\n    decay_mult: 1\n  }\n  param {\n    lr_mult: 2\n    decay_mult: 0\n  }\n  convolution_param {\n    num_output: 128\n    pad: 0\n    kernel_size: 1\n    stride: 1\n    weight_filler {\n      type: \"xavier\"\n      std: 0.01\n    }\n    bias_filler {\n      type: \"constant\"\n      value: 0.2\n    }\n  }\n}\nlayer {\n  name: \"inception_b3_1x1_bn\"\n  type: \"BatchNorm\"\n  bottom: \"inception_b3_1x1\"\n  top: \"inception_b3_1x1\"\n  batch_norm_param {\n    use_global_stats: false\n  }\n}\nlayer {\n  name: \"inception_b3_1x1_scale\"\n  type: \"Scale\"\n  bottom: \"inception_b3_1x1\"\n  top: \"inception_b3_1x1\"\n  scale_param {\n    bias_term: true\n  }\n}\nlayer {\n  name: \"inception_b3_1x1_relu\"\n  type: \"ReLU\"\n  bottom: \"inception_b3_1x1\"\n  top: \"inception_b3_1x1\"\n}\nlayer {\n  name: \"inception_b3_1x1_2\"\n  type: \"Convolution\"\n  bottom: \"inception_b2_concat\"\n  top: \"inception_b3_1x1_2\"\n  param {\n    lr_mult: 1\n    decay_mult: 1\n  }\n  param {\n    lr_mult: 2\n    decay_mult: 0\n  }\n  convolution_param {\n    num_output: 384\n    pad: 0\n    kernel_size: 1\n    stride: 1\n    weight_filler {\n      type: \"xavier\"\n      std: 0.01\n    }\n    bias_filler {\n      type: \"constant\"\n      value: 0.2\n    }\n  }\n}\nlayer {\n  name: \"inception_b3_1x1_2_bn\"\n  type: \"BatchNorm\"\n  bottom: \"inception_b3_1x1_2\"\n  top: \"inception_b3_1x1_2\"\n  batch_norm_param {\n    use_global_stats: false\n  }\n}\nlayer {\n  name: \"inception_b3_1x1_2_scale\"\n  type: \"Scale\"\n  bottom: \"inception_b3_1x1_2\"\n  top: \"inception_b3_1x1_2\"\n  scale_param {\n    bias_term: true\n  }\n}\nlayer {\n  name: \"inception_b3_1x1_2_relu\"\n  type: \"ReLU\"\n  bottom: \"inception_b3_1x1_2\"\n  top: \"inception_b3_1x1_2\"\n}\nlayer {\n  name: \"inception_b3_1x7_reduce\"\n  type: \"Convolution\"\n  bottom: \"inception_b2_concat\"\n  top: \"inception_b3_1x7_reduce\"\n  param {\n    lr_mult: 1\n    decay_mult: 1\n  }\n  param {\n    lr_mult: 2\n    decay_mult: 0\n  }\n  convolution_param {\n    num_output: 192\n    pad: 0\n    kernel_size: 1\n    stride: 1\n    weight_filler {\n      type: \"xavier\"\n      std: 0.01\n    }\n    bias_filler {\n      type: \"constant\"\n      value: 0.2\n    }\n  }\n}\nlayer {\n  name: \"inception_b3_1x7_reduce_bn\"\n  type: \"BatchNorm\"\n  bottom: \"inception_b3_1x7_reduce\"\n  top: \"inception_b3_1x7_reduce\"\n  batch_norm_param {\n    use_global_stats: false\n  }\n}\nlayer {\n  name: \"inception_b3_1x7_reduce_scale\"\n  type: \"Scale\"\n  bottom: \"inception_b3_1x7_reduce\"\n  top: \"inception_b3_1x7_reduce\"\n  scale_param {\n    bias_term: true\n  }\n}\nlayer {\n  name: \"inception_b3_1x7_reduce_relu\"\n  type: \"ReLU\"\n  bottom: \"inception_b3_1x7_reduce\"\n  top: \"inception_b3_1x7_reduce\"\n}\nlayer {\n  name: \"inception_b3_1x7\"\n  type: \"Convolution\"\n  bottom: \"inception_b3_1x7_reduce\"\n  top: \"inception_b3_1x7\"\n  param {\n    lr_mult: 1\n    decay_mult: 1\n  }\n  param {\n    lr_mult: 2\n    decay_mult: 0\n  }\n  convolution_param {\n    num_output: 224\n    stride: 1\n    weight_filler {\n      type: \"xavier\"\n      std: 0.01\n    }\n    bias_filler {\n      type: \"constant\"\n      value: 0.2\n    }\n    pad_h: 0\n    pad_w: 3\n    kernel_h: 1\n    kernel_w: 7\n  }\n}\nlayer {\n  name: \"inception_b3_1x7_bn\"\n  type: \"BatchNorm\"\n  bottom: \"inception_b3_1x7\"\n  top: \"inception_b3_1x7\"\n  batch_norm_param {\n    use_global_stats: false\n  }\n}\nlayer {\n  name: \"inception_b3_1x7_scale\"\n  type: \"Scale\"\n  bottom: \"inception_b3_1x7\"\n  top: \"inception_b3_1x7\"\n  scale_param {\n    bias_term: true\n  }\n}\nlayer {\n  name: \"inception_b3_1x7_relu\"\n  type: \"ReLU\"\n  bottom: \"inception_b3_1x7\"\n  top: \"inception_b3_1x7\"\n}\nlayer {\n  name: \"inception_b3_7x1\"\n  type: \"Convolution\"\n  bottom: \"inception_b3_1x7\"\n  top: \"inception_b3_7x1\"\n  param {\n    lr_mult: 1\n    decay_mult: 1\n  }\n  param {\n    lr_mult: 2\n    decay_mult: 0\n  }\n  convolution_param {\n    num_output: 256\n    stride: 1\n    weight_filler {\n      type: \"xavier\"\n      std: 0.01\n    }\n    bias_filler {\n      type: \"constant\"\n      value: 0.2\n    }\n    pad_h: 3\n    pad_w: 0\n    kernel_h: 7\n    kernel_w: 1\n  }\n}\nlayer {\n  name: \"inception_b3_7x1_bn\"\n  type: \"BatchNorm\"\n  bottom: \"inception_b3_7x1\"\n  top: \"inception_b3_7x1\"\n  batch_norm_param {\n    use_global_stats: false\n  }\n}\nlayer {\n  name: \"inception_b3_7x1_scale\"\n  type: \"Scale\"\n  bottom: \"inception_b3_7x1\"\n  top: \"inception_b3_7x1\"\n  scale_param {\n    bias_term: true\n  }\n}\nlayer {\n  name: \"inception_b3_7x1_relu\"\n  type: \"ReLU\"\n  bottom: \"inception_b3_7x1\"\n  top: \"inception_b3_7x1\"\n}\nlayer {\n  name: \"inception_b3_1x7_2_reduce\"\n  type: \"Convolution\"\n  bottom: \"inception_b2_concat\"\n  top: \"inception_b3_1x7_2_reduce\"\n  param {\n    lr_mult: 1\n    decay_mult: 1\n  }\n  param {\n    lr_mult: 2\n    decay_mult: 0\n  }\n  convolution_param {\n    num_output: 192\n    pad: 0\n    kernel_size: 1\n    stride: 1\n    weight_filler {\n      type: \"xavier\"\n      std: 0.01\n    }\n    bias_filler {\n      type: \"constant\"\n      value: 0.2\n    }\n  }\n}\nlayer {\n  name: \"inception_b3_1x7_2_reduce_bn\"\n  type: \"BatchNorm\"\n  bottom: \"inception_b3_1x7_2_reduce\"\n  top: \"inception_b3_1x7_2_reduce\"\n  batch_norm_param {\n    use_global_stats: false\n  }\n}\nlayer {\n  name: \"inception_b3_1x7_2_reduce_scale\"\n  type: \"Scale\"\n  bottom: \"inception_b3_1x7_2_reduce\"\n  top: \"inception_b3_1x7_2_reduce\"\n  scale_param {\n    bias_term: true\n  }\n}\nlayer {\n  name: \"inception_b3_1x7_2_reduce_relu\"\n  type: \"ReLU\"\n  bottom: \"inception_b3_1x7_2_reduce\"\n  top: \"inception_b3_1x7_2_reduce\"\n}\nlayer {\n  name: \"inception_b3_1x7_2\"\n  type: \"Convolution\"\n  bottom: \"inception_b3_1x7_2_reduce\"\n  top: \"inception_b3_1x7_2\"\n  param {\n    lr_mult: 1\n    decay_mult: 1\n  }\n  param {\n    lr_mult: 2\n    decay_mult: 0\n  }\n  convolution_param {\n    num_output: 192\n    stride: 1\n    weight_filler {\n      type: \"xavier\"\n      std: 0.01\n    }\n    bias_filler {\n      type: \"constant\"\n      value: 0.2\n    }\n    pad_h: 0\n    pad_w: 3\n    kernel_h: 1\n    kernel_w: 7\n  }\n}\nlayer {\n  name: \"inception_b3_1x7_2_bn\"\n  type: \"BatchNorm\"\n  bottom: \"inception_b3_1x7_2\"\n  top: \"inception_b3_1x7_2\"\n  batch_norm_param {\n    use_global_stats: false\n  }\n}\nlayer {\n  name: \"inception_b3_1x7_2_scale\"\n  type: \"Scale\"\n  bottom: \"inception_b3_1x7_2\"\n  top: \"inception_b3_1x7_2\"\n  scale_param {\n    bias_term: true\n  }\n}\nlayer {\n  name: \"inception_b3_1x7_2_relu\"\n  type: \"ReLU\"\n  bottom: \"inception_b3_1x7_2\"\n  top: \"inception_b3_1x7_2\"\n}\nlayer {\n  name: \"inception_b3_7x1_2\"\n  type: \"Convolution\"\n  bottom: \"inception_b3_1x7_2\"\n  top: \"inception_b3_7x1_2\"\n  param {\n    lr_mult: 1\n    decay_mult: 1\n  }\n  param {\n    lr_mult: 2\n    decay_mult: 0\n  }\n  convolution_param {\n    num_output: 224\n    stride: 1\n    weight_filler {\n      type: \"xavier\"\n      std: 0.01\n    }\n    bias_filler {\n      type: \"constant\"\n      value: 0.2\n    }\n    pad_h: 3\n    pad_w: 0\n    kernel_h: 7\n    kernel_w: 1\n  }\n}\nlayer {\n  name: \"inception_b3_7x1_2_bn\"\n  type: \"BatchNorm\"\n  bottom: \"inception_b3_7x1_2\"\n  top: \"inception_b3_7x1_2\"\n  batch_norm_param {\n    use_global_stats: false\n  }\n}\nlayer {\n  name: \"inception_b3_7x1_2_scale\"\n  type: \"Scale\"\n  bottom: \"inception_b3_7x1_2\"\n  top: \"inception_b3_7x1_2\"\n  scale_param {\n    bias_term: true\n  }\n}\nlayer {\n  name: \"inception_b3_7x1_2_relu\"\n  type: \"ReLU\"\n  bottom: \"inception_b3_7x1_2\"\n  top: \"inception_b3_7x1_2\"\n}\nlayer {\n  name: \"inception_b3_1x7_3\"\n  type: \"Convolution\"\n  bottom: \"inception_b3_7x1_2\"\n  top: \"inception_b3_1x7_3\"\n  param {\n    lr_mult: 1\n    decay_mult: 1\n  }\n  param {\n    lr_mult: 2\n    decay_mult: 0\n  }\n  convolution_param {\n    num_output: 224\n    stride: 1\n    weight_filler {\n      type: \"xavier\"\n      std: 0.01\n    }\n    bias_filler {\n      type: \"constant\"\n      value: 0.2\n    }\n    pad_h: 0\n    pad_w: 3\n    kernel_h: 1\n    kernel_w: 7\n  }\n}\nlayer {\n  name: \"inception_b3_1x7_3_bn\"\n  type: \"BatchNorm\"\n  bottom: \"inception_b3_1x7_3\"\n  top: \"inception_b3_1x7_3\"\n  batch_norm_param {\n    use_global_stats: false\n  }\n}\nlayer {\n  name: \"inception_b3_1x7_3_scale\"\n  type: \"Scale\"\n  bottom: \"inception_b3_1x7_3\"\n  top: \"inception_b3_1x7_3\"\n  scale_param {\n    bias_term: true\n  }\n}\nlayer {\n  name: \"inception_b3_1x7_3_relu\"\n  type: \"ReLU\"\n  bottom: \"inception_b3_1x7_3\"\n  top: \"inception_b3_1x7_3\"\n}\nlayer {\n  name: \"inception_b3_7x1_3\"\n  type: \"Convolution\"\n  bottom: \"inception_b3_1x7_3\"\n  top: \"inception_b3_7x1_3\"\n  param {\n    lr_mult: 1\n    decay_mult: 1\n  }\n  param {\n    lr_mult: 2\n    decay_mult: 0\n  }\n  convolution_param {\n    num_output: 256\n    stride: 1\n    weight_filler {\n      type: \"xavier\"\n      std: 0.01\n    }\n    bias_filler {\n      type: \"constant\"\n      value: 0.2\n    }\n    pad_h: 3\n    pad_w: 0\n    kernel_h: 7\n    kernel_w: 1\n  }\n}\nlayer {\n  name: \"inception_b3_7x1_3_bn\"\n  type: \"BatchNorm\"\n  bottom: \"inception_b3_7x1_3\"\n  top: \"inception_b3_7x1_3\"\n  batch_norm_param {\n    use_global_stats: false\n  }\n}\nlayer {\n  name: \"inception_b3_7x1_3_scale\"\n  type: \"Scale\"\n  bottom: \"inception_b3_7x1_3\"\n  top: \"inception_b3_7x1_3\"\n  scale_param {\n    bias_term: true\n  }\n}\nlayer {\n  name: \"inception_b3_7x1_3_relu\"\n  type: \"ReLU\"\n  bottom: \"inception_b3_7x1_3\"\n  top: \"inception_b3_7x1_3\"\n}\nlayer {\n  name: \"inception_b3_concat\"\n  type: \"Concat\"\n  bottom: \"inception_b3_1x1\"\n  bottom: \"inception_b3_1x1_2\"\n  bottom: \"inception_b3_7x1\"\n  bottom: \"inception_b3_7x1_3\"\n  top: \"inception_b3_concat\"\n}\nlayer {\n  name: \"inception_b4_pool_ave\"\n  type: \"Pooling\"\n  bottom: \"inception_b3_concat\"\n  top: \"inception_b4_pool_ave\"\n  pooling_param {\n    pool: AVE\n    kernel_size: 3\n    stride: 1\n    pad: 1\n  }\n}\nlayer {\n  name: \"inception_b4_1x1\"\n  type: \"Convolution\"\n  bottom: \"inception_b4_pool_ave\"\n  top: \"inception_b4_1x1\"\n  param {\n    lr_mult: 1\n    decay_mult: 1\n  }\n  param {\n    lr_mult: 2\n    decay_mult: 0\n  }\n  convolution_param {\n    num_output: 128\n    pad: 0\n    kernel_size: 1\n    stride: 1\n    weight_filler {\n      type: \"xavier\"\n      std: 0.01\n    }\n    bias_filler {\n      type: \"constant\"\n      value: 0.2\n    }\n  }\n}\nlayer {\n  name: \"inception_b4_1x1_bn\"\n  type: \"BatchNorm\"\n  bottom: \"inception_b4_1x1\"\n  top: \"inception_b4_1x1\"\n  batch_norm_param {\n    use_global_stats: false\n  }\n}\nlayer {\n  name: \"inception_b4_1x1_scale\"\n  type: \"Scale\"\n  bottom: \"inception_b4_1x1\"\n  top: \"inception_b4_1x1\"\n  scale_param {\n    bias_term: true\n  }\n}\nlayer {\n  name: \"inception_b4_1x1_relu\"\n  type: \"ReLU\"\n  bottom: \"inception_b4_1x1\"\n  top: \"inception_b4_1x1\"\n}\nlayer {\n  name: \"inception_b4_1x1_2\"\n  type: \"Convolution\"\n  bottom: \"inception_b3_concat\"\n  top: \"inception_b4_1x1_2\"\n  param {\n    lr_mult: 1\n    decay_mult: 1\n  }\n  param {\n    lr_mult: 2\n    decay_mult: 0\n  }\n  convolution_param {\n    num_output: 384\n    pad: 0\n    kernel_size: 1\n    stride: 1\n    weight_filler {\n      type: \"xavier\"\n      std: 0.01\n    }\n    bias_filler {\n      type: \"constant\"\n      value: 0.2\n    }\n  }\n}\nlayer {\n  name: \"inception_b4_1x1_2_bn\"\n  type: \"BatchNorm\"\n  bottom: \"inception_b4_1x1_2\"\n  top: \"inception_b4_1x1_2\"\n  batch_norm_param {\n    use_global_stats: false\n  }\n}\nlayer {\n  name: \"inception_b4_1x1_2_scale\"\n  type: \"Scale\"\n  bottom: \"inception_b4_1x1_2\"\n  top: \"inception_b4_1x1_2\"\n  scale_param {\n    bias_term: true\n  }\n}\nlayer {\n  name: \"inception_b4_1x1_2_relu\"\n  type: \"ReLU\"\n  bottom: \"inception_b4_1x1_2\"\n  top: \"inception_b4_1x1_2\"\n}\nlayer {\n  name: \"inception_b4_1x7_reduce\"\n  type: \"Convolution\"\n  bottom: \"inception_b3_concat\"\n  top: \"inception_b4_1x7_reduce\"\n  param {\n    lr_mult: 1\n    decay_mult: 1\n  }\n  param {\n    lr_mult: 2\n    decay_mult: 0\n  }\n  convolution_param {\n    num_output: 192\n    pad: 0\n    kernel_size: 1\n    stride: 1\n    weight_filler {\n      type: \"xavier\"\n      std: 0.01\n    }\n    bias_filler {\n      type: \"constant\"\n      value: 0.2\n    }\n  }\n}\nlayer {\n  name: \"inception_b4_1x7_reduce_bn\"\n  type: \"BatchNorm\"\n  bottom: \"inception_b4_1x7_reduce\"\n  top: \"inception_b4_1x7_reduce\"\n  batch_norm_param {\n    use_global_stats: false\n  }\n}\nlayer {\n  name: \"inception_b4_1x7_reduce_scale\"\n  type: \"Scale\"\n  bottom: \"inception_b4_1x7_reduce\"\n  top: \"inception_b4_1x7_reduce\"\n  scale_param {\n    bias_term: true\n  }\n}\nlayer {\n  name: \"inception_b4_1x7_reduce_relu\"\n  type: \"ReLU\"\n  bottom: \"inception_b4_1x7_reduce\"\n  top: \"inception_b4_1x7_reduce\"\n}\nlayer {\n  name: \"inception_b4_1x7\"\n  type: \"Convolution\"\n  bottom: \"inception_b4_1x7_reduce\"\n  top: \"inception_b4_1x7\"\n  param {\n    lr_mult: 1\n    decay_mult: 1\n  }\n  param {\n    lr_mult: 2\n    decay_mult: 0\n  }\n  convolution_param {\n    num_output: 224\n    stride: 1\n    weight_filler {\n      type: \"xavier\"\n      std: 0.01\n    }\n    bias_filler {\n      type: \"constant\"\n      value: 0.2\n    }\n    pad_h: 0\n    pad_w: 3\n    kernel_h: 1\n    kernel_w: 7\n  }\n}\nlayer {\n  name: \"inception_b4_1x7_bn\"\n  type: \"BatchNorm\"\n  bottom: \"inception_b4_1x7\"\n  top: \"inception_b4_1x7\"\n  batch_norm_param {\n    use_global_stats: false\n  }\n}\nlayer {\n  name: \"inception_b4_1x7_scale\"\n  type: \"Scale\"\n  bottom: \"inception_b4_1x7\"\n  top: \"inception_b4_1x7\"\n  scale_param {\n    bias_term: true\n  }\n}\nlayer {\n  name: \"inception_b4_1x7_relu\"\n  type: \"ReLU\"\n  bottom: \"inception_b4_1x7\"\n  top: \"inception_b4_1x7\"\n}\nlayer {\n  name: \"inception_b4_7x1\"\n  type: \"Convolution\"\n  bottom: \"inception_b4_1x7\"\n  top: \"inception_b4_7x1\"\n  param {\n    lr_mult: 1\n    decay_mult: 1\n  }\n  param {\n    lr_mult: 2\n    decay_mult: 0\n  }\n  convolution_param {\n    num_output: 256\n    stride: 1\n    weight_filler {\n      type: \"xavier\"\n      std: 0.01\n    }\n    bias_filler {\n      type: \"constant\"\n      value: 0.2\n    }\n    pad_h: 3\n    pad_w: 0\n    kernel_h: 7\n    kernel_w: 1\n  }\n}\nlayer {\n  name: \"inception_b4_7x1_bn\"\n  type: \"BatchNorm\"\n  bottom: \"inception_b4_7x1\"\n  top: \"inception_b4_7x1\"\n  batch_norm_param {\n    use_global_stats: false\n  }\n}\nlayer {\n  name: \"inception_b4_7x1_scale\"\n  type: \"Scale\"\n  bottom: \"inception_b4_7x1\"\n  top: \"inception_b4_7x1\"\n  scale_param {\n    bias_term: true\n  }\n}\nlayer {\n  name: \"inception_b4_7x1_relu\"\n  type: \"ReLU\"\n  bottom: \"inception_b4_7x1\"\n  top: \"inception_b4_7x1\"\n}\nlayer {\n  name: \"inception_b4_1x7_2_reduce\"\n  type: \"Convolution\"\n  bottom: \"inception_b3_concat\"\n  top: \"inception_b4_1x7_2_reduce\"\n  param {\n    lr_mult: 1\n    decay_mult: 1\n  }\n  param {\n    lr_mult: 2\n    decay_mult: 0\n  }\n  convolution_param {\n    num_output: 192\n    pad: 0\n    kernel_size: 1\n    stride: 1\n    weight_filler {\n      type: \"xavier\"\n      std: 0.01\n    }\n    bias_filler {\n      type: \"constant\"\n      value: 0.2\n    }\n  }\n}\nlayer {\n  name: \"inception_b4_1x7_2_reduce_bn\"\n  type: \"BatchNorm\"\n  bottom: \"inception_b4_1x7_2_reduce\"\n  top: \"inception_b4_1x7_2_reduce\"\n  batch_norm_param {\n    use_global_stats: false\n  }\n}\nlayer {\n  name: \"inception_b4_1x7_2_reduce_scale\"\n  type: \"Scale\"\n  bottom: \"inception_b4_1x7_2_reduce\"\n  top: \"inception_b4_1x7_2_reduce\"\n  scale_param {\n    bias_term: true\n  }\n}\nlayer {\n  name: \"inception_b4_1x7_2_reduce_relu\"\n  type: \"ReLU\"\n  bottom: \"inception_b4_1x7_2_reduce\"\n  top: \"inception_b4_1x7_2_reduce\"\n}\nlayer {\n  name: \"inception_b4_1x7_2\"\n  type: \"Convolution\"\n  bottom: \"inception_b4_1x7_2_reduce\"\n  top: \"inception_b4_1x7_2\"\n  param {\n    lr_mult: 1\n    decay_mult: 1\n  }\n  param {\n    lr_mult: 2\n    decay_mult: 0\n  }\n  convolution_param {\n    num_output: 192\n    stride: 1\n    weight_filler {\n      type: \"xavier\"\n      std: 0.01\n    }\n    bias_filler {\n      type: \"constant\"\n      value: 0.2\n    }\n    pad_h: 0\n    pad_w: 3\n    kernel_h: 1\n    kernel_w: 7\n  }\n}\nlayer {\n  name: \"inception_b4_1x7_2_bn\"\n  type: \"BatchNorm\"\n  bottom: \"inception_b4_1x7_2\"\n  top: \"inception_b4_1x7_2\"\n  batch_norm_param {\n    use_global_stats: false\n  }\n}\nlayer {\n  name: \"inception_b4_1x7_2_scale\"\n  type: \"Scale\"\n  bottom: \"inception_b4_1x7_2\"\n  top: \"inception_b4_1x7_2\"\n  scale_param {\n    bias_term: true\n  }\n}\nlayer {\n  name: \"inception_b4_1x7_2_relu\"\n  type: \"ReLU\"\n  bottom: \"inception_b4_1x7_2\"\n  top: \"inception_b4_1x7_2\"\n}\nlayer {\n  name: \"inception_b4_7x1_2\"\n  type: \"Convolution\"\n  bottom: \"inception_b4_1x7_2\"\n  top: \"inception_b4_7x1_2\"\n  param {\n    lr_mult: 1\n    decay_mult: 1\n  }\n  param {\n    lr_mult: 2\n    decay_mult: 0\n  }\n  convolution_param {\n    num_output: 224\n    stride: 1\n    weight_filler {\n      type: \"xavier\"\n      std: 0.01\n    }\n    bias_filler {\n      type: \"constant\"\n      value: 0.2\n    }\n    pad_h: 3\n    pad_w: 0\n    kernel_h: 7\n    kernel_w: 1\n  }\n}\nlayer {\n  name: \"inception_b4_7x1_2_bn\"\n  type: \"BatchNorm\"\n  bottom: \"inception_b4_7x1_2\"\n  top: \"inception_b4_7x1_2\"\n  batch_norm_param {\n    use_global_stats: false\n  }\n}\nlayer {\n  name: \"inception_b4_7x1_2_scale\"\n  type: \"Scale\"\n  bottom: \"inception_b4_7x1_2\"\n  top: \"inception_b4_7x1_2\"\n  scale_param {\n    bias_term: true\n  }\n}\nlayer {\n  name: \"inception_b4_7x1_2_relu\"\n  type: \"ReLU\"\n  bottom: \"inception_b4_7x1_2\"\n  top: \"inception_b4_7x1_2\"\n}\nlayer {\n  name: \"inception_b4_1x7_3\"\n  type: \"Convolution\"\n  bottom: \"inception_b4_7x1_2\"\n  top: \"inception_b4_1x7_3\"\n  param {\n    lr_mult: 1\n    decay_mult: 1\n  }\n  param {\n    lr_mult: 2\n    decay_mult: 0\n  }\n  convolution_param {\n    num_output: 224\n    stride: 1\n    weight_filler {\n      type: \"xavier\"\n      std: 0.01\n    }\n    bias_filler {\n      type: \"constant\"\n      value: 0.2\n    }\n    pad_h: 0\n    pad_w: 3\n    kernel_h: 1\n    kernel_w: 7\n  }\n}\nlayer {\n  name: \"inception_b4_1x7_3_bn\"\n  type: \"BatchNorm\"\n  bottom: \"inception_b4_1x7_3\"\n  top: \"inception_b4_1x7_3\"\n  batch_norm_param {\n    use_global_stats: false\n  }\n}\nlayer {\n  name: \"inception_b4_1x7_3_scale\"\n  type: \"Scale\"\n  bottom: \"inception_b4_1x7_3\"\n  top: \"inception_b4_1x7_3\"\n  scale_param {\n    bias_term: true\n  }\n}\nlayer {\n  name: \"inception_b4_1x7_3_relu\"\n  type: \"ReLU\"\n  bottom: \"inception_b4_1x7_3\"\n  top: \"inception_b4_1x7_3\"\n}\nlayer {\n  name: \"inception_b4_7x1_3\"\n  type: \"Convolution\"\n  bottom: \"inception_b4_1x7_3\"\n  top: \"inception_b4_7x1_3\"\n  param {\n    lr_mult: 1\n    decay_mult: 1\n  }\n  param {\n    lr_mult: 2\n    decay_mult: 0\n  }\n  convolution_param {\n    num_output: 256\n    stride: 1\n    weight_filler {\n      type: \"xavier\"\n      std: 0.01\n    }\n    bias_filler {\n      type: \"constant\"\n      value: 0.2\n    }\n    pad_h: 3\n    pad_w: 0\n    kernel_h: 7\n    kernel_w: 1\n  }\n}\nlayer {\n  name: \"inception_b4_7x1_3_bn\"\n  type: \"BatchNorm\"\n  bottom: \"inception_b4_7x1_3\"\n  top: \"inception_b4_7x1_3\"\n  batch_norm_param {\n    use_global_stats: false\n  }\n}\nlayer {\n  name: \"inception_b4_7x1_3_scale\"\n  type: \"Scale\"\n  bottom: \"inception_b4_7x1_3\"\n  top: \"inception_b4_7x1_3\"\n  scale_param {\n    bias_term: true\n  }\n}\nlayer {\n  name: \"inception_b4_7x1_3_relu\"\n  type: \"ReLU\"\n  bottom: \"inception_b4_7x1_3\"\n  top: \"inception_b4_7x1_3\"\n}\nlayer {\n  name: \"inception_b4_concat\"\n  type: \"Concat\"\n  bottom: \"inception_b4_1x1\"\n  bottom: \"inception_b4_1x1_2\"\n  bottom: \"inception_b4_7x1\"\n  bottom: \"inception_b4_7x1_3\"\n  top: \"inception_b4_concat\"\n}\nlayer {\n  name: \"inception_b5_pool_ave\"\n  type: \"Pooling\"\n  bottom: \"inception_b4_concat\"\n  top: \"inception_b5_pool_ave\"\n  pooling_param {\n    pool: AVE\n    kernel_size: 3\n    stride: 1\n    pad: 1\n  }\n}\nlayer {\n  name: \"inception_b5_1x1\"\n  type: \"Convolution\"\n  bottom: \"inception_b5_pool_ave\"\n  top: \"inception_b5_1x1\"\n  param {\n    lr_mult: 1\n    decay_mult: 1\n  }\n  param {\n    lr_mult: 2\n    decay_mult: 0\n  }\n  convolution_param {\n    num_output: 128\n    pad: 0\n    kernel_size: 1\n    stride: 1\n    weight_filler {\n      type: \"xavier\"\n      std: 0.01\n    }\n    bias_filler {\n      type: \"constant\"\n      value: 0.2\n    }\n  }\n}\nlayer {\n  name: \"inception_b5_1x1_bn\"\n  type: \"BatchNorm\"\n  bottom: \"inception_b5_1x1\"\n  top: \"inception_b5_1x1\"\n  batch_norm_param {\n    use_global_stats: false\n  }\n}\nlayer {\n  name: \"inception_b5_1x1_scale\"\n  type: \"Scale\"\n  bottom: \"inception_b5_1x1\"\n  top: \"inception_b5_1x1\"\n  scale_param {\n    bias_term: true\n  }\n}\nlayer {\n  name: \"inception_b5_1x1_relu\"\n  type: \"ReLU\"\n  bottom: \"inception_b5_1x1\"\n  top: \"inception_b5_1x1\"\n}\nlayer {\n  name: \"inception_b5_1x1_2\"\n  type: \"Convolution\"\n  bottom: \"inception_b4_concat\"\n  top: \"inception_b5_1x1_2\"\n  param {\n    lr_mult: 1\n    decay_mult: 1\n  }\n  param {\n    lr_mult: 2\n    decay_mult: 0\n  }\n  convolution_param {\n    num_output: 384\n    pad: 0\n    kernel_size: 1\n    stride: 1\n    weight_filler {\n      type: \"xavier\"\n      std: 0.01\n    }\n    bias_filler {\n      type: \"constant\"\n      value: 0.2\n    }\n  }\n}\nlayer {\n  name: \"inception_b5_1x1_2_bn\"\n  type: \"BatchNorm\"\n  bottom: \"inception_b5_1x1_2\"\n  top: \"inception_b5_1x1_2\"\n  batch_norm_param {\n    use_global_stats: false\n  }\n}\nlayer {\n  name: \"inception_b5_1x1_2_scale\"\n  type: \"Scale\"\n  bottom: \"inception_b5_1x1_2\"\n  top: \"inception_b5_1x1_2\"\n  scale_param {\n    bias_term: true\n  }\n}\nlayer {\n  name: \"inception_b5_1x1_2_relu\"\n  type: \"ReLU\"\n  bottom: \"inception_b5_1x1_2\"\n  top: \"inception_b5_1x1_2\"\n}\nlayer {\n  name: \"inception_b5_1x7_reduce\"\n  type: \"Convolution\"\n  bottom: \"inception_b4_concat\"\n  top: \"inception_b5_1x7_reduce\"\n  param {\n    lr_mult: 1\n    decay_mult: 1\n  }\n  param {\n    lr_mult: 2\n    decay_mult: 0\n  }\n  convolution_param {\n    num_output: 192\n    pad: 0\n    kernel_size: 1\n    stride: 1\n    weight_filler {\n      type: \"xavier\"\n      std: 0.01\n    }\n    bias_filler {\n      type: \"constant\"\n      value: 0.2\n    }\n  }\n}\nlayer {\n  name: \"inception_b5_1x7_reduce_bn\"\n  type: \"BatchNorm\"\n  bottom: \"inception_b5_1x7_reduce\"\n  top: \"inception_b5_1x7_reduce\"\n  batch_norm_param {\n    use_global_stats: false\n  }\n}\nlayer {\n  name: \"inception_b5_1x7_reduce_scale\"\n  type: \"Scale\"\n  bottom: \"inception_b5_1x7_reduce\"\n  top: \"inception_b5_1x7_reduce\"\n  scale_param {\n    bias_term: true\n  }\n}\nlayer {\n  name: \"inception_b5_1x7_reduce_relu\"\n  type: \"ReLU\"\n  bottom: \"inception_b5_1x7_reduce\"\n  top: \"inception_b5_1x7_reduce\"\n}\nlayer {\n  name: \"inception_b5_1x7\"\n  type: \"Convolution\"\n  bottom: \"inception_b5_1x7_reduce\"\n  top: \"inception_b5_1x7\"\n  param {\n    lr_mult: 1\n    decay_mult: 1\n  }\n  param {\n    lr_mult: 2\n    decay_mult: 0\n  }\n  convolution_param {\n    num_output: 224\n    stride: 1\n    weight_filler {\n      type: \"xavier\"\n      std: 0.01\n    }\n    bias_filler {\n      type: \"constant\"\n      value: 0.2\n    }\n    pad_h: 0\n    pad_w: 3\n    kernel_h: 1\n    kernel_w: 7\n  }\n}\nlayer {\n  name: \"inception_b5_1x7_bn\"\n  type: \"BatchNorm\"\n  bottom: \"inception_b5_1x7\"\n  top: \"inception_b5_1x7\"\n  batch_norm_param {\n    use_global_stats: false\n  }\n}\nlayer {\n  name: \"inception_b5_1x7_scale\"\n  type: \"Scale\"\n  bottom: \"inception_b5_1x7\"\n  top: \"inception_b5_1x7\"\n  scale_param {\n    bias_term: true\n  }\n}\nlayer {\n  name: \"inception_b5_1x7_relu\"\n  type: \"ReLU\"\n  bottom: \"inception_b5_1x7\"\n  top: \"inception_b5_1x7\"\n}\nlayer {\n  name: \"inception_b5_7x1\"\n  type: \"Convolution\"\n  bottom: \"inception_b5_1x7\"\n  top: \"inception_b5_7x1\"\n  param {\n    lr_mult: 1\n    decay_mult: 1\n  }\n  param {\n    lr_mult: 2\n    decay_mult: 0\n  }\n  convolution_param {\n    num_output: 256\n    stride: 1\n    weight_filler {\n      type: \"xavier\"\n      std: 0.01\n    }\n    bias_filler {\n      type: \"constant\"\n      value: 0.2\n    }\n    pad_h: 3\n    pad_w: 0\n    kernel_h: 7\n    kernel_w: 1\n  }\n}\nlayer {\n  name: \"inception_b5_7x1_bn\"\n  type: \"BatchNorm\"\n  bottom: \"inception_b5_7x1\"\n  top: \"inception_b5_7x1\"\n  batch_norm_param {\n    use_global_stats: false\n  }\n}\nlayer {\n  name: \"inception_b5_7x1_scale\"\n  type: \"Scale\"\n  bottom: \"inception_b5_7x1\"\n  top: \"inception_b5_7x1\"\n  scale_param {\n    bias_term: true\n  }\n}\nlayer {\n  name: \"inception_b5_7x1_relu\"\n  type: \"ReLU\"\n  bottom: \"inception_b5_7x1\"\n  top: \"inception_b5_7x1\"\n}\nlayer {\n  name: \"inception_b5_1x7_2_reduce\"\n  type: \"Convolution\"\n  bottom: \"inception_b4_concat\"\n  top: \"inception_b5_1x7_2_reduce\"\n  param {\n    lr_mult: 1\n    decay_mult: 1\n  }\n  param {\n    lr_mult: 2\n    decay_mult: 0\n  }\n  convolution_param {\n    num_output: 192\n    pad: 0\n    kernel_size: 1\n    stride: 1\n    weight_filler {\n      type: \"xavier\"\n      std: 0.01\n    }\n    bias_filler {\n      type: \"constant\"\n      value: 0.2\n    }\n  }\n}\nlayer {\n  name: \"inception_b5_1x7_2_reduce_bn\"\n  type: \"BatchNorm\"\n  bottom: \"inception_b5_1x7_2_reduce\"\n  top: \"inception_b5_1x7_2_reduce\"\n  batch_norm_param {\n    use_global_stats: false\n  }\n}\nlayer {\n  name: \"inception_b5_1x7_2_reduce_scale\"\n  type: \"Scale\"\n  bottom: \"inception_b5_1x7_2_reduce\"\n  top: \"inception_b5_1x7_2_reduce\"\n  scale_param {\n    bias_term: true\n  }\n}\nlayer {\n  name: \"inception_b5_1x7_2_reduce_relu\"\n  type: \"ReLU\"\n  bottom: \"inception_b5_1x7_2_reduce\"\n  top: \"inception_b5_1x7_2_reduce\"\n}\nlayer {\n  name: \"inception_b5_1x7_2\"\n  type: \"Convolution\"\n  bottom: \"inception_b5_1x7_2_reduce\"\n  top: \"inception_b5_1x7_2\"\n  param {\n    lr_mult: 1\n    decay_mult: 1\n  }\n  param {\n    lr_mult: 2\n    decay_mult: 0\n  }\n  convolution_param {\n    num_output: 192\n    stride: 1\n    weight_filler {\n      type: \"xavier\"\n      std: 0.01\n    }\n    bias_filler {\n      type: \"constant\"\n      value: 0.2\n    }\n    pad_h: 0\n    pad_w: 3\n    kernel_h: 1\n    kernel_w: 7\n  }\n}\nlayer {\n  name: \"inception_b5_1x7_2_bn\"\n  type: \"BatchNorm\"\n  bottom: \"inception_b5_1x7_2\"\n  top: \"inception_b5_1x7_2\"\n  batch_norm_param {\n    use_global_stats: false\n  }\n}\nlayer {\n  name: \"inception_b5_1x7_2_scale\"\n  type: \"Scale\"\n  bottom: \"inception_b5_1x7_2\"\n  top: \"inception_b5_1x7_2\"\n  scale_param {\n    bias_term: true\n  }\n}\nlayer {\n  name: \"inception_b5_1x7_2_relu\"\n  type: \"ReLU\"\n  bottom: \"inception_b5_1x7_2\"\n  top: \"inception_b5_1x7_2\"\n}\nlayer {\n  name: \"inception_b5_7x1_2\"\n  type: \"Convolution\"\n  bottom: \"inception_b5_1x7_2\"\n  top: \"inception_b5_7x1_2\"\n  param {\n    lr_mult: 1\n    decay_mult: 1\n  }\n  param {\n    lr_mult: 2\n    decay_mult: 0\n  }\n  convolution_param {\n    num_output: 224\n    stride: 1\n    weight_filler {\n      type: \"xavier\"\n      std: 0.01\n    }\n    bias_filler {\n      type: \"constant\"\n      value: 0.2\n    }\n    pad_h: 3\n    pad_w: 0\n    kernel_h: 7\n    kernel_w: 1\n  }\n}\nlayer {\n  name: \"inception_b5_7x1_2_bn\"\n  type: \"BatchNorm\"\n  bottom: \"inception_b5_7x1_2\"\n  top: \"inception_b5_7x1_2\"\n  batch_norm_param {\n    use_global_stats: false\n  }\n}\nlayer {\n  name: \"inception_b5_7x1_2_scale\"\n  type: \"Scale\"\n  bottom: \"inception_b5_7x1_2\"\n  top: \"inception_b5_7x1_2\"\n  scale_param {\n    bias_term: true\n  }\n}\nlayer {\n  name: \"inception_b5_7x1_2_relu\"\n  type: \"ReLU\"\n  bottom: \"inception_b5_7x1_2\"\n  top: \"inception_b5_7x1_2\"\n}\nlayer {\n  name: \"inception_b5_1x7_3\"\n  type: \"Convolution\"\n  bottom: \"inception_b5_7x1_2\"\n  top: \"inception_b5_1x7_3\"\n  param {\n    lr_mult: 1\n    decay_mult: 1\n  }\n  param {\n    lr_mult: 2\n    decay_mult: 0\n  }\n  convolution_param {\n    num_output: 224\n    stride: 1\n    weight_filler {\n      type: \"xavier\"\n      std: 0.01\n    }\n    bias_filler {\n      type: \"constant\"\n      value: 0.2\n    }\n    pad_h: 0\n    pad_w: 3\n    kernel_h: 1\n    kernel_w: 7\n  }\n}\nlayer {\n  name: \"inception_b5_1x7_3_bn\"\n  type: \"BatchNorm\"\n  bottom: \"inception_b5_1x7_3\"\n  top: \"inception_b5_1x7_3\"\n  batch_norm_param {\n    use_global_stats: false\n  }\n}\nlayer {\n  name: \"inception_b5_1x7_3_scale\"\n  type: \"Scale\"\n  bottom: \"inception_b5_1x7_3\"\n  top: \"inception_b5_1x7_3\"\n  scale_param {\n    bias_term: true\n  }\n}\nlayer {\n  name: \"inception_b5_1x7_3_relu\"\n  type: \"ReLU\"\n  bottom: \"inception_b5_1x7_3\"\n  top: \"inception_b5_1x7_3\"\n}\nlayer {\n  name: \"inception_b5_7x1_3\"\n  type: \"Convolution\"\n  bottom: \"inception_b5_1x7_3\"\n  top: \"inception_b5_7x1_3\"\n  param {\n    lr_mult: 1\n    decay_mult: 1\n  }\n  param {\n    lr_mult: 2\n    decay_mult: 0\n  }\n  convolution_param {\n    num_output: 256\n    stride: 1\n    weight_filler {\n      type: \"xavier\"\n      std: 0.01\n    }\n    bias_filler {\n      type: \"constant\"\n      value: 0.2\n    }\n    pad_h: 3\n    pad_w: 0\n    kernel_h: 7\n    kernel_w: 1\n  }\n}\nlayer {\n  name: \"inception_b5_7x1_3_bn\"\n  type: \"BatchNorm\"\n  bottom: \"inception_b5_7x1_3\"\n  top: \"inception_b5_7x1_3\"\n  batch_norm_param {\n    use_global_stats: false\n  }\n}\nlayer {\n  name: \"inception_b5_7x1_3_scale\"\n  type: \"Scale\"\n  bottom: \"inception_b5_7x1_3\"\n  top: \"inception_b5_7x1_3\"\n  scale_param {\n    bias_term: true\n  }\n}\nlayer {\n  name: \"inception_b5_7x1_3_relu\"\n  type: \"ReLU\"\n  bottom: \"inception_b5_7x1_3\"\n  top: \"inception_b5_7x1_3\"\n}\nlayer {\n  name: \"inception_b5_concat\"\n  type: \"Concat\"\n  bottom: \"inception_b5_1x1\"\n  bottom: \"inception_b5_1x1_2\"\n  bottom: \"inception_b5_7x1\"\n  bottom: \"inception_b5_7x1_3\"\n  top: \"inception_b5_concat\"\n}\nlayer {\n  name: \"inception_b6_pool_ave\"\n  type: \"Pooling\"\n  bottom: \"inception_b5_concat\"\n  top: \"inception_b6_pool_ave\"\n  pooling_param {\n    pool: AVE\n    kernel_size: 3\n    stride: 1\n    pad: 1\n  }\n}\nlayer {\n  name: \"inception_b6_1x1\"\n  type: \"Convolution\"\n  bottom: \"inception_b6_pool_ave\"\n  top: \"inception_b6_1x1\"\n  param {\n    lr_mult: 1\n    decay_mult: 1\n  }\n  param {\n    lr_mult: 2\n    decay_mult: 0\n  }\n  convolution_param {\n    num_output: 128\n    pad: 0\n    kernel_size: 1\n    stride: 1\n    weight_filler {\n      type: \"xavier\"\n      std: 0.01\n    }\n    bias_filler {\n      type: \"constant\"\n      value: 0.2\n    }\n  }\n}\nlayer {\n  name: \"inception_b6_1x1_bn\"\n  type: \"BatchNorm\"\n  bottom: \"inception_b6_1x1\"\n  top: \"inception_b6_1x1\"\n  batch_norm_param {\n    use_global_stats: false\n  }\n}\nlayer {\n  name: \"inception_b6_1x1_scale\"\n  type: \"Scale\"\n  bottom: \"inception_b6_1x1\"\n  top: \"inception_b6_1x1\"\n  scale_param {\n    bias_term: true\n  }\n}\nlayer {\n  name: \"inception_b6_1x1_relu\"\n  type: \"ReLU\"\n  bottom: \"inception_b6_1x1\"\n  top: \"inception_b6_1x1\"\n}\nlayer {\n  name: \"inception_b6_1x1_2\"\n  type: \"Convolution\"\n  bottom: \"inception_b5_concat\"\n  top: \"inception_b6_1x1_2\"\n  param {\n    lr_mult: 1\n    decay_mult: 1\n  }\n  param {\n    lr_mult: 2\n    decay_mult: 0\n  }\n  convolution_param {\n    num_output: 384\n    pad: 0\n    kernel_size: 1\n    stride: 1\n    weight_filler {\n      type: \"xavier\"\n      std: 0.01\n    }\n    bias_filler {\n      type: \"constant\"\n      value: 0.2\n    }\n  }\n}\nlayer {\n  name: \"inception_b6_1x1_2_bn\"\n  type: \"BatchNorm\"\n  bottom: \"inception_b6_1x1_2\"\n  top: \"inception_b6_1x1_2\"\n  batch_norm_param {\n    use_global_stats: false\n  }\n}\nlayer {\n  name: \"inception_b6_1x1_2_scale\"\n  type: \"Scale\"\n  bottom: \"inception_b6_1x1_2\"\n  top: \"inception_b6_1x1_2\"\n  scale_param {\n    bias_term: true\n  }\n}\nlayer {\n  name: \"inception_b6_1x1_2_relu\"\n  type: \"ReLU\"\n  bottom: \"inception_b6_1x1_2\"\n  top: \"inception_b6_1x1_2\"\n}\nlayer {\n  name: \"inception_b6_1x7_reduce\"\n  type: \"Convolution\"\n  bottom: \"inception_b5_concat\"\n  top: \"inception_b6_1x7_reduce\"\n  param {\n    lr_mult: 1\n    decay_mult: 1\n  }\n  param {\n    lr_mult: 2\n    decay_mult: 0\n  }\n  convolution_param {\n    num_output: 192\n    pad: 0\n    kernel_size: 1\n    stride: 1\n    weight_filler {\n      type: \"xavier\"\n      std: 0.01\n    }\n    bias_filler {\n      type: \"constant\"\n      value: 0.2\n    }\n  }\n}\nlayer {\n  name: \"inception_b6_1x7_reduce_bn\"\n  type: \"BatchNorm\"\n  bottom: \"inception_b6_1x7_reduce\"\n  top: \"inception_b6_1x7_reduce\"\n  batch_norm_param {\n    use_global_stats: false\n  }\n}\nlayer {\n  name: \"inception_b6_1x7_reduce_scale\"\n  type: \"Scale\"\n  bottom: \"inception_b6_1x7_reduce\"\n  top: \"inception_b6_1x7_reduce\"\n  scale_param {\n    bias_term: true\n  }\n}\nlayer {\n  name: \"inception_b6_1x7_reduce_relu\"\n  type: \"ReLU\"\n  bottom: \"inception_b6_1x7_reduce\"\n  top: \"inception_b6_1x7_reduce\"\n}\nlayer {\n  name: \"inception_b6_1x7\"\n  type: \"Convolution\"\n  bottom: \"inception_b6_1x7_reduce\"\n  top: \"inception_b6_1x7\"\n  param {\n    lr_mult: 1\n    decay_mult: 1\n  }\n  param {\n    lr_mult: 2\n    decay_mult: 0\n  }\n  convolution_param {\n    num_output: 224\n    stride: 1\n    weight_filler {\n      type: \"xavier\"\n      std: 0.01\n    }\n    bias_filler {\n      type: \"constant\"\n      value: 0.2\n    }\n    pad_h: 0\n    pad_w: 3\n    kernel_h: 1\n    kernel_w: 7\n  }\n}\nlayer {\n  name: \"inception_b6_1x7_bn\"\n  type: \"BatchNorm\"\n  bottom: \"inception_b6_1x7\"\n  top: \"inception_b6_1x7\"\n  batch_norm_param {\n    use_global_stats: false\n  }\n}\nlayer {\n  name: \"inception_b6_1x7_scale\"\n  type: \"Scale\"\n  bottom: \"inception_b6_1x7\"\n  top: \"inception_b6_1x7\"\n  scale_param {\n    bias_term: true\n  }\n}\nlayer {\n  name: \"inception_b6_1x7_relu\"\n  type: \"ReLU\"\n  bottom: \"inception_b6_1x7\"\n  top: \"inception_b6_1x7\"\n}\nlayer {\n  name: \"inception_b6_7x1\"\n  type: \"Convolution\"\n  bottom: \"inception_b6_1x7\"\n  top: \"inception_b6_7x1\"\n  param {\n    lr_mult: 1\n    decay_mult: 1\n  }\n  param {\n    lr_mult: 2\n    decay_mult: 0\n  }\n  convolution_param {\n    num_output: 256\n    stride: 1\n    weight_filler {\n      type: \"xavier\"\n      std: 0.01\n    }\n    bias_filler {\n      type: \"constant\"\n      value: 0.2\n    }\n    pad_h: 3\n    pad_w: 0\n    kernel_h: 7\n    kernel_w: 1\n  }\n}\nlayer {\n  name: \"inception_b6_7x1_bn\"\n  type: \"BatchNorm\"\n  bottom: \"inception_b6_7x1\"\n  top: \"inception_b6_7x1\"\n  batch_norm_param {\n    use_global_stats: false\n  }\n}\nlayer {\n  name: \"inception_b6_7x1_scale\"\n  type: \"Scale\"\n  bottom: \"inception_b6_7x1\"\n  top: \"inception_b6_7x1\"\n  scale_param {\n    bias_term: true\n  }\n}\nlayer {\n  name: \"inception_b6_7x1_relu\"\n  type: \"ReLU\"\n  bottom: \"inception_b6_7x1\"\n  top: \"inception_b6_7x1\"\n}\nlayer {\n  name: \"inception_b6_1x7_2_reduce\"\n  type: \"Convolution\"\n  bottom: \"inception_b5_concat\"\n  top: \"inception_b6_1x7_2_reduce\"\n  param {\n    lr_mult: 1\n    decay_mult: 1\n  }\n  param {\n    lr_mult: 2\n    decay_mult: 0\n  }\n  convolution_param {\n    num_output: 192\n    pad: 0\n    kernel_size: 1\n    stride: 1\n    weight_filler {\n      type: \"xavier\"\n      std: 0.01\n    }\n    bias_filler {\n      type: \"constant\"\n      value: 0.2\n    }\n  }\n}\nlayer {\n  name: \"inception_b6_1x7_2_reduce_bn\"\n  type: \"BatchNorm\"\n  bottom: \"inception_b6_1x7_2_reduce\"\n  top: \"inception_b6_1x7_2_reduce\"\n  batch_norm_param {\n    use_global_stats: false\n  }\n}\nlayer {\n  name: \"inception_b6_1x7_2_reduce_scale\"\n  type: \"Scale\"\n  bottom: \"inception_b6_1x7_2_reduce\"\n  top: \"inception_b6_1x7_2_reduce\"\n  scale_param {\n    bias_term: true\n  }\n}\nlayer {\n  name: \"inception_b6_1x7_2_reduce_relu\"\n  type: \"ReLU\"\n  bottom: \"inception_b6_1x7_2_reduce\"\n  top: \"inception_b6_1x7_2_reduce\"\n}\nlayer {\n  name: \"inception_b6_1x7_2\"\n  type: \"Convolution\"\n  bottom: \"inception_b6_1x7_2_reduce\"\n  top: \"inception_b6_1x7_2\"\n  param {\n    lr_mult: 1\n    decay_mult: 1\n  }\n  param {\n    lr_mult: 2\n    decay_mult: 0\n  }\n  convolution_param {\n    num_output: 192\n    stride: 1\n    weight_filler {\n      type: \"xavier\"\n      std: 0.01\n    }\n    bias_filler {\n      type: \"constant\"\n      value: 0.2\n    }\n    pad_h: 0\n    pad_w: 3\n    kernel_h: 1\n    kernel_w: 7\n  }\n}\nlayer {\n  name: \"inception_b6_1x7_2_bn\"\n  type: \"BatchNorm\"\n  bottom: \"inception_b6_1x7_2\"\n  top: \"inception_b6_1x7_2\"\n  batch_norm_param {\n    use_global_stats: false\n  }\n}\nlayer {\n  name: \"inception_b6_1x7_2_scale\"\n  type: \"Scale\"\n  bottom: \"inception_b6_1x7_2\"\n  top: \"inception_b6_1x7_2\"\n  scale_param {\n    bias_term: true\n  }\n}\nlayer {\n  name: \"inception_b6_1x7_2_relu\"\n  type: \"ReLU\"\n  bottom: \"inception_b6_1x7_2\"\n  top: \"inception_b6_1x7_2\"\n}\nlayer {\n  name: \"inception_b6_7x1_2\"\n  type: \"Convolution\"\n  bottom: \"inception_b6_1x7_2\"\n  top: \"inception_b6_7x1_2\"\n  param {\n    lr_mult: 1\n    decay_mult: 1\n  }\n  param {\n    lr_mult: 2\n    decay_mult: 0\n  }\n  convolution_param {\n    num_output: 224\n    stride: 1\n    weight_filler {\n      type: \"xavier\"\n      std: 0.01\n    }\n    bias_filler {\n      type: \"constant\"\n      value: 0.2\n    }\n    pad_h: 3\n    pad_w: 0\n    kernel_h: 7\n    kernel_w: 1\n  }\n}\nlayer {\n  name: \"inception_b6_7x1_2_bn\"\n  type: \"BatchNorm\"\n  bottom: \"inception_b6_7x1_2\"\n  top: \"inception_b6_7x1_2\"\n  batch_norm_param {\n    use_global_stats: false\n  }\n}\nlayer {\n  name: \"inception_b6_7x1_2_scale\"\n  type: \"Scale\"\n  bottom: \"inception_b6_7x1_2\"\n  top: \"inception_b6_7x1_2\"\n  scale_param {\n    bias_term: true\n  }\n}\nlayer {\n  name: \"inception_b6_7x1_2_relu\"\n  type: \"ReLU\"\n  bottom: \"inception_b6_7x1_2\"\n  top: \"inception_b6_7x1_2\"\n}\nlayer {\n  name: \"inception_b6_1x7_3\"\n  type: \"Convolution\"\n  bottom: \"inception_b6_7x1_2\"\n  top: \"inception_b6_1x7_3\"\n  param {\n    lr_mult: 1\n    decay_mult: 1\n  }\n  param {\n    lr_mult: 2\n    decay_mult: 0\n  }\n  convolution_param {\n    num_output: 224\n    stride: 1\n    weight_filler {\n      type: \"xavier\"\n      std: 0.01\n    }\n    bias_filler {\n      type: \"constant\"\n      value: 0.2\n    }\n    pad_h: 0\n    pad_w: 3\n    kernel_h: 1\n    kernel_w: 7\n  }\n}\nlayer {\n  name: \"inception_b6_1x7_3_bn\"\n  type: \"BatchNorm\"\n  bottom: \"inception_b6_1x7_3\"\n  top: \"inception_b6_1x7_3\"\n  batch_norm_param {\n    use_global_stats: false\n  }\n}\nlayer {\n  name: \"inception_b6_1x7_3_scale\"\n  type: \"Scale\"\n  bottom: \"inception_b6_1x7_3\"\n  top: \"inception_b6_1x7_3\"\n  scale_param {\n    bias_term: true\n  }\n}\nlayer {\n  name: \"inception_b6_1x7_3_relu\"\n  type: \"ReLU\"\n  bottom: \"inception_b6_1x7_3\"\n  top: \"inception_b6_1x7_3\"\n}\nlayer {\n  name: \"inception_b6_7x1_3\"\n  type: \"Convolution\"\n  bottom: \"inception_b6_1x7_3\"\n  top: \"inception_b6_7x1_3\"\n  param {\n    lr_mult: 1\n    decay_mult: 1\n  }\n  param {\n    lr_mult: 2\n    decay_mult: 0\n  }\n  convolution_param {\n    num_output: 256\n    stride: 1\n    weight_filler {\n      type: \"xavier\"\n      std: 0.01\n    }\n    bias_filler {\n      type: \"constant\"\n      value: 0.2\n    }\n    pad_h: 3\n    pad_w: 0\n    kernel_h: 7\n    kernel_w: 1\n  }\n}\nlayer {\n  name: \"inception_b6_7x1_3_bn\"\n  type: \"BatchNorm\"\n  bottom: \"inception_b6_7x1_3\"\n  top: \"inception_b6_7x1_3\"\n  batch_norm_param {\n    use_global_stats: false\n  }\n}\nlayer {\n  name: \"inception_b6_7x1_3_scale\"\n  type: \"Scale\"\n  bottom: \"inception_b6_7x1_3\"\n  top: \"inception_b6_7x1_3\"\n  scale_param {\n    bias_term: true\n  }\n}\nlayer {\n  name: \"inception_b6_7x1_3_relu\"\n  type: \"ReLU\"\n  bottom: \"inception_b6_7x1_3\"\n  top: \"inception_b6_7x1_3\"\n}\nlayer {\n  name: \"inception_b6_concat\"\n  type: \"Concat\"\n  bottom: \"inception_b6_1x1\"\n  bottom: \"inception_b6_1x1_2\"\n  bottom: \"inception_b6_7x1\"\n  bottom: \"inception_b6_7x1_3\"\n  top: \"inception_b6_concat\"\n}\nlayer {\n  name: \"inception_b7_pool_ave\"\n  type: \"Pooling\"\n  bottom: \"inception_b6_concat\"\n  top: \"inception_b7_pool_ave\"\n  pooling_param {\n    pool: AVE\n    kernel_size: 3\n    stride: 1\n    pad: 1\n  }\n}\nlayer {\n  name: \"inception_b7_1x1\"\n  type: \"Convolution\"\n  bottom: \"inception_b7_pool_ave\"\n  top: \"inception_b7_1x1\"\n  param {\n    lr_mult: 1\n    decay_mult: 1\n  }\n  param {\n    lr_mult: 2\n    decay_mult: 0\n  }\n  convolution_param {\n    num_output: 128\n    pad: 0\n    kernel_size: 1\n    stride: 1\n    weight_filler {\n      type: \"xavier\"\n      std: 0.01\n    }\n    bias_filler {\n      type: \"constant\"\n      value: 0.2\n    }\n  }\n}\nlayer {\n  name: \"inception_b7_1x1_bn\"\n  type: \"BatchNorm\"\n  bottom: \"inception_b7_1x1\"\n  top: \"inception_b7_1x1\"\n  batch_norm_param {\n    use_global_stats: false\n  }\n}\nlayer {\n  name: \"inception_b7_1x1_scale\"\n  type: \"Scale\"\n  bottom: \"inception_b7_1x1\"\n  top: \"inception_b7_1x1\"\n  scale_param {\n    bias_term: true\n  }\n}\nlayer {\n  name: \"inception_b7_1x1_relu\"\n  type: \"ReLU\"\n  bottom: \"inception_b7_1x1\"\n  top: \"inception_b7_1x1\"\n}\nlayer {\n  name: \"inception_b7_1x1_2\"\n  type: \"Convolution\"\n  bottom: \"inception_b6_concat\"\n  top: \"inception_b7_1x1_2\"\n  param {\n    lr_mult: 1\n    decay_mult: 1\n  }\n  param {\n    lr_mult: 2\n    decay_mult: 0\n  }\n  convolution_param {\n    num_output: 384\n    pad: 0\n    kernel_size: 1\n    stride: 1\n    weight_filler {\n      type: \"xavier\"\n      std: 0.01\n    }\n    bias_filler {\n      type: \"constant\"\n      value: 0.2\n    }\n  }\n}\nlayer {\n  name: \"inception_b7_1x1_2_bn\"\n  type: \"BatchNorm\"\n  bottom: \"inception_b7_1x1_2\"\n  top: \"inception_b7_1x1_2\"\n  batch_norm_param {\n    use_global_stats: false\n  }\n}\nlayer {\n  name: \"inception_b7_1x1_2_scale\"\n  type: \"Scale\"\n  bottom: \"inception_b7_1x1_2\"\n  top: \"inception_b7_1x1_2\"\n  scale_param {\n    bias_term: true\n  }\n}\nlayer {\n  name: \"inception_b7_1x1_2_relu\"\n  type: \"ReLU\"\n  bottom: \"inception_b7_1x1_2\"\n  top: \"inception_b7_1x1_2\"\n}\nlayer {\n  name: \"inception_b7_1x7_reduce\"\n  type: \"Convolution\"\n  bottom: \"inception_b6_concat\"\n  top: \"inception_b7_1x7_reduce\"\n  param {\n    lr_mult: 1\n    decay_mult: 1\n  }\n  param {\n    lr_mult: 2\n    decay_mult: 0\n  }\n  convolution_param {\n    num_output: 192\n    pad: 0\n    kernel_size: 1\n    stride: 1\n    weight_filler {\n      type: \"xavier\"\n      std: 0.01\n    }\n    bias_filler {\n      type: \"constant\"\n      value: 0.2\n    }\n  }\n}\nlayer {\n  name: \"inception_b7_1x7_reduce_bn\"\n  type: \"BatchNorm\"\n  bottom: \"inception_b7_1x7_reduce\"\n  top: \"inception_b7_1x7_reduce\"\n  batch_norm_param {\n    use_global_stats: false\n  }\n}\nlayer {\n  name: \"inception_b7_1x7_reduce_scale\"\n  type: \"Scale\"\n  bottom: \"inception_b7_1x7_reduce\"\n  top: \"inception_b7_1x7_reduce\"\n  scale_param {\n    bias_term: true\n  }\n}\nlayer {\n  name: \"inception_b7_1x7_reduce_relu\"\n  type: \"ReLU\"\n  bottom: \"inception_b7_1x7_reduce\"\n  top: \"inception_b7_1x7_reduce\"\n}\nlayer {\n  name: \"inception_b7_1x7\"\n  type: \"Convolution\"\n  bottom: \"inception_b7_1x7_reduce\"\n  top: \"inception_b7_1x7\"\n  param {\n    lr_mult: 1\n    decay_mult: 1\n  }\n  param {\n    lr_mult: 2\n    decay_mult: 0\n  }\n  convolution_param {\n    num_output: 224\n    stride: 1\n    weight_filler {\n      type: \"xavier\"\n      std: 0.01\n    }\n    bias_filler {\n      type: \"constant\"\n      value: 0.2\n    }\n    pad_h: 0\n    pad_w: 3\n    kernel_h: 1\n    kernel_w: 7\n  }\n}\nlayer {\n  name: \"inception_b7_1x7_bn\"\n  type: \"BatchNorm\"\n  bottom: \"inception_b7_1x7\"\n  top: \"inception_b7_1x7\"\n  batch_norm_param {\n    use_global_stats: false\n  }\n}\nlayer {\n  name: \"inception_b7_1x7_scale\"\n  type: \"Scale\"\n  bottom: \"inception_b7_1x7\"\n  top: \"inception_b7_1x7\"\n  scale_param {\n    bias_term: true\n  }\n}\nlayer {\n  name: \"inception_b7_1x7_relu\"\n  type: \"ReLU\"\n  bottom: \"inception_b7_1x7\"\n  top: \"inception_b7_1x7\"\n}\nlayer {\n  name: \"inception_b7_7x1\"\n  type: \"Convolution\"\n  bottom: \"inception_b7_1x7\"\n  top: \"inception_b7_7x1\"\n  param {\n    lr_mult: 1\n    decay_mult: 1\n  }\n  param {\n    lr_mult: 2\n    decay_mult: 0\n  }\n  convolution_param {\n    num_output: 256\n    stride: 1\n    weight_filler {\n      type: \"xavier\"\n      std: 0.01\n    }\n    bias_filler {\n      type: \"constant\"\n      value: 0.2\n    }\n    pad_h: 3\n    pad_w: 0\n    kernel_h: 7\n    kernel_w: 1\n  }\n}\nlayer {\n  name: \"inception_b7_7x1_bn\"\n  type: \"BatchNorm\"\n  bottom: \"inception_b7_7x1\"\n  top: \"inception_b7_7x1\"\n  batch_norm_param {\n    use_global_stats: false\n  }\n}\nlayer {\n  name: \"inception_b7_7x1_scale\"\n  type: \"Scale\"\n  bottom: \"inception_b7_7x1\"\n  top: \"inception_b7_7x1\"\n  scale_param {\n    bias_term: true\n  }\n}\nlayer {\n  name: \"inception_b7_7x1_relu\"\n  type: \"ReLU\"\n  bottom: \"inception_b7_7x1\"\n  top: \"inception_b7_7x1\"\n}\nlayer {\n  name: \"inception_b7_1x7_2_reduce\"\n  type: \"Convolution\"\n  bottom: \"inception_b6_concat\"\n  top: \"inception_b7_1x7_2_reduce\"\n  param {\n    lr_mult: 1\n    decay_mult: 1\n  }\n  param {\n    lr_mult: 2\n    decay_mult: 0\n  }\n  convolution_param {\n    num_output: 192\n    pad: 0\n    kernel_size: 1\n    stride: 1\n    weight_filler {\n      type: \"xavier\"\n      std: 0.01\n    }\n    bias_filler {\n      type: \"constant\"\n      value: 0.2\n    }\n  }\n}\nlayer {\n  name: \"inception_b7_1x7_2_reduce_bn\"\n  type: \"BatchNorm\"\n  bottom: \"inception_b7_1x7_2_reduce\"\n  top: \"inception_b7_1x7_2_reduce\"\n  batch_norm_param {\n    use_global_stats: false\n  }\n}\nlayer {\n  name: \"inception_b7_1x7_2_reduce_scale\"\n  type: \"Scale\"\n  bottom: \"inception_b7_1x7_2_reduce\"\n  top: \"inception_b7_1x7_2_reduce\"\n  scale_param {\n    bias_term: true\n  }\n}\nlayer {\n  name: \"inception_b7_1x7_2_reduce_relu\"\n  type: \"ReLU\"\n  bottom: \"inception_b7_1x7_2_reduce\"\n  top: \"inception_b7_1x7_2_reduce\"\n}\nlayer {\n  name: \"inception_b7_1x7_2\"\n  type: \"Convolution\"\n  bottom: \"inception_b7_1x7_2_reduce\"\n  top: \"inception_b7_1x7_2\"\n  param {\n    lr_mult: 1\n    decay_mult: 1\n  }\n  param {\n    lr_mult: 2\n    decay_mult: 0\n  }\n  convolution_param {\n    num_output: 192\n    stride: 1\n    weight_filler {\n      type: \"xavier\"\n      std: 0.01\n    }\n    bias_filler {\n      type: \"constant\"\n      value: 0.2\n    }\n    pad_h: 0\n    pad_w: 3\n    kernel_h: 1\n    kernel_w: 7\n  }\n}\nlayer {\n  name: \"inception_b7_1x7_2_bn\"\n  type: \"BatchNorm\"\n  bottom: \"inception_b7_1x7_2\"\n  top: \"inception_b7_1x7_2\"\n  batch_norm_param {\n    use_global_stats: false\n  }\n}\nlayer {\n  name: \"inception_b7_1x7_2_scale\"\n  type: \"Scale\"\n  bottom: \"inception_b7_1x7_2\"\n  top: \"inception_b7_1x7_2\"\n  scale_param {\n    bias_term: true\n  }\n}\nlayer {\n  name: \"inception_b7_1x7_2_relu\"\n  type: \"ReLU\"\n  bottom: \"inception_b7_1x7_2\"\n  top: \"inception_b7_1x7_2\"\n}\nlayer {\n  name: \"inception_b7_7x1_2\"\n  type: \"Convolution\"\n  bottom: \"inception_b7_1x7_2\"\n  top: \"inception_b7_7x1_2\"\n  param {\n    lr_mult: 1\n    decay_mult: 1\n  }\n  param {\n    lr_mult: 2\n    decay_mult: 0\n  }\n  convolution_param {\n    num_output: 224\n    stride: 1\n    weight_filler {\n      type: \"xavier\"\n      std: 0.01\n    }\n    bias_filler {\n      type: \"constant\"\n      value: 0.2\n    }\n    pad_h: 3\n    pad_w: 0\n    kernel_h: 7\n    kernel_w: 1\n  }\n}\nlayer {\n  name: \"inception_b7_7x1_2_bn\"\n  type: \"BatchNorm\"\n  bottom: \"inception_b7_7x1_2\"\n  top: \"inception_b7_7x1_2\"\n  batch_norm_param {\n    use_global_stats: false\n  }\n}\nlayer {\n  name: \"inception_b7_7x1_2_scale\"\n  type: \"Scale\"\n  bottom: \"inception_b7_7x1_2\"\n  top: \"inception_b7_7x1_2\"\n  scale_param {\n    bias_term: true\n  }\n}\nlayer {\n  name: \"inception_b7_7x1_2_relu\"\n  type: \"ReLU\"\n  bottom: \"inception_b7_7x1_2\"\n  top: \"inception_b7_7x1_2\"\n}\nlayer {\n  name: \"inception_b7_1x7_3\"\n  type: \"Convolution\"\n  bottom: \"inception_b7_7x1_2\"\n  top: \"inception_b7_1x7_3\"\n  param {\n    lr_mult: 1\n    decay_mult: 1\n  }\n  param {\n    lr_mult: 2\n    decay_mult: 0\n  }\n  convolution_param {\n    num_output: 224\n    stride: 1\n    weight_filler {\n      type: \"xavier\"\n      std: 0.01\n    }\n    bias_filler {\n      type: \"constant\"\n      value: 0.2\n    }\n    pad_h: 0\n    pad_w: 3\n    kernel_h: 1\n    kernel_w: 7\n  }\n}\nlayer {\n  name: \"inception_b7_1x7_3_bn\"\n  type: \"BatchNorm\"\n  bottom: \"inception_b7_1x7_3\"\n  top: \"inception_b7_1x7_3\"\n  batch_norm_param {\n    use_global_stats: false\n  }\n}\nlayer {\n  name: \"inception_b7_1x7_3_scale\"\n  type: \"Scale\"\n  bottom: \"inception_b7_1x7_3\"\n  top: \"inception_b7_1x7_3\"\n  scale_param {\n    bias_term: true\n  }\n}\nlayer {\n  name: \"inception_b7_1x7_3_relu\"\n  type: \"ReLU\"\n  bottom: \"inception_b7_1x7_3\"\n  top: \"inception_b7_1x7_3\"\n}\nlayer {\n  name: \"inception_b7_7x1_3\"\n  type: \"Convolution\"\n  bottom: \"inception_b7_1x7_3\"\n  top: \"inception_b7_7x1_3\"\n  param {\n    lr_mult: 1\n    decay_mult: 1\n  }\n  param {\n    lr_mult: 2\n    decay_mult: 0\n  }\n  convolution_param {\n    num_output: 256\n    stride: 1\n    weight_filler {\n      type: \"xavier\"\n      std: 0.01\n    }\n    bias_filler {\n      type: \"constant\"\n      value: 0.2\n    }\n    pad_h: 3\n    pad_w: 0\n    kernel_h: 7\n    kernel_w: 1\n  }\n}\nlayer {\n  name: \"inception_b7_7x1_3_bn\"\n  type: \"BatchNorm\"\n  bottom: \"inception_b7_7x1_3\"\n  top: \"inception_b7_7x1_3\"\n  batch_norm_param {\n    use_global_stats: false\n  }\n}\nlayer {\n  name: \"inception_b7_7x1_3_scale\"\n  type: \"Scale\"\n  bottom: \"inception_b7_7x1_3\"\n  top: \"inception_b7_7x1_3\"\n  scale_param {\n    bias_term: true\n  }\n}\nlayer {\n  name: \"inception_b7_7x1_3_relu\"\n  type: \"ReLU\"\n  bottom: \"inception_b7_7x1_3\"\n  top: \"inception_b7_7x1_3\"\n}\nlayer {\n  name: \"inception_b7_concat\"\n  type: \"Concat\"\n  bottom: \"inception_b7_1x1\"\n  bottom: \"inception_b7_1x1_2\"\n  bottom: \"inception_b7_7x1\"\n  bottom: \"inception_b7_7x1_3\"\n  top: \"inception_b7_concat\"\n}\nlayer {\n  name: \"reduction_b_pool\"\n  type: \"Pooling\"\n  bottom: \"inception_b7_concat\"\n  top: \"reduction_b_pool\"\n  pooling_param {\n    pool: MAX\n    kernel_size: 3\n    stride: 2\n  }\n}\nlayer {\n  name: \"reduction_b_3x3_reduce\"\n  type: \"Convolution\"\n  bottom: \"inception_b7_concat\"\n  top: \"reduction_b_3x3_reduce\"\n  param {\n    lr_mult: 1\n    decay_mult: 1\n  }\n  param {\n    lr_mult: 2\n    decay_mult: 0\n  }\n  convolution_param {\n    num_output: 192\n    pad: 0\n    kernel_size: 1\n    stride: 1\n    weight_filler {\n      type: \"xavier\"\n      std: 0.01\n    }\n    bias_filler {\n      type: \"constant\"\n      value: 0.2\n    }\n  }\n}\nlayer {\n  name: \"reduction_b_3x3_reduce_bn\"\n  type: \"BatchNorm\"\n  bottom: \"reduction_b_3x3_reduce\"\n  top: \"reduction_b_3x3_reduce\"\n  batch_norm_param {\n    use_global_stats: false\n  }\n}\nlayer {\n  name: \"reduction_b_3x3_reduce_scale\"\n  type: \"Scale\"\n  bottom: \"reduction_b_3x3_reduce\"\n  top: \"reduction_b_3x3_reduce\"\n  scale_param {\n    bias_term: true\n  }\n}\nlayer {\n  name: \"reduction_b_3x3_reduce_relu\"\n  type: \"ReLU\"\n  bottom: \"reduction_b_3x3_reduce\"\n  top: \"reduction_b_3x3_reduce\"\n}\nlayer {\n  name: \"reduction_b_3x3\"\n  type: \"Convolution\"\n  bottom: \"reduction_b_3x3_reduce\"\n  top: \"reduction_b_3x3\"\n  param {\n    lr_mult: 1\n    decay_mult: 1\n  }\n  param {\n    lr_mult: 2\n    decay_mult: 0\n  }\n  convolution_param {\n    num_output: 192\n    pad: 0\n    kernel_size: 3\n    stride: 2\n    weight_filler {\n      type: \"xavier\"\n      std: 0.01\n    }\n    bias_filler {\n      type: \"constant\"\n      value: 0.2\n    }\n  }\n}\nlayer {\n  name: \"reduction_b_3x3_bn\"\n  type: \"BatchNorm\"\n  bottom: \"reduction_b_3x3\"\n  top: \"reduction_b_3x3\"\n  batch_norm_param {\n    use_global_stats: false\n  }\n}\nlayer {\n  name: \"reduction_b_3x3_scale\"\n  type: \"Scale\"\n  bottom: \"reduction_b_3x3\"\n  top: \"reduction_b_3x3\"\n  scale_param {\n    bias_term: true\n  }\n}\nlayer {\n  name: \"reduction_b_3x3_relu\"\n  type: \"ReLU\"\n  bottom: \"reduction_b_3x3\"\n  top: \"reduction_b_3x3\"\n}\nlayer {\n  name: \"reduction_b_1x7_reduce\"\n  type: \"Convolution\"\n  bottom: \"inception_b7_concat\"\n  top: \"reduction_b_1x7_reduce\"\n  param {\n    lr_mult: 1\n    decay_mult: 1\n  }\n  param {\n    lr_mult: 2\n    decay_mult: 0\n  }\n  convolution_param {\n    num_output: 256\n    pad: 0\n    kernel_size: 1\n    stride: 1\n    weight_filler {\n      type: \"xavier\"\n      std: 0.01\n    }\n    bias_filler {\n      type: \"constant\"\n      value: 0.2\n    }\n  }\n}\nlayer {\n  name: \"reduction_b_1x7_reduce_bn\"\n  type: \"BatchNorm\"\n  bottom: \"reduction_b_1x7_reduce\"\n  top: \"reduction_b_1x7_reduce\"\n  batch_norm_param {\n    use_global_stats: false\n  }\n}\nlayer {\n  name: \"reduction_b_1x7_reduce_scale\"\n  type: \"Scale\"\n  bottom: \"reduction_b_1x7_reduce\"\n  top: \"reduction_b_1x7_reduce\"\n  scale_param {\n    bias_term: true\n  }\n}\nlayer {\n  name: \"reduction_b_1x7_reduce_relu\"\n  type: \"ReLU\"\n  bottom: \"reduction_b_1x7_reduce\"\n  top: \"reduction_b_1x7_reduce\"\n}\nlayer {\n  name: \"reduction_b_1x7\"\n  type: \"Convolution\"\n  bottom: \"reduction_b_1x7_reduce\"\n  top: \"reduction_b_1x7\"\n  param {\n    lr_mult: 1\n    decay_mult: 1\n  }\n  param {\n    lr_mult: 2\n    decay_mult: 0\n  }\n  convolution_param {\n    num_output: 256\n    stride: 1\n    weight_filler {\n      type: \"xavier\"\n      std: 0.01\n    }\n    bias_filler {\n      type: \"constant\"\n      value: 0.2\n    }\n    pad_h: 0\n    pad_w: 3\n    kernel_h: 1\n    kernel_w: 7\n  }\n}\nlayer {\n  name: \"reduction_b_1x7_bn\"\n  type: \"BatchNorm\"\n  bottom: \"reduction_b_1x7\"\n  top: \"reduction_b_1x7\"\n  batch_norm_param {\n    use_global_stats: false\n  }\n}\nlayer {\n  name: \"reduction_b_1x7_scale\"\n  type: \"Scale\"\n  bottom: \"reduction_b_1x7\"\n  top: \"reduction_b_1x7\"\n  scale_param {\n    bias_term: true\n  }\n}\nlayer {\n  name: \"reduction_b_1x7_relu\"\n  type: \"ReLU\"\n  bottom: \"reduction_b_1x7\"\n  top: \"reduction_b_1x7\"\n}\nlayer {\n  name: \"reduction_b_7x1\"\n  type: \"Convolution\"\n  bottom: \"reduction_b_1x7\"\n  top: \"reduction_b_7x1\"\n  param {\n    lr_mult: 1\n    decay_mult: 1\n  }\n  param {\n    lr_mult: 2\n    decay_mult: 0\n  }\n  convolution_param {\n    num_output: 320\n    stride: 1\n    weight_filler {\n      type: \"xavier\"\n      std: 0.01\n    }\n    bias_filler {\n      type: \"constant\"\n      value: 0.2\n    }\n    pad_h: 3\n    pad_w: 0\n    kernel_h: 7\n    kernel_w: 1\n  }\n}\nlayer {\n  name: \"reduction_b_7x1_bn\"\n  type: \"BatchNorm\"\n  bottom: \"reduction_b_7x1\"\n  top: \"reduction_b_7x1\"\n  batch_norm_param {\n    use_global_stats: false\n  }\n}\nlayer {\n  name: \"reduction_b_7x1_scale\"\n  type: \"Scale\"\n  bottom: \"reduction_b_7x1\"\n  top: \"reduction_b_7x1\"\n  scale_param {\n    bias_term: true\n  }\n}\nlayer {\n  name: \"reduction_b_7x1_relu\"\n  type: \"ReLU\"\n  bottom: \"reduction_b_7x1\"\n  top: \"reduction_b_7x1\"\n}\nlayer {\n  name: \"reduction_b_3x3_2\"\n  type: \"Convolution\"\n  bottom: \"reduction_b_7x1\"\n  top: \"reduction_b_3x3_2\"\n  param {\n    lr_mult: 1\n    decay_mult: 1\n  }\n  param {\n    lr_mult: 2\n    decay_mult: 0\n  }\n  convolution_param {\n    num_output: 320\n    pad: 0\n    kernel_size: 3\n    stride: 2\n    weight_filler {\n      type: \"xavier\"\n      std: 0.01\n    }\n    bias_filler {\n      type: \"constant\"\n      value: 0.2\n    }\n  }\n}\nlayer {\n  name: \"reduction_b_3x3_2_bn\"\n  type: \"BatchNorm\"\n  bottom: \"reduction_b_3x3_2\"\n  top: \"reduction_b_3x3_2\"\n  batch_norm_param {\n    use_global_stats: false\n  }\n}\nlayer {\n  name: \"reduction_b_3x3_2_scale\"\n  type: \"Scale\"\n  bottom: \"reduction_b_3x3_2\"\n  top: \"reduction_b_3x3_2\"\n  scale_param {\n    bias_term: true\n  }\n}\nlayer {\n  name: \"reduction_b_3x3_2_relu\"\n  type: \"ReLU\"\n  bottom: \"reduction_b_3x3_2\"\n  top: \"reduction_b_3x3_2\"\n}\nlayer {\n  name: \"reduction_b_concat\"\n  type: \"Concat\"\n  bottom: \"reduction_b_pool\"\n  bottom: \"reduction_b_3x3\"\n  bottom: \"reduction_b_3x3_2\"\n  top: \"reduction_b_concat\"\n}\nlayer {\n  name: \"inception_c1_pool_ave\"\n  type: \"Pooling\"\n  bottom: \"reduction_b_concat\"\n  top: \"inception_c1_pool_ave\"\n  pooling_param {\n    pool: AVE\n    kernel_size: 3\n    stride: 1\n    pad: 1\n  }\n}\nlayer {\n  name: \"inception_c1_1x1\"\n  type: \"Convolution\"\n  bottom: \"inception_c1_pool_ave\"\n  top: \"inception_c1_1x1\"\n  param {\n    lr_mult: 1\n    decay_mult: 1\n  }\n  param {\n    lr_mult: 2\n    decay_mult: 0\n  }\n  convolution_param {\n    num_output: 256\n    pad: 0\n    kernel_size: 1\n    stride: 1\n    weight_filler {\n      type: \"xavier\"\n      std: 0.01\n    }\n    bias_filler {\n      type: \"constant\"\n      value: 0.2\n    }\n  }\n}\nlayer {\n  name: \"inception_c1_1x1_bn\"\n  type: \"BatchNorm\"\n  bottom: \"inception_c1_1x1\"\n  top: \"inception_c1_1x1\"\n  batch_norm_param {\n    use_global_stats: false\n  }\n}\nlayer {\n  name: \"inception_c1_1x1_scale\"\n  type: \"Scale\"\n  bottom: \"inception_c1_1x1\"\n  top: \"inception_c1_1x1\"\n  scale_param {\n    bias_term: true\n  }\n}\nlayer {\n  name: \"inception_c1_1x1_relu\"\n  type: \"ReLU\"\n  bottom: \"inception_c1_1x1\"\n  top: \"inception_c1_1x1\"\n}\nlayer {\n  name: \"inception_c1_1x1_2\"\n  type: \"Convolution\"\n  bottom: \"reduction_b_concat\"\n  top: \"inception_c1_1x1_2\"\n  param {\n    lr_mult: 1\n    decay_mult: 1\n  }\n  param {\n    lr_mult: 2\n    decay_mult: 0\n  }\n  convolution_param {\n    num_output: 256\n    pad: 0\n    kernel_size: 1\n    stride: 1\n    weight_filler {\n      type: \"xavier\"\n      std: 0.01\n    }\n    bias_filler {\n      type: \"constant\"\n      value: 0.2\n    }\n  }\n}\nlayer {\n  name: \"inception_c1_1x1_2_bn\"\n  type: \"BatchNorm\"\n  bottom: \"inception_c1_1x1_2\"\n  top: \"inception_c1_1x1_2\"\n  batch_norm_param {\n    use_global_stats: false\n  }\n}\nlayer {\n  name: \"inception_c1_1x1_2_scale\"\n  type: \"Scale\"\n  bottom: \"inception_c1_1x1_2\"\n  top: \"inception_c1_1x1_2\"\n  scale_param {\n    bias_term: true\n  }\n}\nlayer {\n  name: \"inception_c1_1x1_2_relu\"\n  type: \"ReLU\"\n  bottom: \"inception_c1_1x1_2\"\n  top: \"inception_c1_1x1_2\"\n}\nlayer {\n  name: \"inception_c1_1x1_3\"\n  type: \"Convolution\"\n  bottom: \"reduction_b_concat\"\n  top: \"inception_c1_1x1_3\"\n  param {\n    lr_mult: 1\n    decay_mult: 1\n  }\n  param {\n    lr_mult: 2\n    decay_mult: 0\n  }\n  convolution_param {\n    num_output: 384\n    pad: 0\n    kernel_size: 1\n    stride: 1\n    weight_filler {\n      type: \"xavier\"\n      std: 0.01\n    }\n    bias_filler {\n      type: \"constant\"\n      value: 0.2\n    }\n  }\n}\nlayer {\n  name: \"inception_c1_1x1_3_bn\"\n  type: \"BatchNorm\"\n  bottom: \"inception_c1_1x1_3\"\n  top: \"inception_c1_1x1_3\"\n  batch_norm_param {\n    use_global_stats: false\n  }\n}\nlayer {\n  name: \"inception_c1_1x1_3_scale\"\n  type: \"Scale\"\n  bottom: \"inception_c1_1x1_3\"\n  top: \"inception_c1_1x1_3\"\n  scale_param {\n    bias_term: true\n  }\n}\nlayer {\n  name: \"inception_c1_1x1_3_relu\"\n  type: \"ReLU\"\n  bottom: \"inception_c1_1x1_3\"\n  top: \"inception_c1_1x1_3\"\n}\nlayer {\n  name: \"inception_c1_1x3\"\n  type: \"Convolution\"\n  bottom: \"inception_c1_1x1_3\"\n  top: \"inception_c1_1x3\"\n  param {\n    lr_mult: 1\n    decay_mult: 1\n  }\n  param {\n    lr_mult: 2\n    decay_mult: 0\n  }\n  convolution_param {\n    num_output: 256\n    stride: 1\n    weight_filler {\n      type: \"xavier\"\n      std: 0.01\n    }\n    bias_filler {\n      type: \"constant\"\n      value: 0.2\n    }\n    pad_h: 0\n    pad_w: 1\n    kernel_h: 1\n    kernel_w: 3\n  }\n}\nlayer {\n  name: \"inception_c1_1x3_bn\"\n  type: \"BatchNorm\"\n  bottom: \"inception_c1_1x3\"\n  top: \"inception_c1_1x3\"\n  batch_norm_param {\n    use_global_stats: false\n  }\n}\nlayer {\n  name: \"inception_c1_1x3_scale\"\n  type: \"Scale\"\n  bottom: \"inception_c1_1x3\"\n  top: \"inception_c1_1x3\"\n  scale_param {\n    bias_term: true\n  }\n}\nlayer {\n  name: \"inception_c1_1x3_relu\"\n  type: \"ReLU\"\n  bottom: \"inception_c1_1x3\"\n  top: \"inception_c1_1x3\"\n}\nlayer {\n  name: \"inception_c1_3x1\"\n  type: \"Convolution\"\n  bottom: \"inception_c1_1x1_3\"\n  top: \"inception_c1_3x1\"\n  param {\n    lr_mult: 1\n    decay_mult: 1\n  }\n  param {\n    lr_mult: 2\n    decay_mult: 0\n  }\n  convolution_param {\n    num_output: 256\n    stride: 1\n    weight_filler {\n      type: \"xavier\"\n      std: 0.01\n    }\n    bias_filler {\n      type: \"constant\"\n      value: 0.2\n    }\n    pad_h: 1\n    pad_w: 0\n    kernel_h: 3\n    kernel_w: 1\n  }\n}\nlayer {\n  name: \"inception_c1_3x1_bn\"\n  type: \"BatchNorm\"\n  bottom: \"inception_c1_3x1\"\n  top: \"inception_c1_3x1\"\n  batch_norm_param {\n    use_global_stats: false\n  }\n}\nlayer {\n  name: \"inception_c1_3x1_scale\"\n  type: \"Scale\"\n  bottom: \"inception_c1_3x1\"\n  top: \"inception_c1_3x1\"\n  scale_param {\n    bias_term: true\n  }\n}\nlayer {\n  name: \"inception_c1_3x1_relu\"\n  type: \"ReLU\"\n  bottom: \"inception_c1_3x1\"\n  top: \"inception_c1_3x1\"\n}\nlayer {\n  name: \"inception_c1_1x1_4\"\n  type: \"Convolution\"\n  bottom: \"reduction_b_concat\"\n  top: \"inception_c1_1x1_4\"\n  param {\n    lr_mult: 1\n    decay_mult: 1\n  }\n  param {\n    lr_mult: 2\n    decay_mult: 0\n  }\n  convolution_param {\n    num_output: 384\n    pad: 0\n    kernel_size: 1\n    stride: 1\n    weight_filler {\n      type: \"xavier\"\n      std: 0.01\n    }\n    bias_filler {\n      type: \"constant\"\n      value: 0.2\n    }\n  }\n}\nlayer {\n  name: \"inception_c1_1x1_4_bn\"\n  type: \"BatchNorm\"\n  bottom: \"inception_c1_1x1_4\"\n  top: \"inception_c1_1x1_4\"\n  batch_norm_param {\n    use_global_stats: false\n  }\n}\nlayer {\n  name: \"inception_c1_1x1_4_scale\"\n  type: \"Scale\"\n  bottom: \"inception_c1_1x1_4\"\n  top: \"inception_c1_1x1_4\"\n  scale_param {\n    bias_term: true\n  }\n}\nlayer {\n  name: \"inception_c1_1x1_4_relu\"\n  type: \"ReLU\"\n  bottom: \"inception_c1_1x1_4\"\n  top: \"inception_c1_1x1_4\"\n}\nlayer {\n  name: \"inception_c1_1x3_2\"\n  type: \"Convolution\"\n  bottom: \"inception_c1_1x1_4\"\n  top: \"inception_c1_1x3_2\"\n  param {\n    lr_mult: 1\n    decay_mult: 1\n  }\n  param {\n    lr_mult: 2\n    decay_mult: 0\n  }\n  convolution_param {\n    num_output: 448\n    stride: 1\n    weight_filler {\n      type: \"xavier\"\n      std: 0.01\n    }\n    bias_filler {\n      type: \"constant\"\n      value: 0.2\n    }\n    pad_h: 0\n    pad_w: 1\n    kernel_h: 1\n    kernel_w: 3\n  }\n}\nlayer {\n  name: \"inception_c1_1x3_2_bn\"\n  type: \"BatchNorm\"\n  bottom: \"inception_c1_1x3_2\"\n  top: \"inception_c1_1x3_2\"\n  batch_norm_param {\n    use_global_stats: false\n  }\n}\nlayer {\n  name: \"inception_c1_1x3_2_scale\"\n  type: \"Scale\"\n  bottom: \"inception_c1_1x3_2\"\n  top: \"inception_c1_1x3_2\"\n  scale_param {\n    bias_term: true\n  }\n}\nlayer {\n  name: \"inception_c1_1x3_2_relu\"\n  type: \"ReLU\"\n  bottom: \"inception_c1_1x3_2\"\n  top: \"inception_c1_1x3_2\"\n}\nlayer {\n  name: \"inception_c1_3x1_2\"\n  type: \"Convolution\"\n  bottom: \"inception_c1_1x3_2\"\n  top: \"inception_c1_3x1_2\"\n  param {\n    lr_mult: 1\n    decay_mult: 1\n  }\n  param {\n    lr_mult: 2\n    decay_mult: 0\n  }\n  convolution_param {\n    num_output: 512\n    stride: 1\n    weight_filler {\n      type: \"xavier\"\n      std: 0.01\n    }\n    bias_filler {\n      type: \"constant\"\n      value: 0.2\n    }\n    pad_h: 1\n    pad_w: 0\n    kernel_h: 3\n    kernel_w: 1\n  }\n}\nlayer {\n  name: \"inception_c1_3x1_2_bn\"\n  type: \"BatchNorm\"\n  bottom: \"inception_c1_3x1_2\"\n  top: \"inception_c1_3x1_2\"\n  batch_norm_param {\n    use_global_stats: false\n  }\n}\nlayer {\n  name: \"inception_c1_3x1_2_scale\"\n  type: \"Scale\"\n  bottom: \"inception_c1_3x1_2\"\n  top: \"inception_c1_3x1_2\"\n  scale_param {\n    bias_term: true\n  }\n}\nlayer {\n  name: \"inception_c1_3x1_2_relu\"\n  type: \"ReLU\"\n  bottom: \"inception_c1_3x1_2\"\n  top: \"inception_c1_3x1_2\"\n}\nlayer {\n  name: \"inception_c1_1x3_3\"\n  type: \"Convolution\"\n  bottom: \"inception_c1_3x1_2\"\n  top: \"inception_c1_1x3_3\"\n  param {\n    lr_mult: 1\n    decay_mult: 1\n  }\n  param {\n    lr_mult: 2\n    decay_mult: 0\n  }\n  convolution_param {\n    num_output: 256\n    stride: 1\n    weight_filler {\n      type: \"xavier\"\n      std: 0.01\n    }\n    bias_filler {\n      type: \"constant\"\n      value: 0.2\n    }\n    pad_h: 0\n    pad_w: 1\n    kernel_h: 1\n    kernel_w: 3\n  }\n}\nlayer {\n  name: \"inception_c1_1x3_3_bn\"\n  type: \"BatchNorm\"\n  bottom: \"inception_c1_1x3_3\"\n  top: \"inception_c1_1x3_3\"\n  batch_norm_param {\n    use_global_stats: false\n  }\n}\nlayer {\n  name: \"inception_c1_1x3_3_scale\"\n  type: \"Scale\"\n  bottom: \"inception_c1_1x3_3\"\n  top: \"inception_c1_1x3_3\"\n  scale_param {\n    bias_term: true\n  }\n}\nlayer {\n  name: \"inception_c1_1x3_3_relu\"\n  type: \"ReLU\"\n  bottom: \"inception_c1_1x3_3\"\n  top: \"inception_c1_1x3_3\"\n}\nlayer {\n  name: \"inception_c1_3x1_3\"\n  type: \"Convolution\"\n  bottom: \"inception_c1_3x1_2\"\n  top: \"inception_c1_3x1_3\"\n  param {\n    lr_mult: 1\n    decay_mult: 1\n  }\n  param {\n    lr_mult: 2\n    decay_mult: 0\n  }\n  convolution_param {\n    num_output: 256\n    stride: 1\n    weight_filler {\n      type: \"xavier\"\n      std: 0.01\n    }\n    bias_filler {\n      type: \"constant\"\n      value: 0.2\n    }\n    pad_h: 1\n    pad_w: 0\n    kernel_h: 3\n    kernel_w: 1\n  }\n}\nlayer {\n  name: \"inception_c1_3x1_3_bn\"\n  type: \"BatchNorm\"\n  bottom: \"inception_c1_3x1_3\"\n  top: \"inception_c1_3x1_3\"\n  batch_norm_param {\n    use_global_stats: false\n  }\n}\nlayer {\n  name: \"inception_c1_3x1_3_scale\"\n  type: \"Scale\"\n  bottom: \"inception_c1_3x1_3\"\n  top: \"inception_c1_3x1_3\"\n  scale_param {\n    bias_term: true\n  }\n}\nlayer {\n  name: \"inception_c1_3x1_3_relu\"\n  type: \"ReLU\"\n  bottom: \"inception_c1_3x1_3\"\n  top: \"inception_c1_3x1_3\"\n}\nlayer {\n  name: \"inception_c1_concat\"\n  type: \"Concat\"\n  bottom: \"inception_c1_1x1\"\n  bottom: \"inception_c1_1x1_2\"\n  bottom: \"inception_c1_1x3\"\n  bottom: \"inception_c1_3x1\"\n  bottom: \"inception_c1_1x3_3\"\n  bottom: \"inception_c1_3x1_3\"\n  top: \"inception_c1_concat\"\n}\nlayer {\n  name: \"inception_c2_pool_ave\"\n  type: \"Pooling\"\n  bottom: \"inception_c1_concat\"\n  top: \"inception_c2_pool_ave\"\n  pooling_param {\n    pool: AVE\n    kernel_size: 3\n    stride: 1\n    pad: 1\n  }\n}\nlayer {\n  name: \"inception_c2_1x1\"\n  type: \"Convolution\"\n  bottom: \"inception_c2_pool_ave\"\n  top: \"inception_c2_1x1\"\n  param {\n    lr_mult: 1\n    decay_mult: 1\n  }\n  param {\n    lr_mult: 2\n    decay_mult: 0\n  }\n  convolution_param {\n    num_output: 256\n    pad: 0\n    kernel_size: 1\n    stride: 1\n    weight_filler {\n      type: \"xavier\"\n      std: 0.01\n    }\n    bias_filler {\n      type: \"constant\"\n      value: 0.2\n    }\n  }\n}\nlayer {\n  name: \"inception_c2_1x1_bn\"\n  type: \"BatchNorm\"\n  bottom: \"inception_c2_1x1\"\n  top: \"inception_c2_1x1\"\n  batch_norm_param {\n    use_global_stats: false\n  }\n}\nlayer {\n  name: \"inception_c2_1x1_scale\"\n  type: \"Scale\"\n  bottom: \"inception_c2_1x1\"\n  top: \"inception_c2_1x1\"\n  scale_param {\n    bias_term: true\n  }\n}\nlayer {\n  name: \"inception_c2_1x1_relu\"\n  type: \"ReLU\"\n  bottom: \"inception_c2_1x1\"\n  top: \"inception_c2_1x1\"\n}\nlayer {\n  name: \"inception_c2_1x1_2\"\n  type: \"Convolution\"\n  bottom: \"inception_c1_concat\"\n  top: \"inception_c2_1x1_2\"\n  param {\n    lr_mult: 1\n    decay_mult: 1\n  }\n  param {\n    lr_mult: 2\n    decay_mult: 0\n  }\n  convolution_param {\n    num_output: 256\n    pad: 0\n    kernel_size: 1\n    stride: 1\n    weight_filler {\n      type: \"xavier\"\n      std: 0.01\n    }\n    bias_filler {\n      type: \"constant\"\n      value: 0.2\n    }\n  }\n}\nlayer {\n  name: \"inception_c2_1x1_2_bn\"\n  type: \"BatchNorm\"\n  bottom: \"inception_c2_1x1_2\"\n  top: \"inception_c2_1x1_2\"\n  batch_norm_param {\n    use_global_stats: false\n  }\n}\nlayer {\n  name: \"inception_c2_1x1_2_scale\"\n  type: \"Scale\"\n  bottom: \"inception_c2_1x1_2\"\n  top: \"inception_c2_1x1_2\"\n  scale_param {\n    bias_term: true\n  }\n}\nlayer {\n  name: \"inception_c2_1x1_2_relu\"\n  type: \"ReLU\"\n  bottom: \"inception_c2_1x1_2\"\n  top: \"inception_c2_1x1_2\"\n}\nlayer {\n  name: \"inception_c2_1x1_3\"\n  type: \"Convolution\"\n  bottom: \"inception_c1_concat\"\n  top: \"inception_c2_1x1_3\"\n  param {\n    lr_mult: 1\n    decay_mult: 1\n  }\n  param {\n    lr_mult: 2\n    decay_mult: 0\n  }\n  convolution_param {\n    num_output: 384\n    pad: 0\n    kernel_size: 1\n    stride: 1\n    weight_filler {\n      type: \"xavier\"\n      std: 0.01\n    }\n    bias_filler {\n      type: \"constant\"\n      value: 0.2\n    }\n  }\n}\nlayer {\n  name: \"inception_c2_1x1_3_bn\"\n  type: \"BatchNorm\"\n  bottom: \"inception_c2_1x1_3\"\n  top: \"inception_c2_1x1_3\"\n  batch_norm_param {\n    use_global_stats: false\n  }\n}\nlayer {\n  name: \"inception_c2_1x1_3_scale\"\n  type: \"Scale\"\n  bottom: \"inception_c2_1x1_3\"\n  top: \"inception_c2_1x1_3\"\n  scale_param {\n    bias_term: true\n  }\n}\nlayer {\n  name: \"inception_c2_1x1_3_relu\"\n  type: \"ReLU\"\n  bottom: \"inception_c2_1x1_3\"\n  top: \"inception_c2_1x1_3\"\n}\nlayer {\n  name: \"inception_c2_1x3\"\n  type: \"Convolution\"\n  bottom: \"inception_c2_1x1_3\"\n  top: \"inception_c2_1x3\"\n  param {\n    lr_mult: 1\n    decay_mult: 1\n  }\n  param {\n    lr_mult: 2\n    decay_mult: 0\n  }\n  convolution_param {\n    num_output: 256\n    stride: 1\n    weight_filler {\n      type: \"xavier\"\n      std: 0.01\n    }\n    bias_filler {\n      type: \"constant\"\n      value: 0.2\n    }\n    pad_h: 0\n    pad_w: 1\n    kernel_h: 1\n    kernel_w: 3\n  }\n}\nlayer {\n  name: \"inception_c2_1x3_bn\"\n  type: \"BatchNorm\"\n  bottom: \"inception_c2_1x3\"\n  top: \"inception_c2_1x3\"\n  batch_norm_param {\n    use_global_stats: false\n  }\n}\nlayer {\n  name: \"inception_c2_1x3_scale\"\n  type: \"Scale\"\n  bottom: \"inception_c2_1x3\"\n  top: \"inception_c2_1x3\"\n  scale_param {\n    bias_term: true\n  }\n}\nlayer {\n  name: \"inception_c2_1x3_relu\"\n  type: \"ReLU\"\n  bottom: \"inception_c2_1x3\"\n  top: \"inception_c2_1x3\"\n}\nlayer {\n  name: \"inception_c2_3x1\"\n  type: \"Convolution\"\n  bottom: \"inception_c2_1x1_3\"\n  top: \"inception_c2_3x1\"\n  param {\n    lr_mult: 1\n    decay_mult: 1\n  }\n  param {\n    lr_mult: 2\n    decay_mult: 0\n  }\n  convolution_param {\n    num_output: 256\n    stride: 1\n    weight_filler {\n      type: \"xavier\"\n      std: 0.01\n    }\n    bias_filler {\n      type: \"constant\"\n      value: 0.2\n    }\n    pad_h: 1\n    pad_w: 0\n    kernel_h: 3\n    kernel_w: 1\n  }\n}\nlayer {\n  name: \"inception_c2_3x1_bn\"\n  type: \"BatchNorm\"\n  bottom: \"inception_c2_3x1\"\n  top: \"inception_c2_3x1\"\n  batch_norm_param {\n    use_global_stats: false\n  }\n}\nlayer {\n  name: \"inception_c2_3x1_scale\"\n  type: \"Scale\"\n  bottom: \"inception_c2_3x1\"\n  top: \"inception_c2_3x1\"\n  scale_param {\n    bias_term: true\n  }\n}\nlayer {\n  name: \"inception_c2_3x1_relu\"\n  type: \"ReLU\"\n  bottom: \"inception_c2_3x1\"\n  top: \"inception_c2_3x1\"\n}\nlayer {\n  name: \"inception_c2_1x1_4\"\n  type: \"Convolution\"\n  bottom: \"inception_c1_concat\"\n  top: \"inception_c2_1x1_4\"\n  param {\n    lr_mult: 1\n    decay_mult: 1\n  }\n  param {\n    lr_mult: 2\n    decay_mult: 0\n  }\n  convolution_param {\n    num_output: 384\n    pad: 0\n    kernel_size: 1\n    stride: 1\n    weight_filler {\n      type: \"xavier\"\n      std: 0.01\n    }\n    bias_filler {\n      type: \"constant\"\n      value: 0.2\n    }\n  }\n}\nlayer {\n  name: \"inception_c2_1x1_4_bn\"\n  type: \"BatchNorm\"\n  bottom: \"inception_c2_1x1_4\"\n  top: \"inception_c2_1x1_4\"\n  batch_norm_param {\n    use_global_stats: false\n  }\n}\nlayer {\n  name: \"inception_c2_1x1_4_scale\"\n  type: \"Scale\"\n  bottom: \"inception_c2_1x1_4\"\n  top: \"inception_c2_1x1_4\"\n  scale_param {\n    bias_term: true\n  }\n}\nlayer {\n  name: \"inception_c2_1x1_4_relu\"\n  type: \"ReLU\"\n  bottom: \"inception_c2_1x1_4\"\n  top: \"inception_c2_1x1_4\"\n}\nlayer {\n  name: \"inception_c2_1x3_2\"\n  type: \"Convolution\"\n  bottom: \"inception_c2_1x1_4\"\n  top: \"inception_c2_1x3_2\"\n  param {\n    lr_mult: 1\n    decay_mult: 1\n  }\n  param {\n    lr_mult: 2\n    decay_mult: 0\n  }\n  convolution_param {\n    num_output: 448\n    stride: 1\n    weight_filler {\n      type: \"xavier\"\n      std: 0.01\n    }\n    bias_filler {\n      type: \"constant\"\n      value: 0.2\n    }\n    pad_h: 0\n    pad_w: 1\n    kernel_h: 1\n    kernel_w: 3\n  }\n}\nlayer {\n  name: \"inception_c2_1x3_2_bn\"\n  type: \"BatchNorm\"\n  bottom: \"inception_c2_1x3_2\"\n  top: \"inception_c2_1x3_2\"\n  batch_norm_param {\n    use_global_stats: false\n  }\n}\nlayer {\n  name: \"inception_c2_1x3_2_scale\"\n  type: \"Scale\"\n  bottom: \"inception_c2_1x3_2\"\n  top: \"inception_c2_1x3_2\"\n  scale_param {\n    bias_term: true\n  }\n}\nlayer {\n  name: \"inception_c2_1x3_2_relu\"\n  type: \"ReLU\"\n  bottom: \"inception_c2_1x3_2\"\n  top: \"inception_c2_1x3_2\"\n}\nlayer {\n  name: \"inception_c2_3x1_2\"\n  type: \"Convolution\"\n  bottom: \"inception_c2_1x3_2\"\n  top: \"inception_c2_3x1_2\"\n  param {\n    lr_mult: 1\n    decay_mult: 1\n  }\n  param {\n    lr_mult: 2\n    decay_mult: 0\n  }\n  convolution_param {\n    num_output: 512\n    stride: 1\n    weight_filler {\n      type: \"xavier\"\n      std: 0.01\n    }\n    bias_filler {\n      type: \"constant\"\n      value: 0.2\n    }\n    pad_h: 1\n    pad_w: 0\n    kernel_h: 3\n    kernel_w: 1\n  }\n}\nlayer {\n  name: \"inception_c2_3x1_2_bn\"\n  type: \"BatchNorm\"\n  bottom: \"inception_c2_3x1_2\"\n  top: \"inception_c2_3x1_2\"\n  batch_norm_param {\n    use_global_stats: false\n  }\n}\nlayer {\n  name: \"inception_c2_3x1_2_scale\"\n  type: \"Scale\"\n  bottom: \"inception_c2_3x1_2\"\n  top: \"inception_c2_3x1_2\"\n  scale_param {\n    bias_term: true\n  }\n}\nlayer {\n  name: \"inception_c2_3x1_2_relu\"\n  type: \"ReLU\"\n  bottom: \"inception_c2_3x1_2\"\n  top: \"inception_c2_3x1_2\"\n}\nlayer {\n  name: \"inception_c2_1x3_3\"\n  type: \"Convolution\"\n  bottom: \"inception_c2_3x1_2\"\n  top: \"inception_c2_1x3_3\"\n  param {\n    lr_mult: 1\n    decay_mult: 1\n  }\n  param {\n    lr_mult: 2\n    decay_mult: 0\n  }\n  convolution_param {\n    num_output: 256\n    stride: 1\n    weight_filler {\n      type: \"xavier\"\n      std: 0.01\n    }\n    bias_filler {\n      type: \"constant\"\n      value: 0.2\n    }\n    pad_h: 0\n    pad_w: 1\n    kernel_h: 1\n    kernel_w: 3\n  }\n}\nlayer {\n  name: \"inception_c2_1x3_3_bn\"\n  type: \"BatchNorm\"\n  bottom: \"inception_c2_1x3_3\"\n  top: \"inception_c2_1x3_3\"\n  batch_norm_param {\n    use_global_stats: false\n  }\n}\nlayer {\n  name: \"inception_c2_1x3_3_scale\"\n  type: \"Scale\"\n  bottom: \"inception_c2_1x3_3\"\n  top: \"inception_c2_1x3_3\"\n  scale_param {\n    bias_term: true\n  }\n}\nlayer {\n  name: \"inception_c2_1x3_3_relu\"\n  type: \"ReLU\"\n  bottom: \"inception_c2_1x3_3\"\n  top: \"inception_c2_1x3_3\"\n}\nlayer {\n  name: \"inception_c2_3x1_3\"\n  type: \"Convolution\"\n  bottom: \"inception_c2_3x1_2\"\n  top: \"inception_c2_3x1_3\"\n  param {\n    lr_mult: 1\n    decay_mult: 1\n  }\n  param {\n    lr_mult: 2\n    decay_mult: 0\n  }\n  convolution_param {\n    num_output: 256\n    stride: 1\n    weight_filler {\n      type: \"xavier\"\n      std: 0.01\n    }\n    bias_filler {\n      type: \"constant\"\n      value: 0.2\n    }\n    pad_h: 1\n    pad_w: 0\n    kernel_h: 3\n    kernel_w: 1\n  }\n}\nlayer {\n  name: \"inception_c2_3x1_3_bn\"\n  type: \"BatchNorm\"\n  bottom: \"inception_c2_3x1_3\"\n  top: \"inception_c2_3x1_3\"\n  batch_norm_param {\n    use_global_stats: false\n  }\n}\nlayer {\n  name: \"inception_c2_3x1_3_scale\"\n  type: \"Scale\"\n  bottom: \"inception_c2_3x1_3\"\n  top: \"inception_c2_3x1_3\"\n  scale_param {\n    bias_term: true\n  }\n}\nlayer {\n  name: \"inception_c2_3x1_3_relu\"\n  type: \"ReLU\"\n  bottom: \"inception_c2_3x1_3\"\n  top: \"inception_c2_3x1_3\"\n}\nlayer {\n  name: \"inception_c2_concat\"\n  type: \"Concat\"\n  bottom: \"inception_c2_1x1\"\n  bottom: \"inception_c2_1x1_2\"\n  bottom: \"inception_c2_1x3\"\n  bottom: \"inception_c2_3x1\"\n  bottom: \"inception_c2_1x3_3\"\n  bottom: \"inception_c2_3x1_3\"\n  top: \"inception_c2_concat\"\n}\nlayer {\n  name: \"inception_c3_pool_ave\"\n  type: \"Pooling\"\n  bottom: \"inception_c2_concat\"\n  top: \"inception_c3_pool_ave\"\n  pooling_param {\n    pool: AVE\n    kernel_size: 3\n    stride: 1\n    pad: 1\n  }\n}\nlayer {\n  name: \"inception_c3_1x1\"\n  type: \"Convolution\"\n  bottom: \"inception_c3_pool_ave\"\n  top: \"inception_c3_1x1\"\n  param {\n    lr_mult: 1\n    decay_mult: 1\n  }\n  param {\n    lr_mult: 2\n    decay_mult: 0\n  }\n  convolution_param {\n    num_output: 256\n    pad: 0\n    kernel_size: 1\n    stride: 1\n    weight_filler {\n      type: \"xavier\"\n      std: 0.01\n    }\n    bias_filler {\n      type: \"constant\"\n      value: 0.2\n    }\n  }\n}\nlayer {\n  name: \"inception_c3_1x1_bn\"\n  type: \"BatchNorm\"\n  bottom: \"inception_c3_1x1\"\n  top: \"inception_c3_1x1\"\n  batch_norm_param {\n    use_global_stats: false\n  }\n}\nlayer {\n  name: \"inception_c3_1x1_scale\"\n  type: \"Scale\"\n  bottom: \"inception_c3_1x1\"\n  top: \"inception_c3_1x1\"\n  scale_param {\n    bias_term: true\n  }\n}\nlayer {\n  name: \"inception_c3_1x1_relu\"\n  type: \"ReLU\"\n  bottom: \"inception_c3_1x1\"\n  top: \"inception_c3_1x1\"\n}\nlayer {\n  name: \"inception_c3_1x1_2\"\n  type: \"Convolution\"\n  bottom: \"inception_c2_concat\"\n  top: \"inception_c3_1x1_2\"\n  param {\n    lr_mult: 1\n    decay_mult: 1\n  }\n  param {\n    lr_mult: 2\n    decay_mult: 0\n  }\n  convolution_param {\n    num_output: 256\n    pad: 0\n    kernel_size: 1\n    stride: 1\n    weight_filler {\n      type: \"xavier\"\n      std: 0.01\n    }\n    bias_filler {\n      type: \"constant\"\n      value: 0.2\n    }\n  }\n}\nlayer {\n  name: \"inception_c3_1x1_2_bn\"\n  type: \"BatchNorm\"\n  bottom: \"inception_c3_1x1_2\"\n  top: \"inception_c3_1x1_2\"\n  batch_norm_param {\n    use_global_stats: false\n  }\n}\nlayer {\n  name: \"inception_c3_1x1_2_scale\"\n  type: \"Scale\"\n  bottom: \"inception_c3_1x1_2\"\n  top: \"inception_c3_1x1_2\"\n  scale_param {\n    bias_term: true\n  }\n}\nlayer {\n  name: \"inception_c3_1x1_2_relu\"\n  type: \"ReLU\"\n  bottom: \"inception_c3_1x1_2\"\n  top: \"inception_c3_1x1_2\"\n}\nlayer {\n  name: \"inception_c3_1x1_3\"\n  type: \"Convolution\"\n  bottom: \"inception_c2_concat\"\n  top: \"inception_c3_1x1_3\"\n  param {\n    lr_mult: 1\n    decay_mult: 1\n  }\n  param {\n    lr_mult: 2\n    decay_mult: 0\n  }\n  convolution_param {\n    num_output: 384\n    pad: 0\n    kernel_size: 1\n    stride: 1\n    weight_filler {\n      type: \"xavier\"\n      std: 0.01\n    }\n    bias_filler {\n      type: \"constant\"\n      value: 0.2\n    }\n  }\n}\nlayer {\n  name: \"inception_c3_1x1_3_bn\"\n  type: \"BatchNorm\"\n  bottom: \"inception_c3_1x1_3\"\n  top: \"inception_c3_1x1_3\"\n  batch_norm_param {\n    use_global_stats: false\n  }\n}\nlayer {\n  name: \"inception_c3_1x1_3_scale\"\n  type: \"Scale\"\n  bottom: \"inception_c3_1x1_3\"\n  top: \"inception_c3_1x1_3\"\n  scale_param {\n    bias_term: true\n  }\n}\nlayer {\n  name: \"inception_c3_1x1_3_relu\"\n  type: \"ReLU\"\n  bottom: \"inception_c3_1x1_3\"\n  top: \"inception_c3_1x1_3\"\n}\nlayer {\n  name: \"inception_c3_1x3\"\n  type: \"Convolution\"\n  bottom: \"inception_c3_1x1_3\"\n  top: \"inception_c3_1x3\"\n  param {\n    lr_mult: 1\n    decay_mult: 1\n  }\n  param {\n    lr_mult: 2\n    decay_mult: 0\n  }\n  convolution_param {\n    num_output: 256\n    stride: 1\n    weight_filler {\n      type: \"xavier\"\n      std: 0.01\n    }\n    bias_filler {\n      type: \"constant\"\n      value: 0.2\n    }\n    pad_h: 0\n    pad_w: 1\n    kernel_h: 1\n    kernel_w: 3\n  }\n}\nlayer {\n  name: \"inception_c3_1x3_bn\"\n  type: \"BatchNorm\"\n  bottom: \"inception_c3_1x3\"\n  top: \"inception_c3_1x3\"\n  batch_norm_param {\n    use_global_stats: false\n  }\n}\nlayer {\n  name: \"inception_c3_1x3_scale\"\n  type: \"Scale\"\n  bottom: \"inception_c3_1x3\"\n  top: \"inception_c3_1x3\"\n  scale_param {\n    bias_term: true\n  }\n}\nlayer {\n  name: \"inception_c3_1x3_relu\"\n  type: \"ReLU\"\n  bottom: \"inception_c3_1x3\"\n  top: \"inception_c3_1x3\"\n}\nlayer {\n  name: \"inception_c3_3x1\"\n  type: \"Convolution\"\n  bottom: \"inception_c3_1x1_3\"\n  top: \"inception_c3_3x1\"\n  param {\n    lr_mult: 1\n    decay_mult: 1\n  }\n  param {\n    lr_mult: 2\n    decay_mult: 0\n  }\n  convolution_param {\n    num_output: 256\n    stride: 1\n    weight_filler {\n      type: \"xavier\"\n      std: 0.01\n    }\n    bias_filler {\n      type: \"constant\"\n      value: 0.2\n    }\n    pad_h: 1\n    pad_w: 0\n    kernel_h: 3\n    kernel_w: 1\n  }\n}\nlayer {\n  name: \"inception_c3_3x1_bn\"\n  type: \"BatchNorm\"\n  bottom: \"inception_c3_3x1\"\n  top: \"inception_c3_3x1\"\n  batch_norm_param {\n    use_global_stats: false\n  }\n}\nlayer {\n  name: \"inception_c3_3x1_scale\"\n  type: \"Scale\"\n  bottom: \"inception_c3_3x1\"\n  top: \"inception_c3_3x1\"\n  scale_param {\n    bias_term: true\n  }\n}\nlayer {\n  name: \"inception_c3_3x1_relu\"\n  type: \"ReLU\"\n  bottom: \"inception_c3_3x1\"\n  top: \"inception_c3_3x1\"\n}\nlayer {\n  name: \"inception_c3_1x1_4\"\n  type: \"Convolution\"\n  bottom: \"inception_c2_concat\"\n  top: \"inception_c3_1x1_4\"\n  param {\n    lr_mult: 1\n    decay_mult: 1\n  }\n  param {\n    lr_mult: 2\n    decay_mult: 0\n  }\n  convolution_param {\n    num_output: 384\n    pad: 0\n    kernel_size: 1\n    stride: 1\n    weight_filler {\n      type: \"xavier\"\n      std: 0.01\n    }\n    bias_filler {\n      type: \"constant\"\n      value: 0.2\n    }\n  }\n}\nlayer {\n  name: \"inception_c3_1x1_4_bn\"\n  type: \"BatchNorm\"\n  bottom: \"inception_c3_1x1_4\"\n  top: \"inception_c3_1x1_4\"\n  batch_norm_param {\n    use_global_stats: false\n  }\n}\nlayer {\n  name: \"inception_c3_1x1_4_scale\"\n  type: \"Scale\"\n  bottom: \"inception_c3_1x1_4\"\n  top: \"inception_c3_1x1_4\"\n  scale_param {\n    bias_term: true\n  }\n}\nlayer {\n  name: \"inception_c3_1x1_4_relu\"\n  type: \"ReLU\"\n  bottom: \"inception_c3_1x1_4\"\n  top: \"inception_c3_1x1_4\"\n}\nlayer {\n  name: \"inception_c3_1x3_2\"\n  type: \"Convolution\"\n  bottom: \"inception_c3_1x1_4\"\n  top: \"inception_c3_1x3_2\"\n  param {\n    lr_mult: 1\n    decay_mult: 1\n  }\n  param {\n    lr_mult: 2\n    decay_mult: 0\n  }\n  convolution_param {\n    num_output: 448\n    stride: 1\n    weight_filler {\n      type: \"xavier\"\n      std: 0.01\n    }\n    bias_filler {\n      type: \"constant\"\n      value: 0.2\n    }\n    pad_h: 0\n    pad_w: 1\n    kernel_h: 1\n    kernel_w: 3\n  }\n}\nlayer {\n  name: \"inception_c3_1x3_2_bn\"\n  type: \"BatchNorm\"\n  bottom: \"inception_c3_1x3_2\"\n  top: \"inception_c3_1x3_2\"\n  batch_norm_param {\n    use_global_stats: false\n  }\n}\nlayer {\n  name: \"inception_c3_1x3_2_scale\"\n  type: \"Scale\"\n  bottom: \"inception_c3_1x3_2\"\n  top: \"inception_c3_1x3_2\"\n  scale_param {\n    bias_term: true\n  }\n}\nlayer {\n  name: \"inception_c3_1x3_2_relu\"\n  type: \"ReLU\"\n  bottom: \"inception_c3_1x3_2\"\n  top: \"inception_c3_1x3_2\"\n}\nlayer {\n  name: \"inception_c3_3x1_2\"\n  type: \"Convolution\"\n  bottom: \"inception_c3_1x3_2\"\n  top: \"inception_c3_3x1_2\"\n  param {\n    lr_mult: 1\n    decay_mult: 1\n  }\n  param {\n    lr_mult: 2\n    decay_mult: 0\n  }\n  convolution_param {\n    num_output: 512\n    stride: 1\n    weight_filler {\n      type: \"xavier\"\n      std: 0.01\n    }\n    bias_filler {\n      type: \"constant\"\n      value: 0.2\n    }\n    pad_h: 1\n    pad_w: 0\n    kernel_h: 3\n    kernel_w: 1\n  }\n}\nlayer {\n  name: \"inception_c3_3x1_2_bn\"\n  type: \"BatchNorm\"\n  bottom: \"inception_c3_3x1_2\"\n  top: \"inception_c3_3x1_2\"\n  batch_norm_param {\n    use_global_stats: false\n  }\n}\nlayer {\n  name: \"inception_c3_3x1_2_scale\"\n  type: \"Scale\"\n  bottom: \"inception_c3_3x1_2\"\n  top: \"inception_c3_3x1_2\"\n  scale_param {\n    bias_term: true\n  }\n}\nlayer {\n  name: \"inception_c3_3x1_2_relu\"\n  type: \"ReLU\"\n  bottom: \"inception_c3_3x1_2\"\n  top: \"inception_c3_3x1_2\"\n}\nlayer {\n  name: \"inception_c3_1x3_3\"\n  type: \"Convolution\"\n  bottom: \"inception_c3_3x1_2\"\n  top: \"inception_c3_1x3_3\"\n  param {\n    lr_mult: 1\n    decay_mult: 1\n  }\n  param {\n    lr_mult: 2\n    decay_mult: 0\n  }\n  convolution_param {\n    num_output: 256\n    stride: 1\n    weight_filler {\n      type: \"xavier\"\n      std: 0.01\n    }\n    bias_filler {\n      type: \"constant\"\n      value: 0.2\n    }\n    pad_h: 0\n    pad_w: 1\n    kernel_h: 1\n    kernel_w: 3\n  }\n}\nlayer {\n  name: \"inception_c3_1x3_3_bn\"\n  type: \"BatchNorm\"\n  bottom: \"inception_c3_1x3_3\"\n  top: \"inception_c3_1x3_3\"\n  batch_norm_param {\n    use_global_stats: false\n  }\n}\nlayer {\n  name: \"inception_c3_1x3_3_scale\"\n  type: \"Scale\"\n  bottom: \"inception_c3_1x3_3\"\n  top: \"inception_c3_1x3_3\"\n  scale_param {\n    bias_term: true\n  }\n}\nlayer {\n  name: \"inception_c3_1x3_3_relu\"\n  type: \"ReLU\"\n  bottom: \"inception_c3_1x3_3\"\n  top: \"inception_c3_1x3_3\"\n}\nlayer {\n  name: \"inception_c3_3x1_3\"\n  type: \"Convolution\"\n  bottom: \"inception_c3_3x1_2\"\n  top: \"inception_c3_3x1_3\"\n  param {\n    lr_mult: 1\n    decay_mult: 1\n  }\n  param {\n    lr_mult: 2\n    decay_mult: 0\n  }\n  convolution_param {\n    num_output: 256\n    stride: 1\n    weight_filler {\n      type: \"xavier\"\n      std: 0.01\n    }\n    bias_filler {\n      type: \"constant\"\n      value: 0.2\n    }\n    pad_h: 1\n    pad_w: 0\n    kernel_h: 3\n    kernel_w: 1\n  }\n}\nlayer {\n  name: \"inception_c3_3x1_3_bn\"\n  type: \"BatchNorm\"\n  bottom: \"inception_c3_3x1_3\"\n  top: \"inception_c3_3x1_3\"\n  batch_norm_param {\n    use_global_stats: false\n  }\n}\nlayer {\n  name: \"inception_c3_3x1_3_scale\"\n  type: \"Scale\"\n  bottom: \"inception_c3_3x1_3\"\n  top: \"inception_c3_3x1_3\"\n  scale_param {\n    bias_term: true\n  }\n}\nlayer {\n  name: \"inception_c3_3x1_3_relu\"\n  type: \"ReLU\"\n  bottom: \"inception_c3_3x1_3\"\n  top: \"inception_c3_3x1_3\"\n}\nlayer {\n  name: \"inception_c3_concat\"\n  type: \"Concat\"\n  bottom: \"inception_c3_1x1\"\n  bottom: \"inception_c3_1x1_2\"\n  bottom: \"inception_c3_1x3\"\n  bottom: \"inception_c3_3x1\"\n  bottom: \"inception_c3_1x3_3\"\n  bottom: \"inception_c3_3x1_3\"\n  top: \"inception_c3_concat\"\n}\nlayer {\n  name: \"pool_8x8_s1\"\n  type: \"Pooling\"\n  bottom: \"inception_c3_concat\"\n  top: \"pool_8x8_s1\"\n  pooling_param {\n    pool: AVE\n    global_pooling: true\n  }\n}\nlayer {\n  name: \"pool_8x8_s1_drop\"\n  type: \"Dropout\"\n  bottom: \"pool_8x8_s1\"\n  top: \"pool_8x8_s1_drop\"\n  dropout_param {\n    dropout_ratio: 0.2\n  }\n}\nlayer {\n  name: \"classifier\"\n  type: \"InnerProduct\"\n  bottom: \"pool_8x8_s1_drop\"\n  top: \"classifier\"\n  param {\n    lr_mult: 1\n    decay_mult: 1\n  }\n  param {\n    lr_mult: 2\n    decay_mult: 0\n  }\n  inner_product_param {\n    num_output: 1000\n    weight_filler {\n      type: \"xavier\"\n    }\n    bias_filler {\n      type: \"constant\"\n      value: 0\n    }\n  }\n}\nlayer {\n  name: \"loss\"\n  type: \"SoftmaxWithLoss\"\n  bottom: \"classifier\"\n  top: \"loss\"\n}"
  },
  {
    "path": "presets/inceptionv4_resnet.prototxt",
    "content": "#downloaded from http://github.com/soeaver/caffe-model\nname: \"inception_resnet_v2\"\nlayer {\n  name: \"data\"\n  type: \"Data\"\n  top: \"data\"\n  include {\n    phase: TRAIN\n  }\n  transform_param {\n    mirror: true\n    crop_size: 299\n    mean_value: 104\n    mean_value: 117\n    mean_value: 123\n  }\n  data_param {\n    source: \"examples/imagenet/ilsvrc12_train_lmdb\"\n    batch_size: 64\n    backend: LMDB\n  }\n}\n\nlayer {\n  name: \"conv1_3x3_s2\"\n  type: \"Convolution\"\n  bottom: \"data\"\n  top: \"conv1_3x3_s2\"\n  param {\n    lr_mult: 1\n    decay_mult: 1\n  }\n  param {\n    lr_mult: 2\n    decay_mult: 0\n  }\n  convolution_param {\n    num_output: 32\n    pad: 0\n    kernel_size: 3\n    stride: 2\n    weight_filler {\n      type: \"xavier\"\n      std: 0.01\n    }\n    bias_filler {\n      type: \"constant\"\n      value: 0.2\n    }\n  }\n}\nlayer {\n  name: \"conv1_3x3_s2_bn\"\n  type: \"BatchNorm\"\n  bottom: \"conv1_3x3_s2\"\n  top: \"conv1_3x3_s2\"\n  batch_norm_param {\n    use_global_stats: false\n  }\n}\nlayer {\n  name: \"conv1_3x3_s2_scale\"\n  type: \"Scale\"\n  bottom: \"conv1_3x3_s2\"\n  top: \"conv1_3x3_s2\"\n  scale_param {\n    bias_term: true\n  }\n}\nlayer {\n  name: \"conv1_3x3_s2_relu\"\n  type: \"ReLU\"\n  bottom: \"conv1_3x3_s2\"\n  top: \"conv1_3x3_s2\"\n}\nlayer {\n  name: \"conv2_3x3_s1\"\n  type: \"Convolution\"\n  bottom: \"conv1_3x3_s2\"\n  top: \"conv2_3x3_s1\"\n  param {\n    lr_mult: 1\n    decay_mult: 1\n  }\n  param {\n    lr_mult: 2\n    decay_mult: 0\n  }\n  convolution_param {\n    num_output: 32\n    pad: 0\n    kernel_size: 3\n    stride: 1\n    weight_filler {\n      type: \"xavier\"\n      std: 0.01\n    }\n    bias_filler {\n      type: \"constant\"\n      value: 0.2\n    }\n  }\n}\nlayer {\n  name: \"conv2_3x3_s1_bn\"\n  type: \"BatchNorm\"\n  bottom: \"conv2_3x3_s1\"\n  top: \"conv2_3x3_s1\"\n  batch_norm_param {\n    use_global_stats: false\n  }\n}\nlayer {\n  name: \"conv2_3x3_s1_scale\"\n  type: \"Scale\"\n  bottom: \"conv2_3x3_s1\"\n  top: \"conv2_3x3_s1\"\n  scale_param {\n    bias_term: true\n  }\n}\nlayer {\n  name: \"conv2_3x3_s1_relu\"\n  type: \"ReLU\"\n  bottom: \"conv2_3x3_s1\"\n  top: \"conv2_3x3_s1\"\n}\nlayer {\n  name: \"conv3_3x3_s1\"\n  type: \"Convolution\"\n  bottom: \"conv2_3x3_s1\"\n  top: \"conv3_3x3_s1\"\n  param {\n    lr_mult: 1\n    decay_mult: 1\n  }\n  param {\n    lr_mult: 2\n    decay_mult: 0\n  }\n  convolution_param {\n    num_output: 64\n    pad: 1\n    kernel_size: 3\n    stride: 1\n    weight_filler {\n      type: \"xavier\"\n      std: 0.01\n    }\n    bias_filler {\n      type: \"constant\"\n      value: 0.2\n    }\n  }\n}\nlayer {\n  name: \"conv3_3x3_s1_bn\"\n  type: \"BatchNorm\"\n  bottom: \"conv3_3x3_s1\"\n  top: \"conv3_3x3_s1\"\n  batch_norm_param {\n    use_global_stats: false\n  }\n}\nlayer {\n  name: \"conv3_3x3_s1_scale\"\n  type: \"Scale\"\n  bottom: \"conv3_3x3_s1\"\n  top: \"conv3_3x3_s1\"\n  scale_param {\n    bias_term: true\n  }\n}\nlayer {\n  name: \"conv3_3x3_s1_relu\"\n  type: \"ReLU\"\n  bottom: \"conv3_3x3_s1\"\n  top: \"conv3_3x3_s1\"\n}\nlayer {\n  name: \"inception_stem1_3x3_s2\"\n  type: \"Convolution\"\n  bottom: \"conv3_3x3_s1\"\n  top: \"inception_stem1_3x3_s2\"\n  param {\n    lr_mult: 1\n    decay_mult: 1\n  }\n  param {\n    lr_mult: 2\n    decay_mult: 0\n  }\n  convolution_param {\n    num_output: 96\n    pad: 0\n    kernel_size: 3\n    stride: 2\n    weight_filler {\n      type: \"xavier\"\n      std: 0.01\n    }\n    bias_filler {\n      type: \"constant\"\n      value: 0.2\n    }\n  }\n}\nlayer {\n  name: \"inception_stem1_3x3_s2_bn\"\n  type: \"BatchNorm\"\n  bottom: \"inception_stem1_3x3_s2\"\n  top: \"inception_stem1_3x3_s2\"\n  batch_norm_param {\n    use_global_stats: false\n  }\n}\nlayer {\n  name: \"inception_stem1_3x3_s2_scale\"\n  type: \"Scale\"\n  bottom: \"inception_stem1_3x3_s2\"\n  top: \"inception_stem1_3x3_s2\"\n  scale_param {\n    bias_term: true\n  }\n}\nlayer {\n  name: \"inception_stem1_3x3_s2_relu\"\n  type: \"ReLU\"\n  bottom: \"inception_stem1_3x3_s2\"\n  top: \"inception_stem1_3x3_s2\"\n}\nlayer {\n  name: \"inception_stem1_pool\"\n  type: \"Pooling\"\n  bottom: \"conv3_3x3_s1\"\n  top: \"inception_stem1_pool\"\n  pooling_param {\n    pool: MAX\n    kernel_size: 3\n    stride: 2\n  }\n}\nlayer {\n  name: \"inception_stem1\"\n  type: \"Concat\"\n  bottom: \"inception_stem1_3x3_s2\"\n  bottom: \"inception_stem1_pool\"\n  top: \"inception_stem1\"\n}\nlayer {\n  name: \"inception_stem2_3x3_reduce\"\n  type: \"Convolution\"\n  bottom: \"inception_stem1\"\n  top: \"inception_stem2_3x3_reduce\"\n  param {\n    lr_mult: 1\n    decay_mult: 1\n  }\n  param {\n    lr_mult: 2\n    decay_mult: 0\n  }\n  convolution_param {\n    num_output: 64\n    pad: 0\n    kernel_size: 1\n    stride: 1\n    weight_filler {\n      type: \"xavier\"\n      std: 0.01\n    }\n    bias_filler {\n      type: \"constant\"\n      value: 0.2\n    }\n  }\n}\nlayer {\n  name: \"inception_stem2_3x3_reduce_bn\"\n  type: \"BatchNorm\"\n  bottom: \"inception_stem2_3x3_reduce\"\n  top: \"inception_stem2_3x3_reduce\"\n  batch_norm_param {\n    use_global_stats: false\n  }\n}\nlayer {\n  name: \"inception_stem2_3x3_reduce_scale\"\n  type: \"Scale\"\n  bottom: \"inception_stem2_3x3_reduce\"\n  top: \"inception_stem2_3x3_reduce\"\n  scale_param {\n    bias_term: true\n  }\n}\nlayer {\n  name: \"inception_stem2_3x3_reduce_relu\"\n  type: \"ReLU\"\n  bottom: \"inception_stem2_3x3_reduce\"\n  top: \"inception_stem2_3x3_reduce\"\n}\nlayer {\n  name: \"inception_stem2_3x3\"\n  type: \"Convolution\"\n  bottom: \"inception_stem2_3x3_reduce\"\n  top: \"inception_stem2_3x3\"\n  param {\n    lr_mult: 1\n    decay_mult: 1\n  }\n  param {\n    lr_mult: 2\n    decay_mult: 0\n  }\n  convolution_param {\n    num_output: 96\n    pad: 0\n    kernel_size: 3\n    stride: 1\n    weight_filler {\n      type: \"xavier\"\n      std: 0.01\n    }\n    bias_filler {\n      type: \"constant\"\n      value: 0.2\n    }\n  }\n}\nlayer {\n  name: \"inception_stem2_3x3_bn\"\n  type: \"BatchNorm\"\n  bottom: \"inception_stem2_3x3\"\n  top: \"inception_stem2_3x3\"\n  batch_norm_param {\n    use_global_stats: false\n  }\n}\nlayer {\n  name: \"inception_stem2_3x3_scale\"\n  type: \"Scale\"\n  bottom: \"inception_stem2_3x3\"\n  top: \"inception_stem2_3x3\"\n  scale_param {\n    bias_term: true\n  }\n}\nlayer {\n  name: \"inception_stem2_3x3_relu\"\n  type: \"ReLU\"\n  bottom: \"inception_stem2_3x3\"\n  top: \"inception_stem2_3x3\"\n}\nlayer {\n  name: \"inception_stem2_7x1_reduce\"\n  type: \"Convolution\"\n  bottom: \"inception_stem1\"\n  top: \"inception_stem2_7x1_reduce\"\n  param {\n    lr_mult: 1\n    decay_mult: 1\n  }\n  param {\n    lr_mult: 2\n    decay_mult: 0\n  }\n  convolution_param {\n    num_output: 64\n    pad: 0\n    kernel_size: 1\n    stride: 1\n    weight_filler {\n      type: \"xavier\"\n      std: 0.01\n    }\n    bias_filler {\n      type: \"constant\"\n      value: 0.2\n    }\n  }\n}\nlayer {\n  name: \"inception_stem2_7x1_reduce_bn\"\n  type: \"BatchNorm\"\n  bottom: \"inception_stem2_7x1_reduce\"\n  top: \"inception_stem2_7x1_reduce\"\n  batch_norm_param {\n    use_global_stats: false\n  }\n}\nlayer {\n  name: \"inception_stem2_7x1_reduce_scale\"\n  type: \"Scale\"\n  bottom: \"inception_stem2_7x1_reduce\"\n  top: \"inception_stem2_7x1_reduce\"\n  scale_param {\n    bias_term: true\n  }\n}\nlayer {\n  name: \"inception_stem2_7x1_reduce_relu\"\n  type: \"ReLU\"\n  bottom: \"inception_stem2_7x1_reduce\"\n  top: \"inception_stem2_7x1_reduce\"\n}\nlayer {\n  name: \"inception_stem2_7x1\"\n  type: \"Convolution\"\n  bottom: \"inception_stem2_7x1_reduce\"\n  top: \"inception_stem2_7x1\"\n  param {\n    lr_mult: 1\n    decay_mult: 1\n  }\n  param {\n    lr_mult: 2\n    decay_mult: 0\n  }\n  convolution_param {\n    num_output: 64\n    stride: 1\n    weight_filler {\n      type: \"xavier\"\n      std: 0.01\n    }\n    bias_filler {\n      type: \"constant\"\n      value: 0.2\n    }\n    pad_h: 3\n    pad_w: 0\n    kernel_h: 7\n    kernel_w: 1\n  }\n}\nlayer {\n  name: \"inception_stem2_7x1_bn\"\n  type: \"BatchNorm\"\n  bottom: \"inception_stem2_7x1\"\n  top: \"inception_stem2_7x1\"\n  batch_norm_param {\n    use_global_stats: false\n  }\n}\nlayer {\n  name: \"inception_stem2_7x1_scale\"\n  type: \"Scale\"\n  bottom: \"inception_stem2_7x1\"\n  top: \"inception_stem2_7x1\"\n  scale_param {\n    bias_term: true\n  }\n}\nlayer {\n  name: \"inception_stem2_7x1_relu\"\n  type: \"ReLU\"\n  bottom: \"inception_stem2_7x1\"\n  top: \"inception_stem2_7x1\"\n}\nlayer {\n  name: \"inception_stem2_1x7\"\n  type: \"Convolution\"\n  bottom: \"inception_stem2_7x1\"\n  top: \"inception_stem2_1x7\"\n  param {\n    lr_mult: 1\n    decay_mult: 1\n  }\n  param {\n    lr_mult: 2\n    decay_mult: 0\n  }\n  convolution_param {\n    num_output: 64\n    stride: 1\n    weight_filler {\n      type: \"xavier\"\n      std: 0.01\n    }\n    bias_filler {\n      type: \"constant\"\n      value: 0.2\n    }\n    pad_h: 0\n    pad_w: 3\n    kernel_h: 1\n    kernel_w: 7\n  }\n}\nlayer {\n  name: \"inception_stem2_1x7_bn\"\n  type: \"BatchNorm\"\n  bottom: \"inception_stem2_1x7\"\n  top: \"inception_stem2_1x7\"\n  batch_norm_param {\n    use_global_stats: false\n  }\n}\nlayer {\n  name: \"inception_stem2_1x7_scale\"\n  type: \"Scale\"\n  bottom: \"inception_stem2_1x7\"\n  top: \"inception_stem2_1x7\"\n  scale_param {\n    bias_term: true\n  }\n}\nlayer {\n  name: \"inception_stem2_1x7_relu\"\n  type: \"ReLU\"\n  bottom: \"inception_stem2_1x7\"\n  top: \"inception_stem2_1x7\"\n}\nlayer {\n  name: \"inception_stem2_3x3_2\"\n  type: \"Convolution\"\n  bottom: \"inception_stem2_1x7\"\n  top: \"inception_stem2_3x3_2\"\n  param {\n    lr_mult: 1\n    decay_mult: 1\n  }\n  param {\n    lr_mult: 2\n    decay_mult: 0\n  }\n  convolution_param {\n    num_output: 96\n    pad: 0\n    kernel_size: 3\n    stride: 1\n    weight_filler {\n      type: \"xavier\"\n      std: 0.01\n    }\n    bias_filler {\n      type: \"constant\"\n      value: 0.2\n    }\n  }\n}\nlayer {\n  name: \"inception_stem2_3x3_2_bn\"\n  type: \"BatchNorm\"\n  bottom: \"inception_stem2_3x3_2\"\n  top: \"inception_stem2_3x3_2\"\n  batch_norm_param {\n    use_global_stats: false\n  }\n}\nlayer {\n  name: \"inception_stem2_3x3_2_scale\"\n  type: \"Scale\"\n  bottom: \"inception_stem2_3x3_2\"\n  top: \"inception_stem2_3x3_2\"\n  scale_param {\n    bias_term: true\n  }\n}\nlayer {\n  name: \"inception_stem2_3x3_2_relu\"\n  type: \"ReLU\"\n  bottom: \"inception_stem2_3x3_2\"\n  top: \"inception_stem2_3x3_2\"\n}\nlayer {\n  name: \"inception_stem2\"\n  type: \"Concat\"\n  bottom: \"inception_stem2_3x3\"\n  bottom: \"inception_stem2_3x3_2\"\n  top: \"inception_stem2\"\n}\nlayer {\n  name: \"inception_stem3_3x3_s2\"\n  type: \"Convolution\"\n  bottom: \"inception_stem2\"\n  top: \"inception_stem3_3x3_s2\"\n  param {\n    lr_mult: 1\n    decay_mult: 1\n  }\n  param {\n    lr_mult: 2\n    decay_mult: 0\n  }\n  convolution_param {\n    num_output: 192\n    pad: 0\n    kernel_size: 3\n    stride: 2\n    weight_filler {\n      type: \"xavier\"\n      std: 0.01\n    }\n    bias_filler {\n      type: \"constant\"\n      value: 0.2\n    }\n  }\n}\nlayer {\n  name: \"inception_stem3_3x3_s2_bn\"\n  type: \"BatchNorm\"\n  bottom: \"inception_stem3_3x3_s2\"\n  top: \"inception_stem3_3x3_s2\"\n  batch_norm_param {\n    use_global_stats: false\n  }\n}\nlayer {\n  name: \"inception_stem3_3x3_s2_scale\"\n  type: \"Scale\"\n  bottom: \"inception_stem3_3x3_s2\"\n  top: \"inception_stem3_3x3_s2\"\n  scale_param {\n    bias_term: true\n  }\n}\nlayer {\n  name: \"inception_stem3_3x3_s2_relu\"\n  type: \"ReLU\"\n  bottom: \"inception_stem3_3x3_s2\"\n  top: \"inception_stem3_3x3_s2\"\n}\nlayer {\n  name: \"inception_stem3_pool\"\n  type: \"Pooling\"\n  bottom: \"inception_stem2\"\n  top: \"inception_stem3_pool\"\n  pooling_param {\n    pool: MAX\n    kernel_size: 3\n    stride: 2\n  }\n}\nlayer {\n  name: \"inception_stem3\"\n  type: \"Concat\"\n  bottom: \"inception_stem3_3x3_s2\"\n  bottom: \"inception_stem3_pool\"\n  top: \"inception_stem3\"\n}\nlayer {\n  name: \"inception_resnet_v2_a1_1x1\"\n  type: \"Convolution\"\n  bottom: \"inception_stem3\"\n  top: \"inception_resnet_v2_a1_1x1\"\n  param {\n    lr_mult: 1\n    decay_mult: 1\n  }\n  param {\n    lr_mult: 2\n    decay_mult: 0\n  }\n  convolution_param {\n    num_output: 32\n    pad: 0\n    kernel_size: 1\n    stride: 1\n    weight_filler {\n      type: \"xavier\"\n      std: 0.01\n    }\n    bias_filler {\n      type: \"constant\"\n      value: 0.2\n    }\n  }\n}\nlayer {\n  name: \"inception_resnet_v2_a1_1x1_bn\"\n  type: \"BatchNorm\"\n  bottom: \"inception_resnet_v2_a1_1x1\"\n  top: \"inception_resnet_v2_a1_1x1\"\n  batch_norm_param {\n    use_global_stats: false\n  }\n}\nlayer {\n  name: \"inception_resnet_v2_a1_1x1_scale\"\n  type: \"Scale\"\n  bottom: \"inception_resnet_v2_a1_1x1\"\n  top: \"inception_resnet_v2_a1_1x1\"\n  scale_param {\n    bias_term: true\n  }\n}\nlayer {\n  name: \"inception_resnet_v2_a1_1x1_relu\"\n  type: \"ReLU\"\n  bottom: \"inception_resnet_v2_a1_1x1\"\n  top: \"inception_resnet_v2_a1_1x1\"\n}\nlayer {\n  name: \"inception_resnet_v2_a1_3x3_reduce\"\n  type: \"Convolution\"\n  bottom: \"inception_stem3\"\n  top: \"inception_resnet_v2_a1_3x3_reduce\"\n  param {\n    lr_mult: 1\n    decay_mult: 1\n  }\n  param {\n    lr_mult: 2\n    decay_mult: 0\n  }\n  convolution_param {\n    num_output: 32\n    pad: 0\n    kernel_size: 1\n    stride: 1\n    weight_filler {\n      type: \"xavier\"\n      std: 0.01\n    }\n    bias_filler {\n      type: \"constant\"\n      value: 0.2\n    }\n  }\n}\nlayer {\n  name: \"inception_resnet_v2_a1_3x3_reduce_bn\"\n  type: \"BatchNorm\"\n  bottom: \"inception_resnet_v2_a1_3x3_reduce\"\n  top: \"inception_resnet_v2_a1_3x3_reduce\"\n  batch_norm_param {\n    use_global_stats: false\n  }\n}\nlayer {\n  name: \"inception_resnet_v2_a1_3x3_reduce_scale\"\n  type: \"Scale\"\n  bottom: \"inception_resnet_v2_a1_3x3_reduce\"\n  top: \"inception_resnet_v2_a1_3x3_reduce\"\n  scale_param {\n    bias_term: true\n  }\n}\nlayer {\n  name: \"inception_resnet_v2_a1_3x3_reduce_relu\"\n  type: \"ReLU\"\n  bottom: \"inception_resnet_v2_a1_3x3_reduce\"\n  top: \"inception_resnet_v2_a1_3x3_reduce\"\n}\nlayer {\n  name: \"inception_resnet_v2_a1_3x3\"\n  type: \"Convolution\"\n  bottom: \"inception_resnet_v2_a1_3x3_reduce\"\n  top: \"inception_resnet_v2_a1_3x3\"\n  param {\n    lr_mult: 1\n    decay_mult: 1\n  }\n  param {\n    lr_mult: 2\n    decay_mult: 0\n  }\n  convolution_param {\n    num_output: 32\n    pad: 1\n    kernel_size: 3\n    stride: 1\n    weight_filler {\n      type: \"xavier\"\n      std: 0.01\n    }\n    bias_filler {\n      type: \"constant\"\n      value: 0.2\n    }\n  }\n}\nlayer {\n  name: \"inception_resnet_v2_a1_3x3_bn\"\n  type: \"BatchNorm\"\n  bottom: \"inception_resnet_v2_a1_3x3\"\n  top: \"inception_resnet_v2_a1_3x3\"\n  batch_norm_param {\n    use_global_stats: false\n  }\n}\nlayer {\n  name: \"inception_resnet_v2_a1_3x3_scale\"\n  type: \"Scale\"\n  bottom: \"inception_resnet_v2_a1_3x3\"\n  top: \"inception_resnet_v2_a1_3x3\"\n  scale_param {\n    bias_term: true\n  }\n}\nlayer {\n  name: \"inception_resnet_v2_a1_3x3_relu\"\n  type: \"ReLU\"\n  bottom: \"inception_resnet_v2_a1_3x3\"\n  top: \"inception_resnet_v2_a1_3x3\"\n}\nlayer {\n  name: \"inception_resnet_v2_a1_3x3_2_reduce\"\n  type: \"Convolution\"\n  bottom: \"inception_stem3\"\n  top: \"inception_resnet_v2_a1_3x3_2_reduce\"\n  param {\n    lr_mult: 1\n    decay_mult: 1\n  }\n  param {\n    lr_mult: 2\n    decay_mult: 0\n  }\n  convolution_param {\n    num_output: 32\n    pad: 0\n    kernel_size: 1\n    stride: 1\n    weight_filler {\n      type: \"xavier\"\n      std: 0.01\n    }\n    bias_filler {\n      type: \"constant\"\n      value: 0.2\n    }\n  }\n}\nlayer {\n  name: \"inception_resnet_v2_a1_3x3_2_reduce_bn\"\n  type: \"BatchNorm\"\n  bottom: \"inception_resnet_v2_a1_3x3_2_reduce\"\n  top: \"inception_resnet_v2_a1_3x3_2_reduce\"\n  batch_norm_param {\n    use_global_stats: false\n  }\n}\nlayer {\n  name: \"inception_resnet_v2_a1_3x3_2_reduce_scale\"\n  type: \"Scale\"\n  bottom: \"inception_resnet_v2_a1_3x3_2_reduce\"\n  top: \"inception_resnet_v2_a1_3x3_2_reduce\"\n  scale_param {\n    bias_term: true\n  }\n}\nlayer {\n  name: \"inception_resnet_v2_a1_3x3_2_reduce_relu\"\n  type: \"ReLU\"\n  bottom: \"inception_resnet_v2_a1_3x3_2_reduce\"\n  top: \"inception_resnet_v2_a1_3x3_2_reduce\"\n}\nlayer {\n  name: \"inception_resnet_v2_a1_3x3_2\"\n  type: \"Convolution\"\n  bottom: \"inception_resnet_v2_a1_3x3_2_reduce\"\n  top: \"inception_resnet_v2_a1_3x3_2\"\n  param {\n    lr_mult: 1\n    decay_mult: 1\n  }\n  param {\n    lr_mult: 2\n    decay_mult: 0\n  }\n  convolution_param {\n    num_output: 48\n    pad: 1\n    kernel_size: 3\n    stride: 1\n    weight_filler {\n      type: \"xavier\"\n      std: 0.01\n    }\n    bias_filler {\n      type: \"constant\"\n      value: 0.2\n    }\n  }\n}\nlayer {\n  name: \"inception_resnet_v2_a1_3x3_2_bn\"\n  type: \"BatchNorm\"\n  bottom: \"inception_resnet_v2_a1_3x3_2\"\n  top: \"inception_resnet_v2_a1_3x3_2\"\n  batch_norm_param {\n    use_global_stats: false\n  }\n}\nlayer {\n  name: \"inception_resnet_v2_a1_3x3_2_scale\"\n  type: \"Scale\"\n  bottom: \"inception_resnet_v2_a1_3x3_2\"\n  top: \"inception_resnet_v2_a1_3x3_2\"\n  scale_param {\n    bias_term: true\n  }\n}\nlayer {\n  name: \"inception_resnet_v2_a1_3x3_2_relu\"\n  type: \"ReLU\"\n  bottom: \"inception_resnet_v2_a1_3x3_2\"\n  top: \"inception_resnet_v2_a1_3x3_2\"\n}\nlayer {\n  name: \"inception_resnet_v2_a1_3x3_3\"\n  type: \"Convolution\"\n  bottom: \"inception_resnet_v2_a1_3x3_2\"\n  top: \"inception_resnet_v2_a1_3x3_3\"\n  param {\n    lr_mult: 1\n    decay_mult: 1\n  }\n  param {\n    lr_mult: 2\n    decay_mult: 0\n  }\n  convolution_param {\n    num_output: 64\n    pad: 1\n    kernel_size: 3\n    stride: 1\n    weight_filler {\n      type: \"xavier\"\n      std: 0.01\n    }\n    bias_filler {\n      type: \"constant\"\n      value: 0.2\n    }\n  }\n}\nlayer {\n  name: \"inception_resnet_v2_a1_3x3_3_bn\"\n  type: \"BatchNorm\"\n  bottom: \"inception_resnet_v2_a1_3x3_3\"\n  top: \"inception_resnet_v2_a1_3x3_3\"\n  batch_norm_param {\n    use_global_stats: false\n  }\n}\nlayer {\n  name: \"inception_resnet_v2_a1_3x3_3_scale\"\n  type: \"Scale\"\n  bottom: \"inception_resnet_v2_a1_3x3_3\"\n  top: \"inception_resnet_v2_a1_3x3_3\"\n  scale_param {\n    bias_term: true\n  }\n}\nlayer {\n  name: \"inception_resnet_v2_a1_3x3_3_relu\"\n  type: \"ReLU\"\n  bottom: \"inception_resnet_v2_a1_3x3_3\"\n  top: \"inception_resnet_v2_a1_3x3_3\"\n}\nlayer {\n  name: \"inception_resnet_v2_a1_concat\"\n  type: \"Concat\"\n  bottom: \"inception_resnet_v2_a1_1x1\"\n  bottom: \"inception_resnet_v2_a1_3x3\"\n  bottom: \"inception_resnet_v2_a1_3x3_3\"\n  top: \"inception_resnet_v2_a1_concat\"\n}\nlayer {\n  name: \"inception_resnet_v2_a1_1x1_2\"\n  type: \"Convolution\"\n  bottom: \"inception_resnet_v2_a1_concat\"\n  top: \"inception_resnet_v2_a1_1x1_2\"\n  param {\n    lr_mult: 1\n    decay_mult: 1\n  }\n  param {\n    lr_mult: 2\n    decay_mult: 0\n  }\n  convolution_param {\n    num_output: 384\n    pad: 0\n    kernel_size: 1\n    stride: 1\n    weight_filler {\n      type: \"xavier\"\n      std: 0.01\n    }\n    bias_filler {\n      type: \"constant\"\n      value: 0.2\n    }\n  }\n}\nlayer {\n  name: \"inception_resnet_v2_a1_1x1_2_bn\"\n  type: \"BatchNorm\"\n  bottom: \"inception_resnet_v2_a1_1x1_2\"\n  top: \"inception_resnet_v2_a1_1x1_2\"\n  batch_norm_param {\n    use_global_stats: false\n  }\n}\nlayer {\n  name: \"inception_resnet_v2_a1_1x1_2_scale\"\n  type: \"Scale\"\n  bottom: \"inception_resnet_v2_a1_1x1_2\"\n  top: \"inception_resnet_v2_a1_1x1_2\"\n  scale_param {\n    bias_term: true\n  }\n}\nlayer {\n  name: \"inception_resnet_v2_a1_residual_eltwise\"\n  type: \"Eltwise\"\n  bottom: \"inception_stem3\"\n  bottom: \"inception_resnet_v2_a1_1x1_2\"\n  top: \"inception_resnet_v2_a1_residual_eltwise\"\n  eltwise_param {\n    operation: SUM\n  }\n}\nlayer {\n  name: \"inception_resnet_v2_a2_1x1\"\n  type: \"Convolution\"\n  bottom: \"inception_resnet_v2_a1_residual_eltwise\"\n  top: \"inception_resnet_v2_a2_1x1\"\n  param {\n    lr_mult: 1\n    decay_mult: 1\n  }\n  param {\n    lr_mult: 2\n    decay_mult: 0\n  }\n  convolution_param {\n    num_output: 32\n    pad: 0\n    kernel_size: 1\n    stride: 1\n    weight_filler {\n      type: \"xavier\"\n      std: 0.01\n    }\n    bias_filler {\n      type: \"constant\"\n      value: 0.2\n    }\n  }\n}\nlayer {\n  name: \"inception_resnet_v2_a2_1x1_bn\"\n  type: \"BatchNorm\"\n  bottom: \"inception_resnet_v2_a2_1x1\"\n  top: \"inception_resnet_v2_a2_1x1\"\n  batch_norm_param {\n    use_global_stats: false\n  }\n}\nlayer {\n  name: \"inception_resnet_v2_a2_1x1_scale\"\n  type: \"Scale\"\n  bottom: \"inception_resnet_v2_a2_1x1\"\n  top: \"inception_resnet_v2_a2_1x1\"\n  scale_param {\n    bias_term: true\n  }\n}\nlayer {\n  name: \"inception_resnet_v2_a2_1x1_relu\"\n  type: \"ReLU\"\n  bottom: \"inception_resnet_v2_a2_1x1\"\n  top: \"inception_resnet_v2_a2_1x1\"\n}\nlayer {\n  name: \"inception_resnet_v2_a2_3x3_reduce\"\n  type: \"Convolution\"\n  bottom: \"inception_resnet_v2_a1_residual_eltwise\"\n  top: \"inception_resnet_v2_a2_3x3_reduce\"\n  param {\n    lr_mult: 1\n    decay_mult: 1\n  }\n  param {\n    lr_mult: 2\n    decay_mult: 0\n  }\n  convolution_param {\n    num_output: 32\n    pad: 0\n    kernel_size: 1\n    stride: 1\n    weight_filler {\n      type: \"xavier\"\n      std: 0.01\n    }\n    bias_filler {\n      type: \"constant\"\n      value: 0.2\n    }\n  }\n}\nlayer {\n  name: \"inception_resnet_v2_a2_3x3_reduce_bn\"\n  type: \"BatchNorm\"\n  bottom: \"inception_resnet_v2_a2_3x3_reduce\"\n  top: \"inception_resnet_v2_a2_3x3_reduce\"\n  batch_norm_param {\n    use_global_stats: false\n  }\n}\nlayer {\n  name: \"inception_resnet_v2_a2_3x3_reduce_scale\"\n  type: \"Scale\"\n  bottom: \"inception_resnet_v2_a2_3x3_reduce\"\n  top: \"inception_resnet_v2_a2_3x3_reduce\"\n  scale_param {\n    bias_term: true\n  }\n}\nlayer {\n  name: \"inception_resnet_v2_a2_3x3_reduce_relu\"\n  type: \"ReLU\"\n  bottom: \"inception_resnet_v2_a2_3x3_reduce\"\n  top: \"inception_resnet_v2_a2_3x3_reduce\"\n}\nlayer {\n  name: \"inception_resnet_v2_a2_3x3\"\n  type: \"Convolution\"\n  bottom: \"inception_resnet_v2_a2_3x3_reduce\"\n  top: \"inception_resnet_v2_a2_3x3\"\n  param {\n    lr_mult: 1\n    decay_mult: 1\n  }\n  param {\n    lr_mult: 2\n    decay_mult: 0\n  }\n  convolution_param {\n    num_output: 32\n    pad: 1\n    kernel_size: 3\n    stride: 1\n    weight_filler {\n      type: \"xavier\"\n      std: 0.01\n    }\n    bias_filler {\n      type: \"constant\"\n      value: 0.2\n    }\n  }\n}\nlayer {\n  name: \"inception_resnet_v2_a2_3x3_bn\"\n  type: \"BatchNorm\"\n  bottom: \"inception_resnet_v2_a2_3x3\"\n  top: \"inception_resnet_v2_a2_3x3\"\n  batch_norm_param {\n    use_global_stats: false\n  }\n}\nlayer {\n  name: \"inception_resnet_v2_a2_3x3_scale\"\n  type: \"Scale\"\n  bottom: \"inception_resnet_v2_a2_3x3\"\n  top: \"inception_resnet_v2_a2_3x3\"\n  scale_param {\n    bias_term: true\n  }\n}\nlayer {\n  name: \"inception_resnet_v2_a2_3x3_relu\"\n  type: \"ReLU\"\n  bottom: \"inception_resnet_v2_a2_3x3\"\n  top: \"inception_resnet_v2_a2_3x3\"\n}\nlayer {\n  name: \"inception_resnet_v2_a2_3x3_2_reduce\"\n  type: \"Convolution\"\n  bottom: \"inception_resnet_v2_a1_residual_eltwise\"\n  top: \"inception_resnet_v2_a2_3x3_2_reduce\"\n  param {\n    lr_mult: 1\n    decay_mult: 1\n  }\n  param {\n    lr_mult: 2\n    decay_mult: 0\n  }\n  convolution_param {\n    num_output: 32\n    pad: 0\n    kernel_size: 1\n    stride: 1\n    weight_filler {\n      type: \"xavier\"\n      std: 0.01\n    }\n    bias_filler {\n      type: \"constant\"\n      value: 0.2\n    }\n  }\n}\nlayer {\n  name: \"inception_resnet_v2_a2_3x3_2_reduce_bn\"\n  type: \"BatchNorm\"\n  bottom: \"inception_resnet_v2_a2_3x3_2_reduce\"\n  top: \"inception_resnet_v2_a2_3x3_2_reduce\"\n  batch_norm_param {\n    use_global_stats: false\n  }\n}\nlayer {\n  name: \"inception_resnet_v2_a2_3x3_2_reduce_scale\"\n  type: \"Scale\"\n  bottom: \"inception_resnet_v2_a2_3x3_2_reduce\"\n  top: \"inception_resnet_v2_a2_3x3_2_reduce\"\n  scale_param {\n    bias_term: true\n  }\n}\nlayer {\n  name: \"inception_resnet_v2_a2_3x3_2_reduce_relu\"\n  type: \"ReLU\"\n  bottom: \"inception_resnet_v2_a2_3x3_2_reduce\"\n  top: \"inception_resnet_v2_a2_3x3_2_reduce\"\n}\nlayer {\n  name: \"inception_resnet_v2_a2_3x3_2\"\n  type: \"Convolution\"\n  bottom: \"inception_resnet_v2_a2_3x3_2_reduce\"\n  top: \"inception_resnet_v2_a2_3x3_2\"\n  param {\n    lr_mult: 1\n    decay_mult: 1\n  }\n  param {\n    lr_mult: 2\n    decay_mult: 0\n  }\n  convolution_param {\n    num_output: 48\n    pad: 1\n    kernel_size: 3\n    stride: 1\n    weight_filler {\n      type: \"xavier\"\n      std: 0.01\n    }\n    bias_filler {\n      type: \"constant\"\n      value: 0.2\n    }\n  }\n}\nlayer {\n  name: \"inception_resnet_v2_a2_3x3_2_bn\"\n  type: \"BatchNorm\"\n  bottom: \"inception_resnet_v2_a2_3x3_2\"\n  top: \"inception_resnet_v2_a2_3x3_2\"\n  batch_norm_param {\n    use_global_stats: false\n  }\n}\nlayer {\n  name: \"inception_resnet_v2_a2_3x3_2_scale\"\n  type: \"Scale\"\n  bottom: \"inception_resnet_v2_a2_3x3_2\"\n  top: \"inception_resnet_v2_a2_3x3_2\"\n  scale_param {\n    bias_term: true\n  }\n}\nlayer {\n  name: \"inception_resnet_v2_a2_3x3_2_relu\"\n  type: \"ReLU\"\n  bottom: \"inception_resnet_v2_a2_3x3_2\"\n  top: \"inception_resnet_v2_a2_3x3_2\"\n}\nlayer {\n  name: \"inception_resnet_v2_a2_3x3_3\"\n  type: \"Convolution\"\n  bottom: \"inception_resnet_v2_a2_3x3_2\"\n  top: \"inception_resnet_v2_a2_3x3_3\"\n  param {\n    lr_mult: 1\n    decay_mult: 1\n  }\n  param {\n    lr_mult: 2\n    decay_mult: 0\n  }\n  convolution_param {\n    num_output: 64\n    pad: 1\n    kernel_size: 3\n    stride: 1\n    weight_filler {\n      type: \"xavier\"\n      std: 0.01\n    }\n    bias_filler {\n      type: \"constant\"\n      value: 0.2\n    }\n  }\n}\nlayer {\n  name: \"inception_resnet_v2_a2_3x3_3_bn\"\n  type: \"BatchNorm\"\n  bottom: \"inception_resnet_v2_a2_3x3_3\"\n  top: \"inception_resnet_v2_a2_3x3_3\"\n  batch_norm_param {\n    use_global_stats: false\n  }\n}\nlayer {\n  name: \"inception_resnet_v2_a2_3x3_3_scale\"\n  type: \"Scale\"\n  bottom: \"inception_resnet_v2_a2_3x3_3\"\n  top: \"inception_resnet_v2_a2_3x3_3\"\n  scale_param {\n    bias_term: true\n  }\n}\nlayer {\n  name: \"inception_resnet_v2_a2_3x3_3_relu\"\n  type: \"ReLU\"\n  bottom: \"inception_resnet_v2_a2_3x3_3\"\n  top: \"inception_resnet_v2_a2_3x3_3\"\n}\nlayer {\n  name: \"inception_resnet_v2_a2_concat\"\n  type: \"Concat\"\n  bottom: \"inception_resnet_v2_a2_1x1\"\n  bottom: \"inception_resnet_v2_a2_3x3\"\n  bottom: \"inception_resnet_v2_a2_3x3_3\"\n  top: \"inception_resnet_v2_a2_concat\"\n}\nlayer {\n  name: \"inception_resnet_v2_a2_1x1_2\"\n  type: \"Convolution\"\n  bottom: \"inception_resnet_v2_a2_concat\"\n  top: \"inception_resnet_v2_a2_1x1_2\"\n  param {\n    lr_mult: 1\n    decay_mult: 1\n  }\n  param {\n    lr_mult: 2\n    decay_mult: 0\n  }\n  convolution_param {\n    num_output: 384\n    pad: 0\n    kernel_size: 1\n    stride: 1\n    weight_filler {\n      type: \"xavier\"\n      std: 0.01\n    }\n    bias_filler {\n      type: \"constant\"\n      value: 0.2\n    }\n  }\n}\nlayer {\n  name: \"inception_resnet_v2_a2_1x1_2_bn\"\n  type: \"BatchNorm\"\n  bottom: \"inception_resnet_v2_a2_1x1_2\"\n  top: \"inception_resnet_v2_a2_1x1_2\"\n  batch_norm_param {\n    use_global_stats: false\n  }\n}\nlayer {\n  name: \"inception_resnet_v2_a2_1x1_2_scale\"\n  type: \"Scale\"\n  bottom: \"inception_resnet_v2_a2_1x1_2\"\n  top: \"inception_resnet_v2_a2_1x1_2\"\n  scale_param {\n    bias_term: true\n  }\n}\nlayer {\n  name: \"inception_resnet_v2_a2_residual_eltwise\"\n  type: \"Eltwise\"\n  bottom: \"inception_resnet_v2_a1_residual_eltwise\"\n  bottom: \"inception_resnet_v2_a2_1x1_2\"\n  top: \"inception_resnet_v2_a2_residual_eltwise\"\n  eltwise_param {\n    operation: SUM\n  }\n}\nlayer {\n  name: \"inception_resnet_v2_a3_1x1\"\n  type: \"Convolution\"\n  bottom: \"inception_resnet_v2_a2_residual_eltwise\"\n  top: \"inception_resnet_v2_a3_1x1\"\n  param {\n    lr_mult: 1\n    decay_mult: 1\n  }\n  param {\n    lr_mult: 2\n    decay_mult: 0\n  }\n  convolution_param {\n    num_output: 32\n    pad: 0\n    kernel_size: 1\n    stride: 1\n    weight_filler {\n      type: \"xavier\"\n      std: 0.01\n    }\n    bias_filler {\n      type: \"constant\"\n      value: 0.2\n    }\n  }\n}\nlayer {\n  name: \"inception_resnet_v2_a3_1x1_bn\"\n  type: \"BatchNorm\"\n  bottom: \"inception_resnet_v2_a3_1x1\"\n  top: \"inception_resnet_v2_a3_1x1\"\n  batch_norm_param {\n    use_global_stats: false\n  }\n}\nlayer {\n  name: \"inception_resnet_v2_a3_1x1_scale\"\n  type: \"Scale\"\n  bottom: \"inception_resnet_v2_a3_1x1\"\n  top: \"inception_resnet_v2_a3_1x1\"\n  scale_param {\n    bias_term: true\n  }\n}\nlayer {\n  name: \"inception_resnet_v2_a3_1x1_relu\"\n  type: \"ReLU\"\n  bottom: \"inception_resnet_v2_a3_1x1\"\n  top: \"inception_resnet_v2_a3_1x1\"\n}\nlayer {\n  name: \"inception_resnet_v2_a3_3x3_reduce\"\n  type: \"Convolution\"\n  bottom: \"inception_resnet_v2_a2_residual_eltwise\"\n  top: \"inception_resnet_v2_a3_3x3_reduce\"\n  param {\n    lr_mult: 1\n    decay_mult: 1\n  }\n  param {\n    lr_mult: 2\n    decay_mult: 0\n  }\n  convolution_param {\n    num_output: 32\n    pad: 0\n    kernel_size: 1\n    stride: 1\n    weight_filler {\n      type: \"xavier\"\n      std: 0.01\n    }\n    bias_filler {\n      type: \"constant\"\n      value: 0.2\n    }\n  }\n}\nlayer {\n  name: \"inception_resnet_v2_a3_3x3_reduce_bn\"\n  type: \"BatchNorm\"\n  bottom: \"inception_resnet_v2_a3_3x3_reduce\"\n  top: \"inception_resnet_v2_a3_3x3_reduce\"\n  batch_norm_param {\n    use_global_stats: false\n  }\n}\nlayer {\n  name: \"inception_resnet_v2_a3_3x3_reduce_scale\"\n  type: \"Scale\"\n  bottom: \"inception_resnet_v2_a3_3x3_reduce\"\n  top: \"inception_resnet_v2_a3_3x3_reduce\"\n  scale_param {\n    bias_term: true\n  }\n}\nlayer {\n  name: \"inception_resnet_v2_a3_3x3_reduce_relu\"\n  type: \"ReLU\"\n  bottom: \"inception_resnet_v2_a3_3x3_reduce\"\n  top: \"inception_resnet_v2_a3_3x3_reduce\"\n}\nlayer {\n  name: \"inception_resnet_v2_a3_3x3\"\n  type: \"Convolution\"\n  bottom: \"inception_resnet_v2_a3_3x3_reduce\"\n  top: \"inception_resnet_v2_a3_3x3\"\n  param {\n    lr_mult: 1\n    decay_mult: 1\n  }\n  param {\n    lr_mult: 2\n    decay_mult: 0\n  }\n  convolution_param {\n    num_output: 32\n    pad: 1\n    kernel_size: 3\n    stride: 1\n    weight_filler {\n      type: \"xavier\"\n      std: 0.01\n    }\n    bias_filler {\n      type: \"constant\"\n      value: 0.2\n    }\n  }\n}\nlayer {\n  name: \"inception_resnet_v2_a3_3x3_bn\"\n  type: \"BatchNorm\"\n  bottom: \"inception_resnet_v2_a3_3x3\"\n  top: \"inception_resnet_v2_a3_3x3\"\n  batch_norm_param {\n    use_global_stats: false\n  }\n}\nlayer {\n  name: \"inception_resnet_v2_a3_3x3_scale\"\n  type: \"Scale\"\n  bottom: \"inception_resnet_v2_a3_3x3\"\n  top: \"inception_resnet_v2_a3_3x3\"\n  scale_param {\n    bias_term: true\n  }\n}\nlayer {\n  name: \"inception_resnet_v2_a3_3x3_relu\"\n  type: \"ReLU\"\n  bottom: \"inception_resnet_v2_a3_3x3\"\n  top: \"inception_resnet_v2_a3_3x3\"\n}\nlayer {\n  name: \"inception_resnet_v2_a3_3x3_2_reduce\"\n  type: \"Convolution\"\n  bottom: \"inception_resnet_v2_a2_residual_eltwise\"\n  top: \"inception_resnet_v2_a3_3x3_2_reduce\"\n  param {\n    lr_mult: 1\n    decay_mult: 1\n  }\n  param {\n    lr_mult: 2\n    decay_mult: 0\n  }\n  convolution_param {\n    num_output: 32\n    pad: 0\n    kernel_size: 1\n    stride: 1\n    weight_filler {\n      type: \"xavier\"\n      std: 0.01\n    }\n    bias_filler {\n      type: \"constant\"\n      value: 0.2\n    }\n  }\n}\nlayer {\n  name: \"inception_resnet_v2_a3_3x3_2_reduce_bn\"\n  type: \"BatchNorm\"\n  bottom: \"inception_resnet_v2_a3_3x3_2_reduce\"\n  top: \"inception_resnet_v2_a3_3x3_2_reduce\"\n  batch_norm_param {\n    use_global_stats: false\n  }\n}\nlayer {\n  name: \"inception_resnet_v2_a3_3x3_2_reduce_scale\"\n  type: \"Scale\"\n  bottom: \"inception_resnet_v2_a3_3x3_2_reduce\"\n  top: \"inception_resnet_v2_a3_3x3_2_reduce\"\n  scale_param {\n    bias_term: true\n  }\n}\nlayer {\n  name: \"inception_resnet_v2_a3_3x3_2_reduce_relu\"\n  type: \"ReLU\"\n  bottom: \"inception_resnet_v2_a3_3x3_2_reduce\"\n  top: \"inception_resnet_v2_a3_3x3_2_reduce\"\n}\nlayer {\n  name: \"inception_resnet_v2_a3_3x3_2\"\n  type: \"Convolution\"\n  bottom: \"inception_resnet_v2_a3_3x3_2_reduce\"\n  top: \"inception_resnet_v2_a3_3x3_2\"\n  param {\n    lr_mult: 1\n    decay_mult: 1\n  }\n  param {\n    lr_mult: 2\n    decay_mult: 0\n  }\n  convolution_param {\n    num_output: 48\n    pad: 1\n    kernel_size: 3\n    stride: 1\n    weight_filler {\n      type: \"xavier\"\n      std: 0.01\n    }\n    bias_filler {\n      type: \"constant\"\n      value: 0.2\n    }\n  }\n}\nlayer {\n  name: \"inception_resnet_v2_a3_3x3_2_bn\"\n  type: \"BatchNorm\"\n  bottom: \"inception_resnet_v2_a3_3x3_2\"\n  top: \"inception_resnet_v2_a3_3x3_2\"\n  batch_norm_param {\n    use_global_stats: false\n  }\n}\nlayer {\n  name: \"inception_resnet_v2_a3_3x3_2_scale\"\n  type: \"Scale\"\n  bottom: \"inception_resnet_v2_a3_3x3_2\"\n  top: \"inception_resnet_v2_a3_3x3_2\"\n  scale_param {\n    bias_term: true\n  }\n}\nlayer {\n  name: \"inception_resnet_v2_a3_3x3_2_relu\"\n  type: \"ReLU\"\n  bottom: \"inception_resnet_v2_a3_3x3_2\"\n  top: \"inception_resnet_v2_a3_3x3_2\"\n}\nlayer {\n  name: \"inception_resnet_v2_a3_3x3_3\"\n  type: \"Convolution\"\n  bottom: \"inception_resnet_v2_a3_3x3_2\"\n  top: \"inception_resnet_v2_a3_3x3_3\"\n  param {\n    lr_mult: 1\n    decay_mult: 1\n  }\n  param {\n    lr_mult: 2\n    decay_mult: 0\n  }\n  convolution_param {\n    num_output: 64\n    pad: 1\n    kernel_size: 3\n    stride: 1\n    weight_filler {\n      type: \"xavier\"\n      std: 0.01\n    }\n    bias_filler {\n      type: \"constant\"\n      value: 0.2\n    }\n  }\n}\nlayer {\n  name: \"inception_resnet_v2_a3_3x3_3_bn\"\n  type: \"BatchNorm\"\n  bottom: \"inception_resnet_v2_a3_3x3_3\"\n  top: \"inception_resnet_v2_a3_3x3_3\"\n  batch_norm_param {\n    use_global_stats: false\n  }\n}\nlayer {\n  name: \"inception_resnet_v2_a3_3x3_3_scale\"\n  type: \"Scale\"\n  bottom: \"inception_resnet_v2_a3_3x3_3\"\n  top: \"inception_resnet_v2_a3_3x3_3\"\n  scale_param {\n    bias_term: true\n  }\n}\nlayer {\n  name: \"inception_resnet_v2_a3_3x3_3_relu\"\n  type: \"ReLU\"\n  bottom: \"inception_resnet_v2_a3_3x3_3\"\n  top: \"inception_resnet_v2_a3_3x3_3\"\n}\nlayer {\n  name: \"inception_resnet_v2_a3_concat\"\n  type: \"Concat\"\n  bottom: \"inception_resnet_v2_a3_1x1\"\n  bottom: \"inception_resnet_v2_a3_3x3\"\n  bottom: \"inception_resnet_v2_a3_3x3_3\"\n  top: \"inception_resnet_v2_a3_concat\"\n}\nlayer {\n  name: \"inception_resnet_v2_a3_1x1_2\"\n  type: \"Convolution\"\n  bottom: \"inception_resnet_v2_a3_concat\"\n  top: \"inception_resnet_v2_a3_1x1_2\"\n  param {\n    lr_mult: 1\n    decay_mult: 1\n  }\n  param {\n    lr_mult: 2\n    decay_mult: 0\n  }\n  convolution_param {\n    num_output: 384\n    pad: 0\n    kernel_size: 1\n    stride: 1\n    weight_filler {\n      type: \"xavier\"\n      std: 0.01\n    }\n    bias_filler {\n      type: \"constant\"\n      value: 0.2\n    }\n  }\n}\nlayer {\n  name: \"inception_resnet_v2_a3_1x1_2_bn\"\n  type: \"BatchNorm\"\n  bottom: \"inception_resnet_v2_a3_1x1_2\"\n  top: \"inception_resnet_v2_a3_1x1_2\"\n  batch_norm_param {\n    use_global_stats: false\n  }\n}\nlayer {\n  name: \"inception_resnet_v2_a3_1x1_2_scale\"\n  type: \"Scale\"\n  bottom: \"inception_resnet_v2_a3_1x1_2\"\n  top: \"inception_resnet_v2_a3_1x1_2\"\n  scale_param {\n    bias_term: true\n  }\n}\nlayer {\n  name: \"inception_resnet_v2_a3_residual_eltwise\"\n  type: \"Eltwise\"\n  bottom: \"inception_resnet_v2_a2_residual_eltwise\"\n  bottom: \"inception_resnet_v2_a3_1x1_2\"\n  top: \"inception_resnet_v2_a3_residual_eltwise\"\n  eltwise_param {\n    operation: SUM\n  }\n}\nlayer {\n  name: \"inception_resnet_v2_a4_1x1\"\n  type: \"Convolution\"\n  bottom: \"inception_resnet_v2_a3_residual_eltwise\"\n  top: \"inception_resnet_v2_a4_1x1\"\n  param {\n    lr_mult: 1\n    decay_mult: 1\n  }\n  param {\n    lr_mult: 2\n    decay_mult: 0\n  }\n  convolution_param {\n    num_output: 32\n    pad: 0\n    kernel_size: 1\n    stride: 1\n    weight_filler {\n      type: \"xavier\"\n      std: 0.01\n    }\n    bias_filler {\n      type: \"constant\"\n      value: 0.2\n    }\n  }\n}\nlayer {\n  name: \"inception_resnet_v2_a4_1x1_bn\"\n  type: \"BatchNorm\"\n  bottom: \"inception_resnet_v2_a4_1x1\"\n  top: \"inception_resnet_v2_a4_1x1\"\n  batch_norm_param {\n    use_global_stats: false\n  }\n}\nlayer {\n  name: \"inception_resnet_v2_a4_1x1_scale\"\n  type: \"Scale\"\n  bottom: \"inception_resnet_v2_a4_1x1\"\n  top: \"inception_resnet_v2_a4_1x1\"\n  scale_param {\n    bias_term: true\n  }\n}\nlayer {\n  name: \"inception_resnet_v2_a4_1x1_relu\"\n  type: \"ReLU\"\n  bottom: \"inception_resnet_v2_a4_1x1\"\n  top: \"inception_resnet_v2_a4_1x1\"\n}\nlayer {\n  name: \"inception_resnet_v2_a4_3x3_reduce\"\n  type: \"Convolution\"\n  bottom: \"inception_resnet_v2_a3_residual_eltwise\"\n  top: \"inception_resnet_v2_a4_3x3_reduce\"\n  param {\n    lr_mult: 1\n    decay_mult: 1\n  }\n  param {\n    lr_mult: 2\n    decay_mult: 0\n  }\n  convolution_param {\n    num_output: 32\n    pad: 0\n    kernel_size: 1\n    stride: 1\n    weight_filler {\n      type: \"xavier\"\n      std: 0.01\n    }\n    bias_filler {\n      type: \"constant\"\n      value: 0.2\n    }\n  }\n}\nlayer {\n  name: \"inception_resnet_v2_a4_3x3_reduce_bn\"\n  type: \"BatchNorm\"\n  bottom: \"inception_resnet_v2_a4_3x3_reduce\"\n  top: \"inception_resnet_v2_a4_3x3_reduce\"\n  batch_norm_param {\n    use_global_stats: false\n  }\n}\nlayer {\n  name: \"inception_resnet_v2_a4_3x3_reduce_scale\"\n  type: \"Scale\"\n  bottom: \"inception_resnet_v2_a4_3x3_reduce\"\n  top: \"inception_resnet_v2_a4_3x3_reduce\"\n  scale_param {\n    bias_term: true\n  }\n}\nlayer {\n  name: \"inception_resnet_v2_a4_3x3_reduce_relu\"\n  type: \"ReLU\"\n  bottom: \"inception_resnet_v2_a4_3x3_reduce\"\n  top: \"inception_resnet_v2_a4_3x3_reduce\"\n}\nlayer {\n  name: \"inception_resnet_v2_a4_3x3\"\n  type: \"Convolution\"\n  bottom: \"inception_resnet_v2_a4_3x3_reduce\"\n  top: \"inception_resnet_v2_a4_3x3\"\n  param {\n    lr_mult: 1\n    decay_mult: 1\n  }\n  param {\n    lr_mult: 2\n    decay_mult: 0\n  }\n  convolution_param {\n    num_output: 32\n    pad: 1\n    kernel_size: 3\n    stride: 1\n    weight_filler {\n      type: \"xavier\"\n      std: 0.01\n    }\n    bias_filler {\n      type: \"constant\"\n      value: 0.2\n    }\n  }\n}\nlayer {\n  name: \"inception_resnet_v2_a4_3x3_bn\"\n  type: \"BatchNorm\"\n  bottom: \"inception_resnet_v2_a4_3x3\"\n  top: \"inception_resnet_v2_a4_3x3\"\n  batch_norm_param {\n    use_global_stats: false\n  }\n}\nlayer {\n  name: \"inception_resnet_v2_a4_3x3_scale\"\n  type: \"Scale\"\n  bottom: \"inception_resnet_v2_a4_3x3\"\n  top: \"inception_resnet_v2_a4_3x3\"\n  scale_param {\n    bias_term: true\n  }\n}\nlayer {\n  name: \"inception_resnet_v2_a4_3x3_relu\"\n  type: \"ReLU\"\n  bottom: \"inception_resnet_v2_a4_3x3\"\n  top: \"inception_resnet_v2_a4_3x3\"\n}\nlayer {\n  name: \"inception_resnet_v2_a4_3x3_2_reduce\"\n  type: \"Convolution\"\n  bottom: \"inception_resnet_v2_a3_residual_eltwise\"\n  top: \"inception_resnet_v2_a4_3x3_2_reduce\"\n  param {\n    lr_mult: 1\n    decay_mult: 1\n  }\n  param {\n    lr_mult: 2\n    decay_mult: 0\n  }\n  convolution_param {\n    num_output: 32\n    pad: 0\n    kernel_size: 1\n    stride: 1\n    weight_filler {\n      type: \"xavier\"\n      std: 0.01\n    }\n    bias_filler {\n      type: \"constant\"\n      value: 0.2\n    }\n  }\n}\nlayer {\n  name: \"inception_resnet_v2_a4_3x3_2_reduce_bn\"\n  type: \"BatchNorm\"\n  bottom: \"inception_resnet_v2_a4_3x3_2_reduce\"\n  top: \"inception_resnet_v2_a4_3x3_2_reduce\"\n  batch_norm_param {\n    use_global_stats: false\n  }\n}\nlayer {\n  name: \"inception_resnet_v2_a4_3x3_2_reduce_scale\"\n  type: \"Scale\"\n  bottom: \"inception_resnet_v2_a4_3x3_2_reduce\"\n  top: \"inception_resnet_v2_a4_3x3_2_reduce\"\n  scale_param {\n    bias_term: true\n  }\n}\nlayer {\n  name: \"inception_resnet_v2_a4_3x3_2_reduce_relu\"\n  type: \"ReLU\"\n  bottom: \"inception_resnet_v2_a4_3x3_2_reduce\"\n  top: \"inception_resnet_v2_a4_3x3_2_reduce\"\n}\nlayer {\n  name: \"inception_resnet_v2_a4_3x3_2\"\n  type: \"Convolution\"\n  bottom: \"inception_resnet_v2_a4_3x3_2_reduce\"\n  top: \"inception_resnet_v2_a4_3x3_2\"\n  param {\n    lr_mult: 1\n    decay_mult: 1\n  }\n  param {\n    lr_mult: 2\n    decay_mult: 0\n  }\n  convolution_param {\n    num_output: 48\n    pad: 1\n    kernel_size: 3\n    stride: 1\n    weight_filler {\n      type: \"xavier\"\n      std: 0.01\n    }\n    bias_filler {\n      type: \"constant\"\n      value: 0.2\n    }\n  }\n}\nlayer {\n  name: \"inception_resnet_v2_a4_3x3_2_bn\"\n  type: \"BatchNorm\"\n  bottom: \"inception_resnet_v2_a4_3x3_2\"\n  top: \"inception_resnet_v2_a4_3x3_2\"\n  batch_norm_param {\n    use_global_stats: false\n  }\n}\nlayer {\n  name: \"inception_resnet_v2_a4_3x3_2_scale\"\n  type: \"Scale\"\n  bottom: \"inception_resnet_v2_a4_3x3_2\"\n  top: \"inception_resnet_v2_a4_3x3_2\"\n  scale_param {\n    bias_term: true\n  }\n}\nlayer {\n  name: \"inception_resnet_v2_a4_3x3_2_relu\"\n  type: \"ReLU\"\n  bottom: \"inception_resnet_v2_a4_3x3_2\"\n  top: \"inception_resnet_v2_a4_3x3_2\"\n}\nlayer {\n  name: \"inception_resnet_v2_a4_3x3_3\"\n  type: \"Convolution\"\n  bottom: \"inception_resnet_v2_a4_3x3_2\"\n  top: \"inception_resnet_v2_a4_3x3_3\"\n  param {\n    lr_mult: 1\n    decay_mult: 1\n  }\n  param {\n    lr_mult: 2\n    decay_mult: 0\n  }\n  convolution_param {\n    num_output: 64\n    pad: 1\n    kernel_size: 3\n    stride: 1\n    weight_filler {\n      type: \"xavier\"\n      std: 0.01\n    }\n    bias_filler {\n      type: \"constant\"\n      value: 0.2\n    }\n  }\n}\nlayer {\n  name: \"inception_resnet_v2_a4_3x3_3_bn\"\n  type: \"BatchNorm\"\n  bottom: \"inception_resnet_v2_a4_3x3_3\"\n  top: \"inception_resnet_v2_a4_3x3_3\"\n  batch_norm_param {\n    use_global_stats: false\n  }\n}\nlayer {\n  name: \"inception_resnet_v2_a4_3x3_3_scale\"\n  type: \"Scale\"\n  bottom: \"inception_resnet_v2_a4_3x3_3\"\n  top: \"inception_resnet_v2_a4_3x3_3\"\n  scale_param {\n    bias_term: true\n  }\n}\nlayer {\n  name: \"inception_resnet_v2_a4_3x3_3_relu\"\n  type: \"ReLU\"\n  bottom: \"inception_resnet_v2_a4_3x3_3\"\n  top: \"inception_resnet_v2_a4_3x3_3\"\n}\nlayer {\n  name: \"inception_resnet_v2_a4_concat\"\n  type: \"Concat\"\n  bottom: \"inception_resnet_v2_a4_1x1\"\n  bottom: \"inception_resnet_v2_a4_3x3\"\n  bottom: \"inception_resnet_v2_a4_3x3_3\"\n  top: \"inception_resnet_v2_a4_concat\"\n}\nlayer {\n  name: \"inception_resnet_v2_a4_1x1_2\"\n  type: \"Convolution\"\n  bottom: \"inception_resnet_v2_a4_concat\"\n  top: \"inception_resnet_v2_a4_1x1_2\"\n  param {\n    lr_mult: 1\n    decay_mult: 1\n  }\n  param {\n    lr_mult: 2\n    decay_mult: 0\n  }\n  convolution_param {\n    num_output: 384\n    pad: 0\n    kernel_size: 1\n    stride: 1\n    weight_filler {\n      type: \"xavier\"\n      std: 0.01\n    }\n    bias_filler {\n      type: \"constant\"\n      value: 0.2\n    }\n  }\n}\nlayer {\n  name: \"inception_resnet_v2_a4_1x1_2_bn\"\n  type: \"BatchNorm\"\n  bottom: \"inception_resnet_v2_a4_1x1_2\"\n  top: \"inception_resnet_v2_a4_1x1_2\"\n  batch_norm_param {\n    use_global_stats: false\n  }\n}\nlayer {\n  name: \"inception_resnet_v2_a4_1x1_2_scale\"\n  type: \"Scale\"\n  bottom: \"inception_resnet_v2_a4_1x1_2\"\n  top: \"inception_resnet_v2_a4_1x1_2\"\n  scale_param {\n    bias_term: true\n  }\n}\nlayer {\n  name: \"inception_resnet_v2_a4_residual_eltwise\"\n  type: \"Eltwise\"\n  bottom: \"inception_resnet_v2_a3_residual_eltwise\"\n  bottom: \"inception_resnet_v2_a4_1x1_2\"\n  top: \"inception_resnet_v2_a4_residual_eltwise\"\n  eltwise_param {\n    operation: SUM\n  }\n}\nlayer {\n  name: \"inception_resnet_v2_a5_1x1\"\n  type: \"Convolution\"\n  bottom: \"inception_resnet_v2_a4_residual_eltwise\"\n  top: \"inception_resnet_v2_a5_1x1\"\n  param {\n    lr_mult: 1\n    decay_mult: 1\n  }\n  param {\n    lr_mult: 2\n    decay_mult: 0\n  }\n  convolution_param {\n    num_output: 32\n    pad: 0\n    kernel_size: 1\n    stride: 1\n    weight_filler {\n      type: \"xavier\"\n      std: 0.01\n    }\n    bias_filler {\n      type: \"constant\"\n      value: 0.2\n    }\n  }\n}\nlayer {\n  name: \"inception_resnet_v2_a5_1x1_bn\"\n  type: \"BatchNorm\"\n  bottom: \"inception_resnet_v2_a5_1x1\"\n  top: \"inception_resnet_v2_a5_1x1\"\n  batch_norm_param {\n    use_global_stats: false\n  }\n}\nlayer {\n  name: \"inception_resnet_v2_a5_1x1_scale\"\n  type: \"Scale\"\n  bottom: \"inception_resnet_v2_a5_1x1\"\n  top: \"inception_resnet_v2_a5_1x1\"\n  scale_param {\n    bias_term: true\n  }\n}\nlayer {\n  name: \"inception_resnet_v2_a5_1x1_relu\"\n  type: \"ReLU\"\n  bottom: \"inception_resnet_v2_a5_1x1\"\n  top: \"inception_resnet_v2_a5_1x1\"\n}\nlayer {\n  name: \"inception_resnet_v2_a5_3x3_reduce\"\n  type: \"Convolution\"\n  bottom: \"inception_resnet_v2_a4_residual_eltwise\"\n  top: \"inception_resnet_v2_a5_3x3_reduce\"\n  param {\n    lr_mult: 1\n    decay_mult: 1\n  }\n  param {\n    lr_mult: 2\n    decay_mult: 0\n  }\n  convolution_param {\n    num_output: 32\n    pad: 0\n    kernel_size: 1\n    stride: 1\n    weight_filler {\n      type: \"xavier\"\n      std: 0.01\n    }\n    bias_filler {\n      type: \"constant\"\n      value: 0.2\n    }\n  }\n}\nlayer {\n  name: \"inception_resnet_v2_a5_3x3_reduce_bn\"\n  type: \"BatchNorm\"\n  bottom: \"inception_resnet_v2_a5_3x3_reduce\"\n  top: \"inception_resnet_v2_a5_3x3_reduce\"\n  batch_norm_param {\n    use_global_stats: false\n  }\n}\nlayer {\n  name: \"inception_resnet_v2_a5_3x3_reduce_scale\"\n  type: \"Scale\"\n  bottom: \"inception_resnet_v2_a5_3x3_reduce\"\n  top: \"inception_resnet_v2_a5_3x3_reduce\"\n  scale_param {\n    bias_term: true\n  }\n}\nlayer {\n  name: \"inception_resnet_v2_a5_3x3_reduce_relu\"\n  type: \"ReLU\"\n  bottom: \"inception_resnet_v2_a5_3x3_reduce\"\n  top: \"inception_resnet_v2_a5_3x3_reduce\"\n}\nlayer {\n  name: \"inception_resnet_v2_a5_3x3\"\n  type: \"Convolution\"\n  bottom: \"inception_resnet_v2_a5_3x3_reduce\"\n  top: \"inception_resnet_v2_a5_3x3\"\n  param {\n    lr_mult: 1\n    decay_mult: 1\n  }\n  param {\n    lr_mult: 2\n    decay_mult: 0\n  }\n  convolution_param {\n    num_output: 32\n    pad: 1\n    kernel_size: 3\n    stride: 1\n    weight_filler {\n      type: \"xavier\"\n      std: 0.01\n    }\n    bias_filler {\n      type: \"constant\"\n      value: 0.2\n    }\n  }\n}\nlayer {\n  name: \"inception_resnet_v2_a5_3x3_bn\"\n  type: \"BatchNorm\"\n  bottom: \"inception_resnet_v2_a5_3x3\"\n  top: \"inception_resnet_v2_a5_3x3\"\n  batch_norm_param {\n    use_global_stats: false\n  }\n}\nlayer {\n  name: \"inception_resnet_v2_a5_3x3_scale\"\n  type: \"Scale\"\n  bottom: \"inception_resnet_v2_a5_3x3\"\n  top: \"inception_resnet_v2_a5_3x3\"\n  scale_param {\n    bias_term: true\n  }\n}\nlayer {\n  name: \"inception_resnet_v2_a5_3x3_relu\"\n  type: \"ReLU\"\n  bottom: \"inception_resnet_v2_a5_3x3\"\n  top: \"inception_resnet_v2_a5_3x3\"\n}\nlayer {\n  name: \"inception_resnet_v2_a5_3x3_2_reduce\"\n  type: \"Convolution\"\n  bottom: \"inception_resnet_v2_a4_residual_eltwise\"\n  top: \"inception_resnet_v2_a5_3x3_2_reduce\"\n  param {\n    lr_mult: 1\n    decay_mult: 1\n  }\n  param {\n    lr_mult: 2\n    decay_mult: 0\n  }\n  convolution_param {\n    num_output: 32\n    pad: 0\n    kernel_size: 1\n    stride: 1\n    weight_filler {\n      type: \"xavier\"\n      std: 0.01\n    }\n    bias_filler {\n      type: \"constant\"\n      value: 0.2\n    }\n  }\n}\nlayer {\n  name: \"inception_resnet_v2_a5_3x3_2_reduce_bn\"\n  type: \"BatchNorm\"\n  bottom: \"inception_resnet_v2_a5_3x3_2_reduce\"\n  top: \"inception_resnet_v2_a5_3x3_2_reduce\"\n  batch_norm_param {\n    use_global_stats: false\n  }\n}\nlayer {\n  name: \"inception_resnet_v2_a5_3x3_2_reduce_scale\"\n  type: \"Scale\"\n  bottom: \"inception_resnet_v2_a5_3x3_2_reduce\"\n  top: \"inception_resnet_v2_a5_3x3_2_reduce\"\n  scale_param {\n    bias_term: true\n  }\n}\nlayer {\n  name: \"inception_resnet_v2_a5_3x3_2_reduce_relu\"\n  type: \"ReLU\"\n  bottom: \"inception_resnet_v2_a5_3x3_2_reduce\"\n  top: \"inception_resnet_v2_a5_3x3_2_reduce\"\n}\nlayer {\n  name: \"inception_resnet_v2_a5_3x3_2\"\n  type: \"Convolution\"\n  bottom: \"inception_resnet_v2_a5_3x3_2_reduce\"\n  top: \"inception_resnet_v2_a5_3x3_2\"\n  param {\n    lr_mult: 1\n    decay_mult: 1\n  }\n  param {\n    lr_mult: 2\n    decay_mult: 0\n  }\n  convolution_param {\n    num_output: 48\n    pad: 1\n    kernel_size: 3\n    stride: 1\n    weight_filler {\n      type: \"xavier\"\n      std: 0.01\n    }\n    bias_filler {\n      type: \"constant\"\n      value: 0.2\n    }\n  }\n}\nlayer {\n  name: \"inception_resnet_v2_a5_3x3_2_bn\"\n  type: \"BatchNorm\"\n  bottom: \"inception_resnet_v2_a5_3x3_2\"\n  top: \"inception_resnet_v2_a5_3x3_2\"\n  batch_norm_param {\n    use_global_stats: false\n  }\n}\nlayer {\n  name: \"inception_resnet_v2_a5_3x3_2_scale\"\n  type: \"Scale\"\n  bottom: \"inception_resnet_v2_a5_3x3_2\"\n  top: \"inception_resnet_v2_a5_3x3_2\"\n  scale_param {\n    bias_term: true\n  }\n}\nlayer {\n  name: \"inception_resnet_v2_a5_3x3_2_relu\"\n  type: \"ReLU\"\n  bottom: \"inception_resnet_v2_a5_3x3_2\"\n  top: \"inception_resnet_v2_a5_3x3_2\"\n}\nlayer {\n  name: \"inception_resnet_v2_a5_3x3_3\"\n  type: \"Convolution\"\n  bottom: \"inception_resnet_v2_a5_3x3_2\"\n  top: \"inception_resnet_v2_a5_3x3_3\"\n  param {\n    lr_mult: 1\n    decay_mult: 1\n  }\n  param {\n    lr_mult: 2\n    decay_mult: 0\n  }\n  convolution_param {\n    num_output: 64\n    pad: 1\n    kernel_size: 3\n    stride: 1\n    weight_filler {\n      type: \"xavier\"\n      std: 0.01\n    }\n    bias_filler {\n      type: \"constant\"\n      value: 0.2\n    }\n  }\n}\nlayer {\n  name: \"inception_resnet_v2_a5_3x3_3_bn\"\n  type: \"BatchNorm\"\n  bottom: \"inception_resnet_v2_a5_3x3_3\"\n  top: \"inception_resnet_v2_a5_3x3_3\"\n  batch_norm_param {\n    use_global_stats: false\n  }\n}\nlayer {\n  name: \"inception_resnet_v2_a5_3x3_3_scale\"\n  type: \"Scale\"\n  bottom: \"inception_resnet_v2_a5_3x3_3\"\n  top: \"inception_resnet_v2_a5_3x3_3\"\n  scale_param {\n    bias_term: true\n  }\n}\nlayer {\n  name: \"inception_resnet_v2_a5_3x3_3_relu\"\n  type: \"ReLU\"\n  bottom: \"inception_resnet_v2_a5_3x3_3\"\n  top: \"inception_resnet_v2_a5_3x3_3\"\n}\nlayer {\n  name: \"inception_resnet_v2_a5_concat\"\n  type: \"Concat\"\n  bottom: \"inception_resnet_v2_a5_1x1\"\n  bottom: \"inception_resnet_v2_a5_3x3\"\n  bottom: \"inception_resnet_v2_a5_3x3_3\"\n  top: \"inception_resnet_v2_a5_concat\"\n}\nlayer {\n  name: \"inception_resnet_v2_a5_1x1_2\"\n  type: \"Convolution\"\n  bottom: \"inception_resnet_v2_a5_concat\"\n  top: \"inception_resnet_v2_a5_1x1_2\"\n  param {\n    lr_mult: 1\n    decay_mult: 1\n  }\n  param {\n    lr_mult: 2\n    decay_mult: 0\n  }\n  convolution_param {\n    num_output: 384\n    pad: 0\n    kernel_size: 1\n    stride: 1\n    weight_filler {\n      type: \"xavier\"\n      std: 0.01\n    }\n    bias_filler {\n      type: \"constant\"\n      value: 0.2\n    }\n  }\n}\nlayer {\n  name: \"inception_resnet_v2_a5_1x1_2_bn\"\n  type: \"BatchNorm\"\n  bottom: \"inception_resnet_v2_a5_1x1_2\"\n  top: \"inception_resnet_v2_a5_1x1_2\"\n  batch_norm_param {\n    use_global_stats: false\n  }\n}\nlayer {\n  name: \"inception_resnet_v2_a5_1x1_2_scale\"\n  type: \"Scale\"\n  bottom: \"inception_resnet_v2_a5_1x1_2\"\n  top: \"inception_resnet_v2_a5_1x1_2\"\n  scale_param {\n    bias_term: true\n  }\n}\nlayer {\n  name: \"inception_resnet_v2_a5_residual_eltwise\"\n  type: \"Eltwise\"\n  bottom: \"inception_resnet_v2_a4_residual_eltwise\"\n  bottom: \"inception_resnet_v2_a5_1x1_2\"\n  top: \"inception_resnet_v2_a5_residual_eltwise\"\n  eltwise_param {\n    operation: SUM\n  }\n}\nlayer {\n  name: \"reduction_a_pool\"\n  type: \"Pooling\"\n  bottom: \"inception_resnet_v2_a5_residual_eltwise\"\n  top: \"reduction_a_pool\"\n  pooling_param {\n    pool: MAX\n    kernel_size: 3\n    stride: 2\n  }\n}\nlayer {\n  name: \"reduction_a_3x3\"\n  type: \"Convolution\"\n  bottom: \"inception_resnet_v2_a5_residual_eltwise\"\n  top: \"reduction_a_3x3\"\n  param {\n    lr_mult: 1\n    decay_mult: 1\n  }\n  param {\n    lr_mult: 2\n    decay_mult: 0\n  }\n  convolution_param {\n    num_output: 384\n    pad: 0\n    kernel_size: 3\n    stride: 2\n    weight_filler {\n      type: \"xavier\"\n      std: 0.01\n    }\n    bias_filler {\n      type: \"constant\"\n      value: 0.2\n    }\n  }\n}\nlayer {\n  name: \"reduction_a_3x3_bn\"\n  type: \"BatchNorm\"\n  bottom: \"reduction_a_3x3\"\n  top: \"reduction_a_3x3\"\n  batch_norm_param {\n    use_global_stats: false\n  }\n}\nlayer {\n  name: \"reduction_a_3x3_scale\"\n  type: \"Scale\"\n  bottom: \"reduction_a_3x3\"\n  top: \"reduction_a_3x3\"\n  scale_param {\n    bias_term: true\n  }\n}\nlayer {\n  name: \"reduction_a_3x3_relu\"\n  type: \"ReLU\"\n  bottom: \"reduction_a_3x3\"\n  top: \"reduction_a_3x3\"\n}\nlayer {\n  name: \"reduction_a_3x3_2_reduce\"\n  type: \"Convolution\"\n  bottom: \"inception_resnet_v2_a5_residual_eltwise\"\n  top: \"reduction_a_3x3_2_reduce\"\n  param {\n    lr_mult: 1\n    decay_mult: 1\n  }\n  param {\n    lr_mult: 2\n    decay_mult: 0\n  }\n  convolution_param {\n    num_output: 256\n    pad: 0\n    kernel_size: 1\n    stride: 1\n    weight_filler {\n      type: \"xavier\"\n      std: 0.01\n    }\n    bias_filler {\n      type: \"constant\"\n      value: 0.2\n    }\n  }\n}\nlayer {\n  name: \"reduction_a_3x3_2_reduce_bn\"\n  type: \"BatchNorm\"\n  bottom: \"reduction_a_3x3_2_reduce\"\n  top: \"reduction_a_3x3_2_reduce\"\n  batch_norm_param {\n    use_global_stats: false\n  }\n}\nlayer {\n  name: \"reduction_a_3x3_2_reduce_scale\"\n  type: \"Scale\"\n  bottom: \"reduction_a_3x3_2_reduce\"\n  top: \"reduction_a_3x3_2_reduce\"\n  scale_param {\n    bias_term: true\n  }\n}\nlayer {\n  name: \"reduction_a_3x3_2_reduce_relu\"\n  type: \"ReLU\"\n  bottom: \"reduction_a_3x3_2_reduce\"\n  top: \"reduction_a_3x3_2_reduce\"\n}\nlayer {\n  name: \"reduction_a_3x3_2\"\n  type: \"Convolution\"\n  bottom: \"reduction_a_3x3_2_reduce\"\n  top: \"reduction_a_3x3_2\"\n  param {\n    lr_mult: 1\n    decay_mult: 1\n  }\n  param {\n    lr_mult: 2\n    decay_mult: 0\n  }\n  convolution_param {\n    num_output: 256\n    pad: 1\n    kernel_size: 3\n    stride: 1\n    weight_filler {\n      type: \"xavier\"\n      std: 0.01\n    }\n    bias_filler {\n      type: \"constant\"\n      value: 0.2\n    }\n  }\n}\nlayer {\n  name: \"reduction_a_3x3_2_bn\"\n  type: \"BatchNorm\"\n  bottom: \"reduction_a_3x3_2\"\n  top: \"reduction_a_3x3_2\"\n  batch_norm_param {\n    use_global_stats: false\n  }\n}\nlayer {\n  name: \"reduction_a_3x3_2_scale\"\n  type: \"Scale\"\n  bottom: \"reduction_a_3x3_2\"\n  top: \"reduction_a_3x3_2\"\n  scale_param {\n    bias_term: true\n  }\n}\nlayer {\n  name: \"reduction_a_3x3_2_relu\"\n  type: \"ReLU\"\n  bottom: \"reduction_a_3x3_2\"\n  top: \"reduction_a_3x3_2\"\n}\nlayer {\n  name: \"reduction_a_3x3_3\"\n  type: \"Convolution\"\n  bottom: \"reduction_a_3x3_2\"\n  top: \"reduction_a_3x3_3\"\n  param {\n    lr_mult: 1\n    decay_mult: 1\n  }\n  param {\n    lr_mult: 2\n    decay_mult: 0\n  }\n  convolution_param {\n    num_output: 384\n    pad: 0\n    kernel_size: 3\n    stride: 2\n    weight_filler {\n      type: \"xavier\"\n      std: 0.01\n    }\n    bias_filler {\n      type: \"constant\"\n      value: 0.2\n    }\n  }\n}\nlayer {\n  name: \"reduction_a_3x3_3_bn\"\n  type: \"BatchNorm\"\n  bottom: \"reduction_a_3x3_3\"\n  top: \"reduction_a_3x3_3\"\n  batch_norm_param {\n    use_global_stats: false\n  }\n}\nlayer {\n  name: \"reduction_a_3x3_3_scale\"\n  type: \"Scale\"\n  bottom: \"reduction_a_3x3_3\"\n  top: \"reduction_a_3x3_3\"\n  scale_param {\n    bias_term: true\n  }\n}\nlayer {\n  name: \"reduction_a_3x3_3_relu\"\n  type: \"ReLU\"\n  bottom: \"reduction_a_3x3_3\"\n  top: \"reduction_a_3x3_3\"\n}\nlayer {\n  name: \"reduction_a_concat\"\n  type: \"Concat\"\n  bottom: \"reduction_a_pool\"\n  bottom: \"reduction_a_3x3\"\n  bottom: \"reduction_a_3x3_3\"\n  top: \"reduction_a_concat\"\n}\nlayer {\n  name: \"inception_resnet_v2_b1_1x1\"\n  type: \"Convolution\"\n  bottom: \"reduction_a_concat\"\n  top: \"inception_resnet_v2_b1_1x1\"\n  param {\n    lr_mult: 1\n    decay_mult: 1\n  }\n  param {\n    lr_mult: 2\n    decay_mult: 0\n  }\n  convolution_param {\n    num_output: 192\n    pad: 0\n    kernel_size: 1\n    stride: 1\n    weight_filler {\n      type: \"xavier\"\n      std: 0.01\n    }\n    bias_filler {\n      type: \"constant\"\n      value: 0.2\n    }\n  }\n}\nlayer {\n  name: \"inception_resnet_v2_b1_1x1_bn\"\n  type: \"BatchNorm\"\n  bottom: \"inception_resnet_v2_b1_1x1\"\n  top: \"inception_resnet_v2_b1_1x1\"\n  batch_norm_param {\n    use_global_stats: false\n  }\n}\nlayer {\n  name: \"inception_resnet_v2_b1_1x1_scale\"\n  type: \"Scale\"\n  bottom: \"inception_resnet_v2_b1_1x1\"\n  top: \"inception_resnet_v2_b1_1x1\"\n  scale_param {\n    bias_term: true\n  }\n}\nlayer {\n  name: \"inception_resnet_v2_b1_1x1_relu\"\n  type: \"ReLU\"\n  bottom: \"inception_resnet_v2_b1_1x1\"\n  top: \"inception_resnet_v2_b1_1x1\"\n}\nlayer {\n  name: \"inception_resnet_v2_b1_1x7_reduce\"\n  type: \"Convolution\"\n  bottom: \"reduction_a_concat\"\n  top: \"inception_resnet_v2_b1_1x7_reduce\"\n  param {\n    lr_mult: 1\n    decay_mult: 1\n  }\n  param {\n    lr_mult: 2\n    decay_mult: 0\n  }\n  convolution_param {\n    num_output: 128\n    pad: 0\n    kernel_size: 1\n    stride: 1\n    weight_filler {\n      type: \"xavier\"\n      std: 0.01\n    }\n    bias_filler {\n      type: \"constant\"\n      value: 0.2\n    }\n  }\n}\nlayer {\n  name: \"inception_resnet_v2_b1_1x7_reduce_bn\"\n  type: \"BatchNorm\"\n  bottom: \"inception_resnet_v2_b1_1x7_reduce\"\n  top: \"inception_resnet_v2_b1_1x7_reduce\"\n  batch_norm_param {\n    use_global_stats: false\n  }\n}\nlayer {\n  name: \"inception_resnet_v2_b1_1x7_reduce_scale\"\n  type: \"Scale\"\n  bottom: \"inception_resnet_v2_b1_1x7_reduce\"\n  top: \"inception_resnet_v2_b1_1x7_reduce\"\n  scale_param {\n    bias_term: true\n  }\n}\nlayer {\n  name: \"inception_resnet_v2_b1_1x7_reduce_relu\"\n  type: \"ReLU\"\n  bottom: \"inception_resnet_v2_b1_1x7_reduce\"\n  top: \"inception_resnet_v2_b1_1x7_reduce\"\n}\nlayer {\n  name: \"inception_resnet_v2_b1_1x7\"\n  type: \"Convolution\"\n  bottom: \"inception_resnet_v2_b1_1x7_reduce\"\n  top: \"inception_resnet_v2_b1_1x7\"\n  param {\n    lr_mult: 1\n    decay_mult: 1\n  }\n  param {\n    lr_mult: 2\n    decay_mult: 0\n  }\n  convolution_param {\n    num_output: 160\n    stride: 1\n    weight_filler {\n      type: \"xavier\"\n      std: 0.01\n    }\n    bias_filler {\n      type: \"constant\"\n      value: 0.2\n    }\n    pad_h: 0\n    pad_w: 3\n    kernel_h: 1\n    kernel_w: 7\n  }\n}\nlayer {\n  name: \"inception_resnet_v2_b1_1x7_bn\"\n  type: \"BatchNorm\"\n  bottom: \"inception_resnet_v2_b1_1x7\"\n  top: \"inception_resnet_v2_b1_1x7\"\n  batch_norm_param {\n    use_global_stats: false\n  }\n}\nlayer {\n  name: \"inception_resnet_v2_b1_1x7_scale\"\n  type: \"Scale\"\n  bottom: \"inception_resnet_v2_b1_1x7\"\n  top: \"inception_resnet_v2_b1_1x7\"\n  scale_param {\n    bias_term: true\n  }\n}\nlayer {\n  name: \"inception_resnet_v2_b1_1x7_relu\"\n  type: \"ReLU\"\n  bottom: \"inception_resnet_v2_b1_1x7\"\n  top: \"inception_resnet_v2_b1_1x7\"\n}\nlayer {\n  name: \"inception_resnet_v2_b1_7x1\"\n  type: \"Convolution\"\n  bottom: \"inception_resnet_v2_b1_1x7\"\n  top: \"inception_resnet_v2_b1_7x1\"\n  param {\n    lr_mult: 1\n    decay_mult: 1\n  }\n  param {\n    lr_mult: 2\n    decay_mult: 0\n  }\n  convolution_param {\n    num_output: 192\n    stride: 1\n    weight_filler {\n      type: \"xavier\"\n      std: 0.01\n    }\n    bias_filler {\n      type: \"constant\"\n      value: 0.2\n    }\n    pad_h: 3\n    pad_w: 0\n    kernel_h: 7\n    kernel_w: 1\n  }\n}\nlayer {\n  name: \"inception_resnet_v2_b1_7x1_bn\"\n  type: \"BatchNorm\"\n  bottom: \"inception_resnet_v2_b1_7x1\"\n  top: \"inception_resnet_v2_b1_7x1\"\n  batch_norm_param {\n    use_global_stats: false\n  }\n}\nlayer {\n  name: \"inception_resnet_v2_b1_7x1_scale\"\n  type: \"Scale\"\n  bottom: \"inception_resnet_v2_b1_7x1\"\n  top: \"inception_resnet_v2_b1_7x1\"\n  scale_param {\n    bias_term: true\n  }\n}\nlayer {\n  name: \"inception_resnet_v2_b1_7x1_relu\"\n  type: \"ReLU\"\n  bottom: \"inception_resnet_v2_b1_7x1\"\n  top: \"inception_resnet_v2_b1_7x1\"\n}\nlayer {\n  name: \"inception_resnet_v2_b1_concat\"\n  type: \"Concat\"\n  bottom: \"inception_resnet_v2_b1_1x1\"\n  bottom: \"inception_resnet_v2_b1_7x1\"\n  top: \"inception_resnet_v2_b1_concat\"\n}\nlayer {\n  name: \"inception_resnet_v2_b1_1x1_2\"\n  type: \"Convolution\"\n  bottom: \"inception_resnet_v2_b1_concat\"\n  top: \"inception_resnet_v2_b1_1x1_2\"\n  param {\n    lr_mult: 1\n    decay_mult: 1\n  }\n  param {\n    lr_mult: 2\n    decay_mult: 0\n  }\n  convolution_param {\n    num_output: 1152\n    pad: 0\n    kernel_size: 1\n    stride: 1\n    weight_filler {\n      type: \"xavier\"\n      std: 0.01\n    }\n    bias_filler {\n      type: \"constant\"\n      value: 0.2\n    }\n  }\n}\nlayer {\n  name: \"inception_resnet_v2_b1_1x1_2_bn\"\n  type: \"BatchNorm\"\n  bottom: \"inception_resnet_v2_b1_1x1_2\"\n  top: \"inception_resnet_v2_b1_1x1_2\"\n  batch_norm_param {\n    use_global_stats: false\n  }\n}\nlayer {\n  name: \"inception_resnet_v2_b1_1x1_2_scale\"\n  type: \"Scale\"\n  bottom: \"inception_resnet_v2_b1_1x1_2\"\n  top: \"inception_resnet_v2_b1_1x1_2\"\n  scale_param {\n    bias_term: true\n  }\n}\nlayer {\n  name: \"inception_resnet_v2_b1_residual_eltwise\"\n  type: \"Eltwise\"\n  bottom: \"reduction_a_concat\"\n  bottom: \"inception_resnet_v2_b1_1x1_2\"\n  top: \"inception_resnet_v2_b1_residual_eltwise\"\n  eltwise_param {\n    operation: SUM\n  }\n}\nlayer {\n  name: \"inception_resnet_v2_b2_1x1\"\n  type: \"Convolution\"\n  bottom: \"inception_resnet_v2_b1_residual_eltwise\"\n  top: \"inception_resnet_v2_b2_1x1\"\n  param {\n    lr_mult: 1\n    decay_mult: 1\n  }\n  param {\n    lr_mult: 2\n    decay_mult: 0\n  }\n  convolution_param {\n    num_output: 192\n    pad: 0\n    kernel_size: 1\n    stride: 1\n    weight_filler {\n      type: \"xavier\"\n      std: 0.01\n    }\n    bias_filler {\n      type: \"constant\"\n      value: 0.2\n    }\n  }\n}\nlayer {\n  name: \"inception_resnet_v2_b2_1x1_bn\"\n  type: \"BatchNorm\"\n  bottom: \"inception_resnet_v2_b2_1x1\"\n  top: \"inception_resnet_v2_b2_1x1\"\n  batch_norm_param {\n    use_global_stats: false\n  }\n}\nlayer {\n  name: \"inception_resnet_v2_b2_1x1_scale\"\n  type: \"Scale\"\n  bottom: \"inception_resnet_v2_b2_1x1\"\n  top: \"inception_resnet_v2_b2_1x1\"\n  scale_param {\n    bias_term: true\n  }\n}\nlayer {\n  name: \"inception_resnet_v2_b2_1x1_relu\"\n  type: \"ReLU\"\n  bottom: \"inception_resnet_v2_b2_1x1\"\n  top: \"inception_resnet_v2_b2_1x1\"\n}\nlayer {\n  name: \"inception_resnet_v2_b2_1x7_reduce\"\n  type: \"Convolution\"\n  bottom: \"inception_resnet_v2_b1_residual_eltwise\"\n  top: \"inception_resnet_v2_b2_1x7_reduce\"\n  param {\n    lr_mult: 1\n    decay_mult: 1\n  }\n  param {\n    lr_mult: 2\n    decay_mult: 0\n  }\n  convolution_param {\n    num_output: 128\n    pad: 0\n    kernel_size: 1\n    stride: 1\n    weight_filler {\n      type: \"xavier\"\n      std: 0.01\n    }\n    bias_filler {\n      type: \"constant\"\n      value: 0.2\n    }\n  }\n}\nlayer {\n  name: \"inception_resnet_v2_b2_1x7_reduce_bn\"\n  type: \"BatchNorm\"\n  bottom: \"inception_resnet_v2_b2_1x7_reduce\"\n  top: \"inception_resnet_v2_b2_1x7_reduce\"\n  batch_norm_param {\n    use_global_stats: false\n  }\n}\nlayer {\n  name: \"inception_resnet_v2_b2_1x7_reduce_scale\"\n  type: \"Scale\"\n  bottom: \"inception_resnet_v2_b2_1x7_reduce\"\n  top: \"inception_resnet_v2_b2_1x7_reduce\"\n  scale_param {\n    bias_term: true\n  }\n}\nlayer {\n  name: \"inception_resnet_v2_b2_1x7_reduce_relu\"\n  type: \"ReLU\"\n  bottom: \"inception_resnet_v2_b2_1x7_reduce\"\n  top: \"inception_resnet_v2_b2_1x7_reduce\"\n}\nlayer {\n  name: \"inception_resnet_v2_b2_1x7\"\n  type: \"Convolution\"\n  bottom: \"inception_resnet_v2_b2_1x7_reduce\"\n  top: \"inception_resnet_v2_b2_1x7\"\n  param {\n    lr_mult: 1\n    decay_mult: 1\n  }\n  param {\n    lr_mult: 2\n    decay_mult: 0\n  }\n  convolution_param {\n    num_output: 160\n    stride: 1\n    weight_filler {\n      type: \"xavier\"\n      std: 0.01\n    }\n    bias_filler {\n      type: \"constant\"\n      value: 0.2\n    }\n    pad_h: 0\n    pad_w: 3\n    kernel_h: 1\n    kernel_w: 7\n  }\n}\nlayer {\n  name: \"inception_resnet_v2_b2_1x7_bn\"\n  type: \"BatchNorm\"\n  bottom: \"inception_resnet_v2_b2_1x7\"\n  top: \"inception_resnet_v2_b2_1x7\"\n  batch_norm_param {\n    use_global_stats: false\n  }\n}\nlayer {\n  name: \"inception_resnet_v2_b2_1x7_scale\"\n  type: \"Scale\"\n  bottom: \"inception_resnet_v2_b2_1x7\"\n  top: \"inception_resnet_v2_b2_1x7\"\n  scale_param {\n    bias_term: true\n  }\n}\nlayer {\n  name: \"inception_resnet_v2_b2_1x7_relu\"\n  type: \"ReLU\"\n  bottom: \"inception_resnet_v2_b2_1x7\"\n  top: \"inception_resnet_v2_b2_1x7\"\n}\nlayer {\n  name: \"inception_resnet_v2_b2_7x1\"\n  type: \"Convolution\"\n  bottom: \"inception_resnet_v2_b2_1x7\"\n  top: \"inception_resnet_v2_b2_7x1\"\n  param {\n    lr_mult: 1\n    decay_mult: 1\n  }\n  param {\n    lr_mult: 2\n    decay_mult: 0\n  }\n  convolution_param {\n    num_output: 192\n    stride: 1\n    weight_filler {\n      type: \"xavier\"\n      std: 0.01\n    }\n    bias_filler {\n      type: \"constant\"\n      value: 0.2\n    }\n    pad_h: 3\n    pad_w: 0\n    kernel_h: 7\n    kernel_w: 1\n  }\n}\nlayer {\n  name: \"inception_resnet_v2_b2_7x1_bn\"\n  type: \"BatchNorm\"\n  bottom: \"inception_resnet_v2_b2_7x1\"\n  top: \"inception_resnet_v2_b2_7x1\"\n  batch_norm_param {\n    use_global_stats: false\n  }\n}\nlayer {\n  name: \"inception_resnet_v2_b2_7x1_scale\"\n  type: \"Scale\"\n  bottom: \"inception_resnet_v2_b2_7x1\"\n  top: \"inception_resnet_v2_b2_7x1\"\n  scale_param {\n    bias_term: true\n  }\n}\nlayer {\n  name: \"inception_resnet_v2_b2_7x1_relu\"\n  type: \"ReLU\"\n  bottom: \"inception_resnet_v2_b2_7x1\"\n  top: \"inception_resnet_v2_b2_7x1\"\n}\nlayer {\n  name: \"inception_resnet_v2_b2_concat\"\n  type: \"Concat\"\n  bottom: \"inception_resnet_v2_b2_1x1\"\n  bottom: \"inception_resnet_v2_b2_7x1\"\n  top: \"inception_resnet_v2_b2_concat\"\n}\nlayer {\n  name: \"inception_resnet_v2_b2_1x1_2\"\n  type: \"Convolution\"\n  bottom: \"inception_resnet_v2_b2_concat\"\n  top: \"inception_resnet_v2_b2_1x1_2\"\n  param {\n    lr_mult: 1\n    decay_mult: 1\n  }\n  param {\n    lr_mult: 2\n    decay_mult: 0\n  }\n  convolution_param {\n    num_output: 1152\n    pad: 0\n    kernel_size: 1\n    stride: 1\n    weight_filler {\n      type: \"xavier\"\n      std: 0.01\n    }\n    bias_filler {\n      type: \"constant\"\n      value: 0.2\n    }\n  }\n}\nlayer {\n  name: \"inception_resnet_v2_b2_1x1_2_bn\"\n  type: \"BatchNorm\"\n  bottom: \"inception_resnet_v2_b2_1x1_2\"\n  top: \"inception_resnet_v2_b2_1x1_2\"\n  batch_norm_param {\n    use_global_stats: false\n  }\n}\nlayer {\n  name: \"inception_resnet_v2_b2_1x1_2_scale\"\n  type: \"Scale\"\n  bottom: \"inception_resnet_v2_b2_1x1_2\"\n  top: \"inception_resnet_v2_b2_1x1_2\"\n  scale_param {\n    bias_term: true\n  }\n}\nlayer {\n  name: \"inception_resnet_v2_b2_residual_eltwise\"\n  type: \"Eltwise\"\n  bottom: \"inception_resnet_v2_b1_residual_eltwise\"\n  bottom: \"inception_resnet_v2_b2_1x1_2\"\n  top: \"inception_resnet_v2_b2_residual_eltwise\"\n  eltwise_param {\n    operation: SUM\n  }\n}\nlayer {\n  name: \"inception_resnet_v2_b3_1x1\"\n  type: \"Convolution\"\n  bottom: \"inception_resnet_v2_b2_residual_eltwise\"\n  top: \"inception_resnet_v2_b3_1x1\"\n  param {\n    lr_mult: 1\n    decay_mult: 1\n  }\n  param {\n    lr_mult: 2\n    decay_mult: 0\n  }\n  convolution_param {\n    num_output: 192\n    pad: 0\n    kernel_size: 1\n    stride: 1\n    weight_filler {\n      type: \"xavier\"\n      std: 0.01\n    }\n    bias_filler {\n      type: \"constant\"\n      value: 0.2\n    }\n  }\n}\nlayer {\n  name: \"inception_resnet_v2_b3_1x1_bn\"\n  type: \"BatchNorm\"\n  bottom: \"inception_resnet_v2_b3_1x1\"\n  top: \"inception_resnet_v2_b3_1x1\"\n  batch_norm_param {\n    use_global_stats: false\n  }\n}\nlayer {\n  name: \"inception_resnet_v2_b3_1x1_scale\"\n  type: \"Scale\"\n  bottom: \"inception_resnet_v2_b3_1x1\"\n  top: \"inception_resnet_v2_b3_1x1\"\n  scale_param {\n    bias_term: true\n  }\n}\nlayer {\n  name: \"inception_resnet_v2_b3_1x1_relu\"\n  type: \"ReLU\"\n  bottom: \"inception_resnet_v2_b3_1x1\"\n  top: \"inception_resnet_v2_b3_1x1\"\n}\nlayer {\n  name: \"inception_resnet_v2_b3_1x7_reduce\"\n  type: \"Convolution\"\n  bottom: \"inception_resnet_v2_b2_residual_eltwise\"\n  top: \"inception_resnet_v2_b3_1x7_reduce\"\n  param {\n    lr_mult: 1\n    decay_mult: 1\n  }\n  param {\n    lr_mult: 2\n    decay_mult: 0\n  }\n  convolution_param {\n    num_output: 128\n    pad: 0\n    kernel_size: 1\n    stride: 1\n    weight_filler {\n      type: \"xavier\"\n      std: 0.01\n    }\n    bias_filler {\n      type: \"constant\"\n      value: 0.2\n    }\n  }\n}\nlayer {\n  name: \"inception_resnet_v2_b3_1x7_reduce_bn\"\n  type: \"BatchNorm\"\n  bottom: \"inception_resnet_v2_b3_1x7_reduce\"\n  top: \"inception_resnet_v2_b3_1x7_reduce\"\n  batch_norm_param {\n    use_global_stats: false\n  }\n}\nlayer {\n  name: \"inception_resnet_v2_b3_1x7_reduce_scale\"\n  type: \"Scale\"\n  bottom: \"inception_resnet_v2_b3_1x7_reduce\"\n  top: \"inception_resnet_v2_b3_1x7_reduce\"\n  scale_param {\n    bias_term: true\n  }\n}\nlayer {\n  name: \"inception_resnet_v2_b3_1x7_reduce_relu\"\n  type: \"ReLU\"\n  bottom: \"inception_resnet_v2_b3_1x7_reduce\"\n  top: \"inception_resnet_v2_b3_1x7_reduce\"\n}\nlayer {\n  name: \"inception_resnet_v2_b3_1x7\"\n  type: \"Convolution\"\n  bottom: \"inception_resnet_v2_b3_1x7_reduce\"\n  top: \"inception_resnet_v2_b3_1x7\"\n  param {\n    lr_mult: 1\n    decay_mult: 1\n  }\n  param {\n    lr_mult: 2\n    decay_mult: 0\n  }\n  convolution_param {\n    num_output: 160\n    stride: 1\n    weight_filler {\n      type: \"xavier\"\n      std: 0.01\n    }\n    bias_filler {\n      type: \"constant\"\n      value: 0.2\n    }\n    pad_h: 0\n    pad_w: 3\n    kernel_h: 1\n    kernel_w: 7\n  }\n}\nlayer {\n  name: \"inception_resnet_v2_b3_1x7_bn\"\n  type: \"BatchNorm\"\n  bottom: \"inception_resnet_v2_b3_1x7\"\n  top: \"inception_resnet_v2_b3_1x7\"\n  batch_norm_param {\n    use_global_stats: false\n  }\n}\nlayer {\n  name: \"inception_resnet_v2_b3_1x7_scale\"\n  type: \"Scale\"\n  bottom: \"inception_resnet_v2_b3_1x7\"\n  top: \"inception_resnet_v2_b3_1x7\"\n  scale_param {\n    bias_term: true\n  }\n}\nlayer {\n  name: \"inception_resnet_v2_b3_1x7_relu\"\n  type: \"ReLU\"\n  bottom: \"inception_resnet_v2_b3_1x7\"\n  top: \"inception_resnet_v2_b3_1x7\"\n}\nlayer {\n  name: \"inception_resnet_v2_b3_7x1\"\n  type: \"Convolution\"\n  bottom: \"inception_resnet_v2_b3_1x7\"\n  top: \"inception_resnet_v2_b3_7x1\"\n  param {\n    lr_mult: 1\n    decay_mult: 1\n  }\n  param {\n    lr_mult: 2\n    decay_mult: 0\n  }\n  convolution_param {\n    num_output: 192\n    stride: 1\n    weight_filler {\n      type: \"xavier\"\n      std: 0.01\n    }\n    bias_filler {\n      type: \"constant\"\n      value: 0.2\n    }\n    pad_h: 3\n    pad_w: 0\n    kernel_h: 7\n    kernel_w: 1\n  }\n}\nlayer {\n  name: \"inception_resnet_v2_b3_7x1_bn\"\n  type: \"BatchNorm\"\n  bottom: \"inception_resnet_v2_b3_7x1\"\n  top: \"inception_resnet_v2_b3_7x1\"\n  batch_norm_param {\n    use_global_stats: false\n  }\n}\nlayer {\n  name: \"inception_resnet_v2_b3_7x1_scale\"\n  type: \"Scale\"\n  bottom: \"inception_resnet_v2_b3_7x1\"\n  top: \"inception_resnet_v2_b3_7x1\"\n  scale_param {\n    bias_term: true\n  }\n}\nlayer {\n  name: \"inception_resnet_v2_b3_7x1_relu\"\n  type: \"ReLU\"\n  bottom: \"inception_resnet_v2_b3_7x1\"\n  top: \"inception_resnet_v2_b3_7x1\"\n}\nlayer {\n  name: \"inception_resnet_v2_b3_concat\"\n  type: \"Concat\"\n  bottom: \"inception_resnet_v2_b3_1x1\"\n  bottom: \"inception_resnet_v2_b3_7x1\"\n  top: \"inception_resnet_v2_b3_concat\"\n}\nlayer {\n  name: \"inception_resnet_v2_b3_1x1_2\"\n  type: \"Convolution\"\n  bottom: \"inception_resnet_v2_b3_concat\"\n  top: \"inception_resnet_v2_b3_1x1_2\"\n  param {\n    lr_mult: 1\n    decay_mult: 1\n  }\n  param {\n    lr_mult: 2\n    decay_mult: 0\n  }\n  convolution_param {\n    num_output: 1152\n    pad: 0\n    kernel_size: 1\n    stride: 1\n    weight_filler {\n      type: \"xavier\"\n      std: 0.01\n    }\n    bias_filler {\n      type: \"constant\"\n      value: 0.2\n    }\n  }\n}\nlayer {\n  name: \"inception_resnet_v2_b3_1x1_2_bn\"\n  type: \"BatchNorm\"\n  bottom: \"inception_resnet_v2_b3_1x1_2\"\n  top: \"inception_resnet_v2_b3_1x1_2\"\n  batch_norm_param {\n    use_global_stats: false\n  }\n}\nlayer {\n  name: \"inception_resnet_v2_b3_1x1_2_scale\"\n  type: \"Scale\"\n  bottom: \"inception_resnet_v2_b3_1x1_2\"\n  top: \"inception_resnet_v2_b3_1x1_2\"\n  scale_param {\n    bias_term: true\n  }\n}\nlayer {\n  name: \"inception_resnet_v2_b3_residual_eltwise\"\n  type: \"Eltwise\"\n  bottom: \"inception_resnet_v2_b2_residual_eltwise\"\n  bottom: \"inception_resnet_v2_b3_1x1_2\"\n  top: \"inception_resnet_v2_b3_residual_eltwise\"\n  eltwise_param {\n    operation: SUM\n  }\n}\nlayer {\n  name: \"inception_resnet_v2_b4_1x1\"\n  type: \"Convolution\"\n  bottom: \"inception_resnet_v2_b3_residual_eltwise\"\n  top: \"inception_resnet_v2_b4_1x1\"\n  param {\n    lr_mult: 1\n    decay_mult: 1\n  }\n  param {\n    lr_mult: 2\n    decay_mult: 0\n  }\n  convolution_param {\n    num_output: 192\n    pad: 0\n    kernel_size: 1\n    stride: 1\n    weight_filler {\n      type: \"xavier\"\n      std: 0.01\n    }\n    bias_filler {\n      type: \"constant\"\n      value: 0.2\n    }\n  }\n}\nlayer {\n  name: \"inception_resnet_v2_b4_1x1_bn\"\n  type: \"BatchNorm\"\n  bottom: \"inception_resnet_v2_b4_1x1\"\n  top: \"inception_resnet_v2_b4_1x1\"\n  batch_norm_param {\n    use_global_stats: false\n  }\n}\nlayer {\n  name: \"inception_resnet_v2_b4_1x1_scale\"\n  type: \"Scale\"\n  bottom: \"inception_resnet_v2_b4_1x1\"\n  top: \"inception_resnet_v2_b4_1x1\"\n  scale_param {\n    bias_term: true\n  }\n}\nlayer {\n  name: \"inception_resnet_v2_b4_1x1_relu\"\n  type: \"ReLU\"\n  bottom: \"inception_resnet_v2_b4_1x1\"\n  top: \"inception_resnet_v2_b4_1x1\"\n}\nlayer {\n  name: \"inception_resnet_v2_b4_1x7_reduce\"\n  type: \"Convolution\"\n  bottom: \"inception_resnet_v2_b3_residual_eltwise\"\n  top: \"inception_resnet_v2_b4_1x7_reduce\"\n  param {\n    lr_mult: 1\n    decay_mult: 1\n  }\n  param {\n    lr_mult: 2\n    decay_mult: 0\n  }\n  convolution_param {\n    num_output: 128\n    pad: 0\n    kernel_size: 1\n    stride: 1\n    weight_filler {\n      type: \"xavier\"\n      std: 0.01\n    }\n    bias_filler {\n      type: \"constant\"\n      value: 0.2\n    }\n  }\n}\nlayer {\n  name: \"inception_resnet_v2_b4_1x7_reduce_bn\"\n  type: \"BatchNorm\"\n  bottom: \"inception_resnet_v2_b4_1x7_reduce\"\n  top: \"inception_resnet_v2_b4_1x7_reduce\"\n  batch_norm_param {\n    use_global_stats: false\n  }\n}\nlayer {\n  name: \"inception_resnet_v2_b4_1x7_reduce_scale\"\n  type: \"Scale\"\n  bottom: \"inception_resnet_v2_b4_1x7_reduce\"\n  top: \"inception_resnet_v2_b4_1x7_reduce\"\n  scale_param {\n    bias_term: true\n  }\n}\nlayer {\n  name: \"inception_resnet_v2_b4_1x7_reduce_relu\"\n  type: \"ReLU\"\n  bottom: \"inception_resnet_v2_b4_1x7_reduce\"\n  top: \"inception_resnet_v2_b4_1x7_reduce\"\n}\nlayer {\n  name: \"inception_resnet_v2_b4_1x7\"\n  type: \"Convolution\"\n  bottom: \"inception_resnet_v2_b4_1x7_reduce\"\n  top: \"inception_resnet_v2_b4_1x7\"\n  param {\n    lr_mult: 1\n    decay_mult: 1\n  }\n  param {\n    lr_mult: 2\n    decay_mult: 0\n  }\n  convolution_param {\n    num_output: 160\n    stride: 1\n    weight_filler {\n      type: \"xavier\"\n      std: 0.01\n    }\n    bias_filler {\n      type: \"constant\"\n      value: 0.2\n    }\n    pad_h: 0\n    pad_w: 3\n    kernel_h: 1\n    kernel_w: 7\n  }\n}\nlayer {\n  name: \"inception_resnet_v2_b4_1x7_bn\"\n  type: \"BatchNorm\"\n  bottom: \"inception_resnet_v2_b4_1x7\"\n  top: \"inception_resnet_v2_b4_1x7\"\n  batch_norm_param {\n    use_global_stats: false\n  }\n}\nlayer {\n  name: \"inception_resnet_v2_b4_1x7_scale\"\n  type: \"Scale\"\n  bottom: \"inception_resnet_v2_b4_1x7\"\n  top: \"inception_resnet_v2_b4_1x7\"\n  scale_param {\n    bias_term: true\n  }\n}\nlayer {\n  name: \"inception_resnet_v2_b4_1x7_relu\"\n  type: \"ReLU\"\n  bottom: \"inception_resnet_v2_b4_1x7\"\n  top: \"inception_resnet_v2_b4_1x7\"\n}\nlayer {\n  name: \"inception_resnet_v2_b4_7x1\"\n  type: \"Convolution\"\n  bottom: \"inception_resnet_v2_b4_1x7\"\n  top: \"inception_resnet_v2_b4_7x1\"\n  param {\n    lr_mult: 1\n    decay_mult: 1\n  }\n  param {\n    lr_mult: 2\n    decay_mult: 0\n  }\n  convolution_param {\n    num_output: 192\n    stride: 1\n    weight_filler {\n      type: \"xavier\"\n      std: 0.01\n    }\n    bias_filler {\n      type: \"constant\"\n      value: 0.2\n    }\n    pad_h: 3\n    pad_w: 0\n    kernel_h: 7\n    kernel_w: 1\n  }\n}\nlayer {\n  name: \"inception_resnet_v2_b4_7x1_bn\"\n  type: \"BatchNorm\"\n  bottom: \"inception_resnet_v2_b4_7x1\"\n  top: \"inception_resnet_v2_b4_7x1\"\n  batch_norm_param {\n    use_global_stats: false\n  }\n}\nlayer {\n  name: \"inception_resnet_v2_b4_7x1_scale\"\n  type: \"Scale\"\n  bottom: \"inception_resnet_v2_b4_7x1\"\n  top: \"inception_resnet_v2_b4_7x1\"\n  scale_param {\n    bias_term: true\n  }\n}\nlayer {\n  name: \"inception_resnet_v2_b4_7x1_relu\"\n  type: \"ReLU\"\n  bottom: \"inception_resnet_v2_b4_7x1\"\n  top: \"inception_resnet_v2_b4_7x1\"\n}\nlayer {\n  name: \"inception_resnet_v2_b4_concat\"\n  type: \"Concat\"\n  bottom: \"inception_resnet_v2_b4_1x1\"\n  bottom: \"inception_resnet_v2_b4_7x1\"\n  top: \"inception_resnet_v2_b4_concat\"\n}\nlayer {\n  name: \"inception_resnet_v2_b4_1x1_2\"\n  type: \"Convolution\"\n  bottom: \"inception_resnet_v2_b4_concat\"\n  top: \"inception_resnet_v2_b4_1x1_2\"\n  param {\n    lr_mult: 1\n    decay_mult: 1\n  }\n  param {\n    lr_mult: 2\n    decay_mult: 0\n  }\n  convolution_param {\n    num_output: 1152\n    pad: 0\n    kernel_size: 1\n    stride: 1\n    weight_filler {\n      type: \"xavier\"\n      std: 0.01\n    }\n    bias_filler {\n      type: \"constant\"\n      value: 0.2\n    }\n  }\n}\nlayer {\n  name: \"inception_resnet_v2_b4_1x1_2_bn\"\n  type: \"BatchNorm\"\n  bottom: \"inception_resnet_v2_b4_1x1_2\"\n  top: \"inception_resnet_v2_b4_1x1_2\"\n  batch_norm_param {\n    use_global_stats: false\n  }\n}\nlayer {\n  name: \"inception_resnet_v2_b4_1x1_2_scale\"\n  type: \"Scale\"\n  bottom: \"inception_resnet_v2_b4_1x1_2\"\n  top: \"inception_resnet_v2_b4_1x1_2\"\n  scale_param {\n    bias_term: true\n  }\n}\nlayer {\n  name: \"inception_resnet_v2_b4_residual_eltwise\"\n  type: \"Eltwise\"\n  bottom: \"inception_resnet_v2_b3_residual_eltwise\"\n  bottom: \"inception_resnet_v2_b4_1x1_2\"\n  top: \"inception_resnet_v2_b4_residual_eltwise\"\n  eltwise_param {\n    operation: SUM\n  }\n}\nlayer {\n  name: \"inception_resnet_v2_b5_1x1\"\n  type: \"Convolution\"\n  bottom: \"inception_resnet_v2_b4_residual_eltwise\"\n  top: \"inception_resnet_v2_b5_1x1\"\n  param {\n    lr_mult: 1\n    decay_mult: 1\n  }\n  param {\n    lr_mult: 2\n    decay_mult: 0\n  }\n  convolution_param {\n    num_output: 192\n    pad: 0\n    kernel_size: 1\n    stride: 1\n    weight_filler {\n      type: \"xavier\"\n      std: 0.01\n    }\n    bias_filler {\n      type: \"constant\"\n      value: 0.2\n    }\n  }\n}\nlayer {\n  name: \"inception_resnet_v2_b5_1x1_bn\"\n  type: \"BatchNorm\"\n  bottom: \"inception_resnet_v2_b5_1x1\"\n  top: \"inception_resnet_v2_b5_1x1\"\n  batch_norm_param {\n    use_global_stats: false\n  }\n}\nlayer {\n  name: \"inception_resnet_v2_b5_1x1_scale\"\n  type: \"Scale\"\n  bottom: \"inception_resnet_v2_b5_1x1\"\n  top: \"inception_resnet_v2_b5_1x1\"\n  scale_param {\n    bias_term: true\n  }\n}\nlayer {\n  name: \"inception_resnet_v2_b5_1x1_relu\"\n  type: \"ReLU\"\n  bottom: \"inception_resnet_v2_b5_1x1\"\n  top: \"inception_resnet_v2_b5_1x1\"\n}\nlayer {\n  name: \"inception_resnet_v2_b5_1x7_reduce\"\n  type: \"Convolution\"\n  bottom: \"inception_resnet_v2_b4_residual_eltwise\"\n  top: \"inception_resnet_v2_b5_1x7_reduce\"\n  param {\n    lr_mult: 1\n    decay_mult: 1\n  }\n  param {\n    lr_mult: 2\n    decay_mult: 0\n  }\n  convolution_param {\n    num_output: 128\n    pad: 0\n    kernel_size: 1\n    stride: 1\n    weight_filler {\n      type: \"xavier\"\n      std: 0.01\n    }\n    bias_filler {\n      type: \"constant\"\n      value: 0.2\n    }\n  }\n}\nlayer {\n  name: \"inception_resnet_v2_b5_1x7_reduce_bn\"\n  type: \"BatchNorm\"\n  bottom: \"inception_resnet_v2_b5_1x7_reduce\"\n  top: \"inception_resnet_v2_b5_1x7_reduce\"\n  batch_norm_param {\n    use_global_stats: false\n  }\n}\nlayer {\n  name: \"inception_resnet_v2_b5_1x7_reduce_scale\"\n  type: \"Scale\"\n  bottom: \"inception_resnet_v2_b5_1x7_reduce\"\n  top: \"inception_resnet_v2_b5_1x7_reduce\"\n  scale_param {\n    bias_term: true\n  }\n}\nlayer {\n  name: \"inception_resnet_v2_b5_1x7_reduce_relu\"\n  type: \"ReLU\"\n  bottom: \"inception_resnet_v2_b5_1x7_reduce\"\n  top: \"inception_resnet_v2_b5_1x7_reduce\"\n}\nlayer {\n  name: \"inception_resnet_v2_b5_1x7\"\n  type: \"Convolution\"\n  bottom: \"inception_resnet_v2_b5_1x7_reduce\"\n  top: \"inception_resnet_v2_b5_1x7\"\n  param {\n    lr_mult: 1\n    decay_mult: 1\n  }\n  param {\n    lr_mult: 2\n    decay_mult: 0\n  }\n  convolution_param {\n    num_output: 160\n    stride: 1\n    weight_filler {\n      type: \"xavier\"\n      std: 0.01\n    }\n    bias_filler {\n      type: \"constant\"\n      value: 0.2\n    }\n    pad_h: 0\n    pad_w: 3\n    kernel_h: 1\n    kernel_w: 7\n  }\n}\nlayer {\n  name: \"inception_resnet_v2_b5_1x7_bn\"\n  type: \"BatchNorm\"\n  bottom: \"inception_resnet_v2_b5_1x7\"\n  top: \"inception_resnet_v2_b5_1x7\"\n  batch_norm_param {\n    use_global_stats: false\n  }\n}\nlayer {\n  name: \"inception_resnet_v2_b5_1x7_scale\"\n  type: \"Scale\"\n  bottom: \"inception_resnet_v2_b5_1x7\"\n  top: \"inception_resnet_v2_b5_1x7\"\n  scale_param {\n    bias_term: true\n  }\n}\nlayer {\n  name: \"inception_resnet_v2_b5_1x7_relu\"\n  type: \"ReLU\"\n  bottom: \"inception_resnet_v2_b5_1x7\"\n  top: \"inception_resnet_v2_b5_1x7\"\n}\nlayer {\n  name: \"inception_resnet_v2_b5_7x1\"\n  type: \"Convolution\"\n  bottom: \"inception_resnet_v2_b5_1x7\"\n  top: \"inception_resnet_v2_b5_7x1\"\n  param {\n    lr_mult: 1\n    decay_mult: 1\n  }\n  param {\n    lr_mult: 2\n    decay_mult: 0\n  }\n  convolution_param {\n    num_output: 192\n    stride: 1\n    weight_filler {\n      type: \"xavier\"\n      std: 0.01\n    }\n    bias_filler {\n      type: \"constant\"\n      value: 0.2\n    }\n    pad_h: 3\n    pad_w: 0\n    kernel_h: 7\n    kernel_w: 1\n  }\n}\nlayer {\n  name: \"inception_resnet_v2_b5_7x1_bn\"\n  type: \"BatchNorm\"\n  bottom: \"inception_resnet_v2_b5_7x1\"\n  top: \"inception_resnet_v2_b5_7x1\"\n  batch_norm_param {\n    use_global_stats: false\n  }\n}\nlayer {\n  name: \"inception_resnet_v2_b5_7x1_scale\"\n  type: \"Scale\"\n  bottom: \"inception_resnet_v2_b5_7x1\"\n  top: \"inception_resnet_v2_b5_7x1\"\n  scale_param {\n    bias_term: true\n  }\n}\nlayer {\n  name: \"inception_resnet_v2_b5_7x1_relu\"\n  type: \"ReLU\"\n  bottom: \"inception_resnet_v2_b5_7x1\"\n  top: \"inception_resnet_v2_b5_7x1\"\n}\nlayer {\n  name: \"inception_resnet_v2_b5_concat\"\n  type: \"Concat\"\n  bottom: \"inception_resnet_v2_b5_1x1\"\n  bottom: \"inception_resnet_v2_b5_7x1\"\n  top: \"inception_resnet_v2_b5_concat\"\n}\nlayer {\n  name: \"inception_resnet_v2_b5_1x1_2\"\n  type: \"Convolution\"\n  bottom: \"inception_resnet_v2_b5_concat\"\n  top: \"inception_resnet_v2_b5_1x1_2\"\n  param {\n    lr_mult: 1\n    decay_mult: 1\n  }\n  param {\n    lr_mult: 2\n    decay_mult: 0\n  }\n  convolution_param {\n    num_output: 1152\n    pad: 0\n    kernel_size: 1\n    stride: 1\n    weight_filler {\n      type: \"xavier\"\n      std: 0.01\n    }\n    bias_filler {\n      type: \"constant\"\n      value: 0.2\n    }\n  }\n}\nlayer {\n  name: \"inception_resnet_v2_b5_1x1_2_bn\"\n  type: \"BatchNorm\"\n  bottom: \"inception_resnet_v2_b5_1x1_2\"\n  top: \"inception_resnet_v2_b5_1x1_2\"\n  batch_norm_param {\n    use_global_stats: false\n  }\n}\nlayer {\n  name: \"inception_resnet_v2_b5_1x1_2_scale\"\n  type: \"Scale\"\n  bottom: \"inception_resnet_v2_b5_1x1_2\"\n  top: \"inception_resnet_v2_b5_1x1_2\"\n  scale_param {\n    bias_term: true\n  }\n}\nlayer {\n  name: \"inception_resnet_v2_b5_residual_eltwise\"\n  type: \"Eltwise\"\n  bottom: \"inception_resnet_v2_b4_residual_eltwise\"\n  bottom: \"inception_resnet_v2_b5_1x1_2\"\n  top: \"inception_resnet_v2_b5_residual_eltwise\"\n  eltwise_param {\n    operation: SUM\n  }\n}\nlayer {\n  name: \"inception_resnet_v2_b6_1x1\"\n  type: \"Convolution\"\n  bottom: \"inception_resnet_v2_b5_residual_eltwise\"\n  top: \"inception_resnet_v2_b6_1x1\"\n  param {\n    lr_mult: 1\n    decay_mult: 1\n  }\n  param {\n    lr_mult: 2\n    decay_mult: 0\n  }\n  convolution_param {\n    num_output: 192\n    pad: 0\n    kernel_size: 1\n    stride: 1\n    weight_filler {\n      type: \"xavier\"\n      std: 0.01\n    }\n    bias_filler {\n      type: \"constant\"\n      value: 0.2\n    }\n  }\n}\nlayer {\n  name: \"inception_resnet_v2_b6_1x1_bn\"\n  type: \"BatchNorm\"\n  bottom: \"inception_resnet_v2_b6_1x1\"\n  top: \"inception_resnet_v2_b6_1x1\"\n  batch_norm_param {\n    use_global_stats: false\n  }\n}\nlayer {\n  name: \"inception_resnet_v2_b6_1x1_scale\"\n  type: \"Scale\"\n  bottom: \"inception_resnet_v2_b6_1x1\"\n  top: \"inception_resnet_v2_b6_1x1\"\n  scale_param {\n    bias_term: true\n  }\n}\nlayer {\n  name: \"inception_resnet_v2_b6_1x1_relu\"\n  type: \"ReLU\"\n  bottom: \"inception_resnet_v2_b6_1x1\"\n  top: \"inception_resnet_v2_b6_1x1\"\n}\nlayer {\n  name: \"inception_resnet_v2_b6_1x7_reduce\"\n  type: \"Convolution\"\n  bottom: \"inception_resnet_v2_b5_residual_eltwise\"\n  top: \"inception_resnet_v2_b6_1x7_reduce\"\n  param {\n    lr_mult: 1\n    decay_mult: 1\n  }\n  param {\n    lr_mult: 2\n    decay_mult: 0\n  }\n  convolution_param {\n    num_output: 128\n    pad: 0\n    kernel_size: 1\n    stride: 1\n    weight_filler {\n      type: \"xavier\"\n      std: 0.01\n    }\n    bias_filler {\n      type: \"constant\"\n      value: 0.2\n    }\n  }\n}\nlayer {\n  name: \"inception_resnet_v2_b6_1x7_reduce_bn\"\n  type: \"BatchNorm\"\n  bottom: \"inception_resnet_v2_b6_1x7_reduce\"\n  top: \"inception_resnet_v2_b6_1x7_reduce\"\n  batch_norm_param {\n    use_global_stats: false\n  }\n}\nlayer {\n  name: \"inception_resnet_v2_b6_1x7_reduce_scale\"\n  type: \"Scale\"\n  bottom: \"inception_resnet_v2_b6_1x7_reduce\"\n  top: \"inception_resnet_v2_b6_1x7_reduce\"\n  scale_param {\n    bias_term: true\n  }\n}\nlayer {\n  name: \"inception_resnet_v2_b6_1x7_reduce_relu\"\n  type: \"ReLU\"\n  bottom: \"inception_resnet_v2_b6_1x7_reduce\"\n  top: \"inception_resnet_v2_b6_1x7_reduce\"\n}\nlayer {\n  name: \"inception_resnet_v2_b6_1x7\"\n  type: \"Convolution\"\n  bottom: \"inception_resnet_v2_b6_1x7_reduce\"\n  top: \"inception_resnet_v2_b6_1x7\"\n  param {\n    lr_mult: 1\n    decay_mult: 1\n  }\n  param {\n    lr_mult: 2\n    decay_mult: 0\n  }\n  convolution_param {\n    num_output: 160\n    stride: 1\n    weight_filler {\n      type: \"xavier\"\n      std: 0.01\n    }\n    bias_filler {\n      type: \"constant\"\n      value: 0.2\n    }\n    pad_h: 0\n    pad_w: 3\n    kernel_h: 1\n    kernel_w: 7\n  }\n}\nlayer {\n  name: \"inception_resnet_v2_b6_1x7_bn\"\n  type: \"BatchNorm\"\n  bottom: \"inception_resnet_v2_b6_1x7\"\n  top: \"inception_resnet_v2_b6_1x7\"\n  batch_norm_param {\n    use_global_stats: false\n  }\n}\nlayer {\n  name: \"inception_resnet_v2_b6_1x7_scale\"\n  type: \"Scale\"\n  bottom: \"inception_resnet_v2_b6_1x7\"\n  top: \"inception_resnet_v2_b6_1x7\"\n  scale_param {\n    bias_term: true\n  }\n}\nlayer {\n  name: \"inception_resnet_v2_b6_1x7_relu\"\n  type: \"ReLU\"\n  bottom: \"inception_resnet_v2_b6_1x7\"\n  top: \"inception_resnet_v2_b6_1x7\"\n}\nlayer {\n  name: \"inception_resnet_v2_b6_7x1\"\n  type: \"Convolution\"\n  bottom: \"inception_resnet_v2_b6_1x7\"\n  top: \"inception_resnet_v2_b6_7x1\"\n  param {\n    lr_mult: 1\n    decay_mult: 1\n  }\n  param {\n    lr_mult: 2\n    decay_mult: 0\n  }\n  convolution_param {\n    num_output: 192\n    stride: 1\n    weight_filler {\n      type: \"xavier\"\n      std: 0.01\n    }\n    bias_filler {\n      type: \"constant\"\n      value: 0.2\n    }\n    pad_h: 3\n    pad_w: 0\n    kernel_h: 7\n    kernel_w: 1\n  }\n}\nlayer {\n  name: \"inception_resnet_v2_b6_7x1_bn\"\n  type: \"BatchNorm\"\n  bottom: \"inception_resnet_v2_b6_7x1\"\n  top: \"inception_resnet_v2_b6_7x1\"\n  batch_norm_param {\n    use_global_stats: false\n  }\n}\nlayer {\n  name: \"inception_resnet_v2_b6_7x1_scale\"\n  type: \"Scale\"\n  bottom: \"inception_resnet_v2_b6_7x1\"\n  top: \"inception_resnet_v2_b6_7x1\"\n  scale_param {\n    bias_term: true\n  }\n}\nlayer {\n  name: \"inception_resnet_v2_b6_7x1_relu\"\n  type: \"ReLU\"\n  bottom: \"inception_resnet_v2_b6_7x1\"\n  top: \"inception_resnet_v2_b6_7x1\"\n}\nlayer {\n  name: \"inception_resnet_v2_b6_concat\"\n  type: \"Concat\"\n  bottom: \"inception_resnet_v2_b6_1x1\"\n  bottom: \"inception_resnet_v2_b6_7x1\"\n  top: \"inception_resnet_v2_b6_concat\"\n}\nlayer {\n  name: \"inception_resnet_v2_b6_1x1_2\"\n  type: \"Convolution\"\n  bottom: \"inception_resnet_v2_b6_concat\"\n  top: \"inception_resnet_v2_b6_1x1_2\"\n  param {\n    lr_mult: 1\n    decay_mult: 1\n  }\n  param {\n    lr_mult: 2\n    decay_mult: 0\n  }\n  convolution_param {\n    num_output: 1152\n    pad: 0\n    kernel_size: 1\n    stride: 1\n    weight_filler {\n      type: \"xavier\"\n      std: 0.01\n    }\n    bias_filler {\n      type: \"constant\"\n      value: 0.2\n    }\n  }\n}\nlayer {\n  name: \"inception_resnet_v2_b6_1x1_2_bn\"\n  type: \"BatchNorm\"\n  bottom: \"inception_resnet_v2_b6_1x1_2\"\n  top: \"inception_resnet_v2_b6_1x1_2\"\n  batch_norm_param {\n    use_global_stats: false\n  }\n}\nlayer {\n  name: \"inception_resnet_v2_b6_1x1_2_scale\"\n  type: \"Scale\"\n  bottom: \"inception_resnet_v2_b6_1x1_2\"\n  top: \"inception_resnet_v2_b6_1x1_2\"\n  scale_param {\n    bias_term: true\n  }\n}\nlayer {\n  name: \"inception_resnet_v2_b6_residual_eltwise\"\n  type: \"Eltwise\"\n  bottom: \"inception_resnet_v2_b5_residual_eltwise\"\n  bottom: \"inception_resnet_v2_b6_1x1_2\"\n  top: \"inception_resnet_v2_b6_residual_eltwise\"\n  eltwise_param {\n    operation: SUM\n  }\n}\nlayer {\n  name: \"inception_resnet_v2_b7_1x1\"\n  type: \"Convolution\"\n  bottom: \"inception_resnet_v2_b6_residual_eltwise\"\n  top: \"inception_resnet_v2_b7_1x1\"\n  param {\n    lr_mult: 1\n    decay_mult: 1\n  }\n  param {\n    lr_mult: 2\n    decay_mult: 0\n  }\n  convolution_param {\n    num_output: 192\n    pad: 0\n    kernel_size: 1\n    stride: 1\n    weight_filler {\n      type: \"xavier\"\n      std: 0.01\n    }\n    bias_filler {\n      type: \"constant\"\n      value: 0.2\n    }\n  }\n}\nlayer {\n  name: \"inception_resnet_v2_b7_1x1_bn\"\n  type: \"BatchNorm\"\n  bottom: \"inception_resnet_v2_b7_1x1\"\n  top: \"inception_resnet_v2_b7_1x1\"\n  batch_norm_param {\n    use_global_stats: false\n  }\n}\nlayer {\n  name: \"inception_resnet_v2_b7_1x1_scale\"\n  type: \"Scale\"\n  bottom: \"inception_resnet_v2_b7_1x1\"\n  top: \"inception_resnet_v2_b7_1x1\"\n  scale_param {\n    bias_term: true\n  }\n}\nlayer {\n  name: \"inception_resnet_v2_b7_1x1_relu\"\n  type: \"ReLU\"\n  bottom: \"inception_resnet_v2_b7_1x1\"\n  top: \"inception_resnet_v2_b7_1x1\"\n}\nlayer {\n  name: \"inception_resnet_v2_b7_1x7_reduce\"\n  type: \"Convolution\"\n  bottom: \"inception_resnet_v2_b6_residual_eltwise\"\n  top: \"inception_resnet_v2_b7_1x7_reduce\"\n  param {\n    lr_mult: 1\n    decay_mult: 1\n  }\n  param {\n    lr_mult: 2\n    decay_mult: 0\n  }\n  convolution_param {\n    num_output: 128\n    pad: 0\n    kernel_size: 1\n    stride: 1\n    weight_filler {\n      type: \"xavier\"\n      std: 0.01\n    }\n    bias_filler {\n      type: \"constant\"\n      value: 0.2\n    }\n  }\n}\nlayer {\n  name: \"inception_resnet_v2_b7_1x7_reduce_bn\"\n  type: \"BatchNorm\"\n  bottom: \"inception_resnet_v2_b7_1x7_reduce\"\n  top: \"inception_resnet_v2_b7_1x7_reduce\"\n  batch_norm_param {\n    use_global_stats: false\n  }\n}\nlayer {\n  name: \"inception_resnet_v2_b7_1x7_reduce_scale\"\n  type: \"Scale\"\n  bottom: \"inception_resnet_v2_b7_1x7_reduce\"\n  top: \"inception_resnet_v2_b7_1x7_reduce\"\n  scale_param {\n    bias_term: true\n  }\n}\nlayer {\n  name: \"inception_resnet_v2_b7_1x7_reduce_relu\"\n  type: \"ReLU\"\n  bottom: \"inception_resnet_v2_b7_1x7_reduce\"\n  top: \"inception_resnet_v2_b7_1x7_reduce\"\n}\nlayer {\n  name: \"inception_resnet_v2_b7_1x7\"\n  type: \"Convolution\"\n  bottom: \"inception_resnet_v2_b7_1x7_reduce\"\n  top: \"inception_resnet_v2_b7_1x7\"\n  param {\n    lr_mult: 1\n    decay_mult: 1\n  }\n  param {\n    lr_mult: 2\n    decay_mult: 0\n  }\n  convolution_param {\n    num_output: 160\n    stride: 1\n    weight_filler {\n      type: \"xavier\"\n      std: 0.01\n    }\n    bias_filler {\n      type: \"constant\"\n      value: 0.2\n    }\n    pad_h: 0\n    pad_w: 3\n    kernel_h: 1\n    kernel_w: 7\n  }\n}\nlayer {\n  name: \"inception_resnet_v2_b7_1x7_bn\"\n  type: \"BatchNorm\"\n  bottom: \"inception_resnet_v2_b7_1x7\"\n  top: \"inception_resnet_v2_b7_1x7\"\n  batch_norm_param {\n    use_global_stats: false\n  }\n}\nlayer {\n  name: \"inception_resnet_v2_b7_1x7_scale\"\n  type: \"Scale\"\n  bottom: \"inception_resnet_v2_b7_1x7\"\n  top: \"inception_resnet_v2_b7_1x7\"\n  scale_param {\n    bias_term: true\n  }\n}\nlayer {\n  name: \"inception_resnet_v2_b7_1x7_relu\"\n  type: \"ReLU\"\n  bottom: \"inception_resnet_v2_b7_1x7\"\n  top: \"inception_resnet_v2_b7_1x7\"\n}\nlayer {\n  name: \"inception_resnet_v2_b7_7x1\"\n  type: \"Convolution\"\n  bottom: \"inception_resnet_v2_b7_1x7\"\n  top: \"inception_resnet_v2_b7_7x1\"\n  param {\n    lr_mult: 1\n    decay_mult: 1\n  }\n  param {\n    lr_mult: 2\n    decay_mult: 0\n  }\n  convolution_param {\n    num_output: 192\n    stride: 1\n    weight_filler {\n      type: \"xavier\"\n      std: 0.01\n    }\n    bias_filler {\n      type: \"constant\"\n      value: 0.2\n    }\n    pad_h: 3\n    pad_w: 0\n    kernel_h: 7\n    kernel_w: 1\n  }\n}\nlayer {\n  name: \"inception_resnet_v2_b7_7x1_bn\"\n  type: \"BatchNorm\"\n  bottom: \"inception_resnet_v2_b7_7x1\"\n  top: \"inception_resnet_v2_b7_7x1\"\n  batch_norm_param {\n    use_global_stats: false\n  }\n}\nlayer {\n  name: \"inception_resnet_v2_b7_7x1_scale\"\n  type: \"Scale\"\n  bottom: \"inception_resnet_v2_b7_7x1\"\n  top: \"inception_resnet_v2_b7_7x1\"\n  scale_param {\n    bias_term: true\n  }\n}\nlayer {\n  name: \"inception_resnet_v2_b7_7x1_relu\"\n  type: \"ReLU\"\n  bottom: \"inception_resnet_v2_b7_7x1\"\n  top: \"inception_resnet_v2_b7_7x1\"\n}\nlayer {\n  name: \"inception_resnet_v2_b7_concat\"\n  type: \"Concat\"\n  bottom: \"inception_resnet_v2_b7_1x1\"\n  bottom: \"inception_resnet_v2_b7_7x1\"\n  top: \"inception_resnet_v2_b7_concat\"\n}\nlayer {\n  name: \"inception_resnet_v2_b7_1x1_2\"\n  type: \"Convolution\"\n  bottom: \"inception_resnet_v2_b7_concat\"\n  top: \"inception_resnet_v2_b7_1x1_2\"\n  param {\n    lr_mult: 1\n    decay_mult: 1\n  }\n  param {\n    lr_mult: 2\n    decay_mult: 0\n  }\n  convolution_param {\n    num_output: 1152\n    pad: 0\n    kernel_size: 1\n    stride: 1\n    weight_filler {\n      type: \"xavier\"\n      std: 0.01\n    }\n    bias_filler {\n      type: \"constant\"\n      value: 0.2\n    }\n  }\n}\nlayer {\n  name: \"inception_resnet_v2_b7_1x1_2_bn\"\n  type: \"BatchNorm\"\n  bottom: \"inception_resnet_v2_b7_1x1_2\"\n  top: \"inception_resnet_v2_b7_1x1_2\"\n  batch_norm_param {\n    use_global_stats: false\n  }\n}\nlayer {\n  name: \"inception_resnet_v2_b7_1x1_2_scale\"\n  type: \"Scale\"\n  bottom: \"inception_resnet_v2_b7_1x1_2\"\n  top: \"inception_resnet_v2_b7_1x1_2\"\n  scale_param {\n    bias_term: true\n  }\n}\nlayer {\n  name: \"inception_resnet_v2_b7_residual_eltwise\"\n  type: \"Eltwise\"\n  bottom: \"inception_resnet_v2_b6_residual_eltwise\"\n  bottom: \"inception_resnet_v2_b7_1x1_2\"\n  top: \"inception_resnet_v2_b7_residual_eltwise\"\n  eltwise_param {\n    operation: SUM\n  }\n}\nlayer {\n  name: \"inception_resnet_v2_b8_1x1\"\n  type: \"Convolution\"\n  bottom: \"inception_resnet_v2_b7_residual_eltwise\"\n  top: \"inception_resnet_v2_b8_1x1\"\n  param {\n    lr_mult: 1\n    decay_mult: 1\n  }\n  param {\n    lr_mult: 2\n    decay_mult: 0\n  }\n  convolution_param {\n    num_output: 192\n    pad: 0\n    kernel_size: 1\n    stride: 1\n    weight_filler {\n      type: \"xavier\"\n      std: 0.01\n    }\n    bias_filler {\n      type: \"constant\"\n      value: 0.2\n    }\n  }\n}\nlayer {\n  name: \"inception_resnet_v2_b8_1x1_bn\"\n  type: \"BatchNorm\"\n  bottom: \"inception_resnet_v2_b8_1x1\"\n  top: \"inception_resnet_v2_b8_1x1\"\n  batch_norm_param {\n    use_global_stats: false\n  }\n}\nlayer {\n  name: \"inception_resnet_v2_b8_1x1_scale\"\n  type: \"Scale\"\n  bottom: \"inception_resnet_v2_b8_1x1\"\n  top: \"inception_resnet_v2_b8_1x1\"\n  scale_param {\n    bias_term: true\n  }\n}\nlayer {\n  name: \"inception_resnet_v2_b8_1x1_relu\"\n  type: \"ReLU\"\n  bottom: \"inception_resnet_v2_b8_1x1\"\n  top: \"inception_resnet_v2_b8_1x1\"\n}\nlayer {\n  name: \"inception_resnet_v2_b8_1x7_reduce\"\n  type: \"Convolution\"\n  bottom: \"inception_resnet_v2_b7_residual_eltwise\"\n  top: \"inception_resnet_v2_b8_1x7_reduce\"\n  param {\n    lr_mult: 1\n    decay_mult: 1\n  }\n  param {\n    lr_mult: 2\n    decay_mult: 0\n  }\n  convolution_param {\n    num_output: 128\n    pad: 0\n    kernel_size: 1\n    stride: 1\n    weight_filler {\n      type: \"xavier\"\n      std: 0.01\n    }\n    bias_filler {\n      type: \"constant\"\n      value: 0.2\n    }\n  }\n}\nlayer {\n  name: \"inception_resnet_v2_b8_1x7_reduce_bn\"\n  type: \"BatchNorm\"\n  bottom: \"inception_resnet_v2_b8_1x7_reduce\"\n  top: \"inception_resnet_v2_b8_1x7_reduce\"\n  batch_norm_param {\n    use_global_stats: false\n  }\n}\nlayer {\n  name: \"inception_resnet_v2_b8_1x7_reduce_scale\"\n  type: \"Scale\"\n  bottom: \"inception_resnet_v2_b8_1x7_reduce\"\n  top: \"inception_resnet_v2_b8_1x7_reduce\"\n  scale_param {\n    bias_term: true\n  }\n}\nlayer {\n  name: \"inception_resnet_v2_b8_1x7_reduce_relu\"\n  type: \"ReLU\"\n  bottom: \"inception_resnet_v2_b8_1x7_reduce\"\n  top: \"inception_resnet_v2_b8_1x7_reduce\"\n}\nlayer {\n  name: \"inception_resnet_v2_b8_1x7\"\n  type: \"Convolution\"\n  bottom: \"inception_resnet_v2_b8_1x7_reduce\"\n  top: \"inception_resnet_v2_b8_1x7\"\n  param {\n    lr_mult: 1\n    decay_mult: 1\n  }\n  param {\n    lr_mult: 2\n    decay_mult: 0\n  }\n  convolution_param {\n    num_output: 160\n    stride: 1\n    weight_filler {\n      type: \"xavier\"\n      std: 0.01\n    }\n    bias_filler {\n      type: \"constant\"\n      value: 0.2\n    }\n    pad_h: 0\n    pad_w: 3\n    kernel_h: 1\n    kernel_w: 7\n  }\n}\nlayer {\n  name: \"inception_resnet_v2_b8_1x7_bn\"\n  type: \"BatchNorm\"\n  bottom: \"inception_resnet_v2_b8_1x7\"\n  top: \"inception_resnet_v2_b8_1x7\"\n  batch_norm_param {\n    use_global_stats: false\n  }\n}\nlayer {\n  name: \"inception_resnet_v2_b8_1x7_scale\"\n  type: \"Scale\"\n  bottom: \"inception_resnet_v2_b8_1x7\"\n  top: \"inception_resnet_v2_b8_1x7\"\n  scale_param {\n    bias_term: true\n  }\n}\nlayer {\n  name: \"inception_resnet_v2_b8_1x7_relu\"\n  type: \"ReLU\"\n  bottom: \"inception_resnet_v2_b8_1x7\"\n  top: \"inception_resnet_v2_b8_1x7\"\n}\nlayer {\n  name: \"inception_resnet_v2_b8_7x1\"\n  type: \"Convolution\"\n  bottom: \"inception_resnet_v2_b8_1x7\"\n  top: \"inception_resnet_v2_b8_7x1\"\n  param {\n    lr_mult: 1\n    decay_mult: 1\n  }\n  param {\n    lr_mult: 2\n    decay_mult: 0\n  }\n  convolution_param {\n    num_output: 192\n    stride: 1\n    weight_filler {\n      type: \"xavier\"\n      std: 0.01\n    }\n    bias_filler {\n      type: \"constant\"\n      value: 0.2\n    }\n    pad_h: 3\n    pad_w: 0\n    kernel_h: 7\n    kernel_w: 1\n  }\n}\nlayer {\n  name: \"inception_resnet_v2_b8_7x1_bn\"\n  type: \"BatchNorm\"\n  bottom: \"inception_resnet_v2_b8_7x1\"\n  top: \"inception_resnet_v2_b8_7x1\"\n  batch_norm_param {\n    use_global_stats: false\n  }\n}\nlayer {\n  name: \"inception_resnet_v2_b8_7x1_scale\"\n  type: \"Scale\"\n  bottom: \"inception_resnet_v2_b8_7x1\"\n  top: \"inception_resnet_v2_b8_7x1\"\n  scale_param {\n    bias_term: true\n  }\n}\nlayer {\n  name: \"inception_resnet_v2_b8_7x1_relu\"\n  type: \"ReLU\"\n  bottom: \"inception_resnet_v2_b8_7x1\"\n  top: \"inception_resnet_v2_b8_7x1\"\n}\nlayer {\n  name: \"inception_resnet_v2_b8_concat\"\n  type: \"Concat\"\n  bottom: \"inception_resnet_v2_b8_1x1\"\n  bottom: \"inception_resnet_v2_b8_7x1\"\n  top: \"inception_resnet_v2_b8_concat\"\n}\nlayer {\n  name: \"inception_resnet_v2_b8_1x1_2\"\n  type: \"Convolution\"\n  bottom: \"inception_resnet_v2_b8_concat\"\n  top: \"inception_resnet_v2_b8_1x1_2\"\n  param {\n    lr_mult: 1\n    decay_mult: 1\n  }\n  param {\n    lr_mult: 2\n    decay_mult: 0\n  }\n  convolution_param {\n    num_output: 1152\n    pad: 0\n    kernel_size: 1\n    stride: 1\n    weight_filler {\n      type: \"xavier\"\n      std: 0.01\n    }\n    bias_filler {\n      type: \"constant\"\n      value: 0.2\n    }\n  }\n}\nlayer {\n  name: \"inception_resnet_v2_b8_1x1_2_bn\"\n  type: \"BatchNorm\"\n  bottom: \"inception_resnet_v2_b8_1x1_2\"\n  top: \"inception_resnet_v2_b8_1x1_2\"\n  batch_norm_param {\n    use_global_stats: false\n  }\n}\nlayer {\n  name: \"inception_resnet_v2_b8_1x1_2_scale\"\n  type: \"Scale\"\n  bottom: \"inception_resnet_v2_b8_1x1_2\"\n  top: \"inception_resnet_v2_b8_1x1_2\"\n  scale_param {\n    bias_term: true\n  }\n}\nlayer {\n  name: \"inception_resnet_v2_b8_residual_eltwise\"\n  type: \"Eltwise\"\n  bottom: \"inception_resnet_v2_b7_residual_eltwise\"\n  bottom: \"inception_resnet_v2_b8_1x1_2\"\n  top: \"inception_resnet_v2_b8_residual_eltwise\"\n  eltwise_param {\n    operation: SUM\n  }\n}\nlayer {\n  name: \"inception_resnet_v2_b9_1x1\"\n  type: \"Convolution\"\n  bottom: \"inception_resnet_v2_b8_residual_eltwise\"\n  top: \"inception_resnet_v2_b9_1x1\"\n  param {\n    lr_mult: 1\n    decay_mult: 1\n  }\n  param {\n    lr_mult: 2\n    decay_mult: 0\n  }\n  convolution_param {\n    num_output: 192\n    pad: 0\n    kernel_size: 1\n    stride: 1\n    weight_filler {\n      type: \"xavier\"\n      std: 0.01\n    }\n    bias_filler {\n      type: \"constant\"\n      value: 0.2\n    }\n  }\n}\nlayer {\n  name: \"inception_resnet_v2_b9_1x1_bn\"\n  type: \"BatchNorm\"\n  bottom: \"inception_resnet_v2_b9_1x1\"\n  top: \"inception_resnet_v2_b9_1x1\"\n  batch_norm_param {\n    use_global_stats: false\n  }\n}\nlayer {\n  name: \"inception_resnet_v2_b9_1x1_scale\"\n  type: \"Scale\"\n  bottom: \"inception_resnet_v2_b9_1x1\"\n  top: \"inception_resnet_v2_b9_1x1\"\n  scale_param {\n    bias_term: true\n  }\n}\nlayer {\n  name: \"inception_resnet_v2_b9_1x1_relu\"\n  type: \"ReLU\"\n  bottom: \"inception_resnet_v2_b9_1x1\"\n  top: \"inception_resnet_v2_b9_1x1\"\n}\nlayer {\n  name: \"inception_resnet_v2_b9_1x7_reduce\"\n  type: \"Convolution\"\n  bottom: \"inception_resnet_v2_b8_residual_eltwise\"\n  top: \"inception_resnet_v2_b9_1x7_reduce\"\n  param {\n    lr_mult: 1\n    decay_mult: 1\n  }\n  param {\n    lr_mult: 2\n    decay_mult: 0\n  }\n  convolution_param {\n    num_output: 128\n    pad: 0\n    kernel_size: 1\n    stride: 1\n    weight_filler {\n      type: \"xavier\"\n      std: 0.01\n    }\n    bias_filler {\n      type: \"constant\"\n      value: 0.2\n    }\n  }\n}\nlayer {\n  name: \"inception_resnet_v2_b9_1x7_reduce_bn\"\n  type: \"BatchNorm\"\n  bottom: \"inception_resnet_v2_b9_1x7_reduce\"\n  top: \"inception_resnet_v2_b9_1x7_reduce\"\n  batch_norm_param {\n    use_global_stats: false\n  }\n}\nlayer {\n  name: \"inception_resnet_v2_b9_1x7_reduce_scale\"\n  type: \"Scale\"\n  bottom: \"inception_resnet_v2_b9_1x7_reduce\"\n  top: \"inception_resnet_v2_b9_1x7_reduce\"\n  scale_param {\n    bias_term: true\n  }\n}\nlayer {\n  name: \"inception_resnet_v2_b9_1x7_reduce_relu\"\n  type: \"ReLU\"\n  bottom: \"inception_resnet_v2_b9_1x7_reduce\"\n  top: \"inception_resnet_v2_b9_1x7_reduce\"\n}\nlayer {\n  name: \"inception_resnet_v2_b9_1x7\"\n  type: \"Convolution\"\n  bottom: \"inception_resnet_v2_b9_1x7_reduce\"\n  top: \"inception_resnet_v2_b9_1x7\"\n  param {\n    lr_mult: 1\n    decay_mult: 1\n  }\n  param {\n    lr_mult: 2\n    decay_mult: 0\n  }\n  convolution_param {\n    num_output: 160\n    stride: 1\n    weight_filler {\n      type: \"xavier\"\n      std: 0.01\n    }\n    bias_filler {\n      type: \"constant\"\n      value: 0.2\n    }\n    pad_h: 0\n    pad_w: 3\n    kernel_h: 1\n    kernel_w: 7\n  }\n}\nlayer {\n  name: \"inception_resnet_v2_b9_1x7_bn\"\n  type: \"BatchNorm\"\n  bottom: \"inception_resnet_v2_b9_1x7\"\n  top: \"inception_resnet_v2_b9_1x7\"\n  batch_norm_param {\n    use_global_stats: false\n  }\n}\nlayer {\n  name: \"inception_resnet_v2_b9_1x7_scale\"\n  type: \"Scale\"\n  bottom: \"inception_resnet_v2_b9_1x7\"\n  top: \"inception_resnet_v2_b9_1x7\"\n  scale_param {\n    bias_term: true\n  }\n}\nlayer {\n  name: \"inception_resnet_v2_b9_1x7_relu\"\n  type: \"ReLU\"\n  bottom: \"inception_resnet_v2_b9_1x7\"\n  top: \"inception_resnet_v2_b9_1x7\"\n}\nlayer {\n  name: \"inception_resnet_v2_b9_7x1\"\n  type: \"Convolution\"\n  bottom: \"inception_resnet_v2_b9_1x7\"\n  top: \"inception_resnet_v2_b9_7x1\"\n  param {\n    lr_mult: 1\n    decay_mult: 1\n  }\n  param {\n    lr_mult: 2\n    decay_mult: 0\n  }\n  convolution_param {\n    num_output: 192\n    stride: 1\n    weight_filler {\n      type: \"xavier\"\n      std: 0.01\n    }\n    bias_filler {\n      type: \"constant\"\n      value: 0.2\n    }\n    pad_h: 3\n    pad_w: 0\n    kernel_h: 7\n    kernel_w: 1\n  }\n}\nlayer {\n  name: \"inception_resnet_v2_b9_7x1_bn\"\n  type: \"BatchNorm\"\n  bottom: \"inception_resnet_v2_b9_7x1\"\n  top: \"inception_resnet_v2_b9_7x1\"\n  batch_norm_param {\n    use_global_stats: false\n  }\n}\nlayer {\n  name: \"inception_resnet_v2_b9_7x1_scale\"\n  type: \"Scale\"\n  bottom: \"inception_resnet_v2_b9_7x1\"\n  top: \"inception_resnet_v2_b9_7x1\"\n  scale_param {\n    bias_term: true\n  }\n}\nlayer {\n  name: \"inception_resnet_v2_b9_7x1_relu\"\n  type: \"ReLU\"\n  bottom: \"inception_resnet_v2_b9_7x1\"\n  top: \"inception_resnet_v2_b9_7x1\"\n}\nlayer {\n  name: \"inception_resnet_v2_b9_concat\"\n  type: \"Concat\"\n  bottom: \"inception_resnet_v2_b9_1x1\"\n  bottom: \"inception_resnet_v2_b9_7x1\"\n  top: \"inception_resnet_v2_b9_concat\"\n}\nlayer {\n  name: \"inception_resnet_v2_b9_1x1_2\"\n  type: \"Convolution\"\n  bottom: \"inception_resnet_v2_b9_concat\"\n  top: \"inception_resnet_v2_b9_1x1_2\"\n  param {\n    lr_mult: 1\n    decay_mult: 1\n  }\n  param {\n    lr_mult: 2\n    decay_mult: 0\n  }\n  convolution_param {\n    num_output: 1152\n    pad: 0\n    kernel_size: 1\n    stride: 1\n    weight_filler {\n      type: \"xavier\"\n      std: 0.01\n    }\n    bias_filler {\n      type: \"constant\"\n      value: 0.2\n    }\n  }\n}\nlayer {\n  name: \"inception_resnet_v2_b9_1x1_2_bn\"\n  type: \"BatchNorm\"\n  bottom: \"inception_resnet_v2_b9_1x1_2\"\n  top: \"inception_resnet_v2_b9_1x1_2\"\n  batch_norm_param {\n    use_global_stats: false\n  }\n}\nlayer {\n  name: \"inception_resnet_v2_b9_1x1_2_scale\"\n  type: \"Scale\"\n  bottom: \"inception_resnet_v2_b9_1x1_2\"\n  top: \"inception_resnet_v2_b9_1x1_2\"\n  scale_param {\n    bias_term: true\n  }\n}\nlayer {\n  name: \"inception_resnet_v2_b9_residual_eltwise\"\n  type: \"Eltwise\"\n  bottom: \"inception_resnet_v2_b8_residual_eltwise\"\n  bottom: \"inception_resnet_v2_b9_1x1_2\"\n  top: \"inception_resnet_v2_b9_residual_eltwise\"\n  eltwise_param {\n    operation: SUM\n  }\n}\nlayer {\n  name: \"inception_resnet_v2_b10_1x1\"\n  type: \"Convolution\"\n  bottom: \"inception_resnet_v2_b9_residual_eltwise\"\n  top: \"inception_resnet_v2_b10_1x1\"\n  param {\n    lr_mult: 1\n    decay_mult: 1\n  }\n  param {\n    lr_mult: 2\n    decay_mult: 0\n  }\n  convolution_param {\n    num_output: 192\n    pad: 0\n    kernel_size: 1\n    stride: 1\n    weight_filler {\n      type: \"xavier\"\n      std: 0.01\n    }\n    bias_filler {\n      type: \"constant\"\n      value: 0.2\n    }\n  }\n}\nlayer {\n  name: \"inception_resnet_v2_b10_1x1_bn\"\n  type: \"BatchNorm\"\n  bottom: \"inception_resnet_v2_b10_1x1\"\n  top: \"inception_resnet_v2_b10_1x1\"\n  batch_norm_param {\n    use_global_stats: false\n  }\n}\nlayer {\n  name: \"inception_resnet_v2_b10_1x1_scale\"\n  type: \"Scale\"\n  bottom: \"inception_resnet_v2_b10_1x1\"\n  top: \"inception_resnet_v2_b10_1x1\"\n  scale_param {\n    bias_term: true\n  }\n}\nlayer {\n  name: \"inception_resnet_v2_b10_1x1_relu\"\n  type: \"ReLU\"\n  bottom: \"inception_resnet_v2_b10_1x1\"\n  top: \"inception_resnet_v2_b10_1x1\"\n}\nlayer {\n  name: \"inception_resnet_v2_b10_1x7_reduce\"\n  type: \"Convolution\"\n  bottom: \"inception_resnet_v2_b9_residual_eltwise\"\n  top: \"inception_resnet_v2_b10_1x7_reduce\"\n  param {\n    lr_mult: 1\n    decay_mult: 1\n  }\n  param {\n    lr_mult: 2\n    decay_mult: 0\n  }\n  convolution_param {\n    num_output: 128\n    pad: 0\n    kernel_size: 1\n    stride: 1\n    weight_filler {\n      type: \"xavier\"\n      std: 0.01\n    }\n    bias_filler {\n      type: \"constant\"\n      value: 0.2\n    }\n  }\n}\nlayer {\n  name: \"inception_resnet_v2_b10_1x7_reduce_bn\"\n  type: \"BatchNorm\"\n  bottom: \"inception_resnet_v2_b10_1x7_reduce\"\n  top: \"inception_resnet_v2_b10_1x7_reduce\"\n  batch_norm_param {\n    use_global_stats: false\n  }\n}\nlayer {\n  name: \"inception_resnet_v2_b10_1x7_reduce_scale\"\n  type: \"Scale\"\n  bottom: \"inception_resnet_v2_b10_1x7_reduce\"\n  top: \"inception_resnet_v2_b10_1x7_reduce\"\n  scale_param {\n    bias_term: true\n  }\n}\nlayer {\n  name: \"inception_resnet_v2_b10_1x7_reduce_relu\"\n  type: \"ReLU\"\n  bottom: \"inception_resnet_v2_b10_1x7_reduce\"\n  top: \"inception_resnet_v2_b10_1x7_reduce\"\n}\nlayer {\n  name: \"inception_resnet_v2_b10_1x7\"\n  type: \"Convolution\"\n  bottom: \"inception_resnet_v2_b10_1x7_reduce\"\n  top: \"inception_resnet_v2_b10_1x7\"\n  param {\n    lr_mult: 1\n    decay_mult: 1\n  }\n  param {\n    lr_mult: 2\n    decay_mult: 0\n  }\n  convolution_param {\n    num_output: 160\n    stride: 1\n    weight_filler {\n      type: \"xavier\"\n      std: 0.01\n    }\n    bias_filler {\n      type: \"constant\"\n      value: 0.2\n    }\n    pad_h: 0\n    pad_w: 3\n    kernel_h: 1\n    kernel_w: 7\n  }\n}\nlayer {\n  name: \"inception_resnet_v2_b10_1x7_bn\"\n  type: \"BatchNorm\"\n  bottom: \"inception_resnet_v2_b10_1x7\"\n  top: \"inception_resnet_v2_b10_1x7\"\n  batch_norm_param {\n    use_global_stats: false\n  }\n}\nlayer {\n  name: \"inception_resnet_v2_b10_1x7_scale\"\n  type: \"Scale\"\n  bottom: \"inception_resnet_v2_b10_1x7\"\n  top: \"inception_resnet_v2_b10_1x7\"\n  scale_param {\n    bias_term: true\n  }\n}\nlayer {\n  name: \"inception_resnet_v2_b10_1x7_relu\"\n  type: \"ReLU\"\n  bottom: \"inception_resnet_v2_b10_1x7\"\n  top: \"inception_resnet_v2_b10_1x7\"\n}\nlayer {\n  name: \"inception_resnet_v2_b10_7x1\"\n  type: \"Convolution\"\n  bottom: \"inception_resnet_v2_b10_1x7\"\n  top: \"inception_resnet_v2_b10_7x1\"\n  param {\n    lr_mult: 1\n    decay_mult: 1\n  }\n  param {\n    lr_mult: 2\n    decay_mult: 0\n  }\n  convolution_param {\n    num_output: 192\n    stride: 1\n    weight_filler {\n      type: \"xavier\"\n      std: 0.01\n    }\n    bias_filler {\n      type: \"constant\"\n      value: 0.2\n    }\n    pad_h: 3\n    pad_w: 0\n    kernel_h: 7\n    kernel_w: 1\n  }\n}\nlayer {\n  name: \"inception_resnet_v2_b10_7x1_bn\"\n  type: \"BatchNorm\"\n  bottom: \"inception_resnet_v2_b10_7x1\"\n  top: \"inception_resnet_v2_b10_7x1\"\n  batch_norm_param {\n    use_global_stats: false\n  }\n}\nlayer {\n  name: \"inception_resnet_v2_b10_7x1_scale\"\n  type: \"Scale\"\n  bottom: \"inception_resnet_v2_b10_7x1\"\n  top: \"inception_resnet_v2_b10_7x1\"\n  scale_param {\n    bias_term: true\n  }\n}\nlayer {\n  name: \"inception_resnet_v2_b10_7x1_relu\"\n  type: \"ReLU\"\n  bottom: \"inception_resnet_v2_b10_7x1\"\n  top: \"inception_resnet_v2_b10_7x1\"\n}\nlayer {\n  name: \"inception_resnet_v2_b10_concat\"\n  type: \"Concat\"\n  bottom: \"inception_resnet_v2_b10_1x1\"\n  bottom: \"inception_resnet_v2_b10_7x1\"\n  top: \"inception_resnet_v2_b10_concat\"\n}\nlayer {\n  name: \"inception_resnet_v2_b10_1x1_2\"\n  type: \"Convolution\"\n  bottom: \"inception_resnet_v2_b10_concat\"\n  top: \"inception_resnet_v2_b10_1x1_2\"\n  param {\n    lr_mult: 1\n    decay_mult: 1\n  }\n  param {\n    lr_mult: 2\n    decay_mult: 0\n  }\n  convolution_param {\n    num_output: 1152\n    pad: 0\n    kernel_size: 1\n    stride: 1\n    weight_filler {\n      type: \"xavier\"\n      std: 0.01\n    }\n    bias_filler {\n      type: \"constant\"\n      value: 0.2\n    }\n  }\n}\nlayer {\n  name: \"inception_resnet_v2_b10_1x1_2_bn\"\n  type: \"BatchNorm\"\n  bottom: \"inception_resnet_v2_b10_1x1_2\"\n  top: \"inception_resnet_v2_b10_1x1_2\"\n  batch_norm_param {\n    use_global_stats: false\n  }\n}\nlayer {\n  name: \"inception_resnet_v2_b10_1x1_2_scale\"\n  type: \"Scale\"\n  bottom: \"inception_resnet_v2_b10_1x1_2\"\n  top: \"inception_resnet_v2_b10_1x1_2\"\n  scale_param {\n    bias_term: true\n  }\n}\nlayer {\n  name: \"inception_resnet_v2_b10_residual_eltwise\"\n  type: \"Eltwise\"\n  bottom: \"inception_resnet_v2_b9_residual_eltwise\"\n  bottom: \"inception_resnet_v2_b10_1x1_2\"\n  top: \"inception_resnet_v2_b10_residual_eltwise\"\n  eltwise_param {\n    operation: SUM\n  }\n}\nlayer {\n  name: \"reduction_b_pool\"\n  type: \"Pooling\"\n  bottom: \"inception_resnet_v2_b10_residual_eltwise\"\n  top: \"reduction_b_pool\"\n  pooling_param {\n    pool: MAX\n    kernel_size: 3\n    stride: 2\n  }\n}\nlayer {\n  name: \"reduction_b_3x3_reduce\"\n  type: \"Convolution\"\n  bottom: \"inception_resnet_v2_b10_residual_eltwise\"\n  top: \"reduction_b_3x3_reduce\"\n  param {\n    lr_mult: 1\n    decay_mult: 1\n  }\n  param {\n    lr_mult: 2\n    decay_mult: 0\n  }\n  convolution_param {\n    num_output: 256\n    pad: 0\n    kernel_size: 1\n    stride: 1\n    weight_filler {\n      type: \"xavier\"\n      std: 0.01\n    }\n    bias_filler {\n      type: \"constant\"\n      value: 0.2\n    }\n  }\n}\nlayer {\n  name: \"reduction_b_3x3_reduce_bn\"\n  type: \"BatchNorm\"\n  bottom: \"reduction_b_3x3_reduce\"\n  top: \"reduction_b_3x3_reduce\"\n  batch_norm_param {\n    use_global_stats: false\n  }\n}\nlayer {\n  name: \"reduction_b_3x3_reduce_scale\"\n  type: \"Scale\"\n  bottom: \"reduction_b_3x3_reduce\"\n  top: \"reduction_b_3x3_reduce\"\n  scale_param {\n    bias_term: true\n  }\n}\nlayer {\n  name: \"reduction_b_3x3_reduce_relu\"\n  type: \"ReLU\"\n  bottom: \"reduction_b_3x3_reduce\"\n  top: \"reduction_b_3x3_reduce\"\n}\nlayer {\n  name: \"reduction_b_3x3\"\n  type: \"Convolution\"\n  bottom: \"reduction_b_3x3_reduce\"\n  top: \"reduction_b_3x3\"\n  param {\n    lr_mult: 1\n    decay_mult: 1\n  }\n  param {\n    lr_mult: 2\n    decay_mult: 0\n  }\n  convolution_param {\n    num_output: 384\n    pad: 0\n    kernel_size: 3\n    stride: 2\n    weight_filler {\n      type: \"xavier\"\n      std: 0.01\n    }\n    bias_filler {\n      type: \"constant\"\n      value: 0.2\n    }\n  }\n}\nlayer {\n  name: \"reduction_b_3x3_bn\"\n  type: \"BatchNorm\"\n  bottom: \"reduction_b_3x3\"\n  top: \"reduction_b_3x3\"\n  batch_norm_param {\n    use_global_stats: false\n  }\n}\nlayer {\n  name: \"reduction_b_3x3_scale\"\n  type: \"Scale\"\n  bottom: \"reduction_b_3x3\"\n  top: \"reduction_b_3x3\"\n  scale_param {\n    bias_term: true\n  }\n}\nlayer {\n  name: \"reduction_b_3x3_relu\"\n  type: \"ReLU\"\n  bottom: \"reduction_b_3x3\"\n  top: \"reduction_b_3x3\"\n}\nlayer {\n  name: \"reduction_b_3x3_2_reduce\"\n  type: \"Convolution\"\n  bottom: \"inception_resnet_v2_b10_residual_eltwise\"\n  top: \"reduction_b_3x3_2_reduce\"\n  param {\n    lr_mult: 1\n    decay_mult: 1\n  }\n  param {\n    lr_mult: 2\n    decay_mult: 0\n  }\n  convolution_param {\n    num_output: 256\n    pad: 0\n    kernel_size: 1\n    stride: 1\n    weight_filler {\n      type: \"xavier\"\n      std: 0.01\n    }\n    bias_filler {\n      type: \"constant\"\n      value: 0.2\n    }\n  }\n}\nlayer {\n  name: \"reduction_b_3x3_2_reduce_bn\"\n  type: \"BatchNorm\"\n  bottom: \"reduction_b_3x3_2_reduce\"\n  top: \"reduction_b_3x3_2_reduce\"\n  batch_norm_param {\n    use_global_stats: false\n  }\n}\nlayer {\n  name: \"reduction_b_3x3_2_reduce_scale\"\n  type: \"Scale\"\n  bottom: \"reduction_b_3x3_2_reduce\"\n  top: \"reduction_b_3x3_2_reduce\"\n  scale_param {\n    bias_term: true\n  }\n}\nlayer {\n  name: \"reduction_b_3x3_2_reduce_relu\"\n  type: \"ReLU\"\n  bottom: \"reduction_b_3x3_2_reduce\"\n  top: \"reduction_b_3x3_2_reduce\"\n}\nlayer {\n  name: \"reduction_b_3x3_2\"\n  type: \"Convolution\"\n  bottom: \"reduction_b_3x3_2_reduce\"\n  top: \"reduction_b_3x3_2\"\n  param {\n    lr_mult: 1\n    decay_mult: 1\n  }\n  param {\n    lr_mult: 2\n    decay_mult: 0\n  }\n  convolution_param {\n    num_output: 256\n    pad: 0\n    kernel_size: 3\n    stride: 2\n    weight_filler {\n      type: \"xavier\"\n      std: 0.01\n    }\n    bias_filler {\n      type: \"constant\"\n      value: 0.2\n    }\n  }\n}\nlayer {\n  name: \"reduction_b_3x3_2_bn\"\n  type: \"BatchNorm\"\n  bottom: \"reduction_b_3x3_2\"\n  top: \"reduction_b_3x3_2\"\n  batch_norm_param {\n    use_global_stats: false\n  }\n}\nlayer {\n  name: \"reduction_b_3x3_2_scale\"\n  type: \"Scale\"\n  bottom: \"reduction_b_3x3_2\"\n  top: \"reduction_b_3x3_2\"\n  scale_param {\n    bias_term: true\n  }\n}\nlayer {\n  name: \"reduction_b_3x3_2_relu\"\n  type: \"ReLU\"\n  bottom: \"reduction_b_3x3_2\"\n  top: \"reduction_b_3x3_2\"\n}\nlayer {\n  name: \"reduction_b_3x3_3_reduce\"\n  type: \"Convolution\"\n  bottom: \"inception_resnet_v2_b10_residual_eltwise\"\n  top: \"reduction_b_3x3_3_reduce\"\n  param {\n    lr_mult: 1\n    decay_mult: 1\n  }\n  param {\n    lr_mult: 2\n    decay_mult: 0\n  }\n  convolution_param {\n    num_output: 256\n    pad: 0\n    kernel_size: 1\n    stride: 1\n    weight_filler {\n      type: \"xavier\"\n      std: 0.01\n    }\n    bias_filler {\n      type: \"constant\"\n      value: 0.2\n    }\n  }\n}\nlayer {\n  name: \"reduction_b_3x3_3_reduce_bn\"\n  type: \"BatchNorm\"\n  bottom: \"reduction_b_3x3_3_reduce\"\n  top: \"reduction_b_3x3_3_reduce\"\n  batch_norm_param {\n    use_global_stats: false\n  }\n}\nlayer {\n  name: \"reduction_b_3x3_3_reduce_scale\"\n  type: \"Scale\"\n  bottom: \"reduction_b_3x3_3_reduce\"\n  top: \"reduction_b_3x3_3_reduce\"\n  scale_param {\n    bias_term: true\n  }\n}\nlayer {\n  name: \"reduction_b_3x3_3_reduce_relu\"\n  type: \"ReLU\"\n  bottom: \"reduction_b_3x3_3_reduce\"\n  top: \"reduction_b_3x3_3_reduce\"\n}\nlayer {\n  name: \"reduction_b_3x3_3\"\n  type: \"Convolution\"\n  bottom: \"reduction_b_3x3_3_reduce\"\n  top: \"reduction_b_3x3_3\"\n  param {\n    lr_mult: 1\n    decay_mult: 1\n  }\n  param {\n    lr_mult: 2\n    decay_mult: 0\n  }\n  convolution_param {\n    num_output: 256\n    pad: 1\n    kernel_size: 3\n    stride: 1\n    weight_filler {\n      type: \"xavier\"\n      std: 0.01\n    }\n    bias_filler {\n      type: \"constant\"\n      value: 0.2\n    }\n  }\n}\nlayer {\n  name: \"reduction_b_3x3_3_bn\"\n  type: \"BatchNorm\"\n  bottom: \"reduction_b_3x3_3\"\n  top: \"reduction_b_3x3_3\"\n  batch_norm_param {\n    use_global_stats: false\n  }\n}\nlayer {\n  name: \"reduction_b_3x3_3_scale\"\n  type: \"Scale\"\n  bottom: \"reduction_b_3x3_3\"\n  top: \"reduction_b_3x3_3\"\n  scale_param {\n    bias_term: true\n  }\n}\nlayer {\n  name: \"reduction_b_3x3_3_relu\"\n  type: \"ReLU\"\n  bottom: \"reduction_b_3x3_3\"\n  top: \"reduction_b_3x3_3\"\n}\nlayer {\n  name: \"reduction_b_3x3_4\"\n  type: \"Convolution\"\n  bottom: \"reduction_b_3x3_3\"\n  top: \"reduction_b_3x3_4\"\n  param {\n    lr_mult: 1\n    decay_mult: 1\n  }\n  param {\n    lr_mult: 2\n    decay_mult: 0\n  }\n  convolution_param {\n    num_output: 256\n    pad: 0\n    kernel_size: 3\n    stride: 2\n    weight_filler {\n      type: \"xavier\"\n      std: 0.01\n    }\n    bias_filler {\n      type: \"constant\"\n      value: 0.2\n    }\n  }\n}\nlayer {\n  name: \"reduction_b_3x3_4_bn\"\n  type: \"BatchNorm\"\n  bottom: \"reduction_b_3x3_4\"\n  top: \"reduction_b_3x3_4\"\n  batch_norm_param {\n    use_global_stats: false\n  }\n}\nlayer {\n  name: \"reduction_b_3x3_4_scale\"\n  type: \"Scale\"\n  bottom: \"reduction_b_3x3_4\"\n  top: \"reduction_b_3x3_4\"\n  scale_param {\n    bias_term: true\n  }\n}\nlayer {\n  name: \"reduction_b_3x3_4_relu\"\n  type: \"ReLU\"\n  bottom: \"reduction_b_3x3_4\"\n  top: \"reduction_b_3x3_4\"\n}\nlayer {\n  name: \"reduction_b_concat\"\n  type: \"Concat\"\n  bottom: \"reduction_b_pool\"\n  bottom: \"reduction_b_3x3\"\n  bottom: \"reduction_b_3x3_2\"\n  bottom: \"reduction_b_3x3_4\"\n  top: \"reduction_b_concat\"\n}\nlayer {\n  name: \"inception_resnet_v2_c1_1x1\"\n  type: \"Convolution\"\n  bottom: \"reduction_b_concat\"\n  top: \"inception_resnet_v2_c1_1x1\"\n  param {\n    lr_mult: 1\n    decay_mult: 1\n  }\n  param {\n    lr_mult: 2\n    decay_mult: 0\n  }\n  convolution_param {\n    num_output: 192\n    pad: 0\n    kernel_size: 1\n    stride: 1\n    weight_filler {\n      type: \"xavier\"\n      std: 0.01\n    }\n    bias_filler {\n      type: \"constant\"\n      value: 0.2\n    }\n  }\n}\nlayer {\n  name: \"inception_resnet_v2_c1_1x1_bn\"\n  type: \"BatchNorm\"\n  bottom: \"inception_resnet_v2_c1_1x1\"\n  top: \"inception_resnet_v2_c1_1x1\"\n  batch_norm_param {\n    use_global_stats: false\n  }\n}\nlayer {\n  name: \"inception_resnet_v2_c1_1x1_scale\"\n  type: \"Scale\"\n  bottom: \"inception_resnet_v2_c1_1x1\"\n  top: \"inception_resnet_v2_c1_1x1\"\n  scale_param {\n    bias_term: true\n  }\n}\nlayer {\n  name: \"inception_resnet_v2_c1_1x1_relu\"\n  type: \"ReLU\"\n  bottom: \"inception_resnet_v2_c1_1x1\"\n  top: \"inception_resnet_v2_c1_1x1\"\n}\nlayer {\n  name: \"inception_resnet_v2_c1_1x3_reduce\"\n  type: \"Convolution\"\n  bottom: \"reduction_b_concat\"\n  top: \"inception_resnet_v2_c1_1x3_reduce\"\n  param {\n    lr_mult: 1\n    decay_mult: 1\n  }\n  param {\n    lr_mult: 2\n    decay_mult: 0\n  }\n  convolution_param {\n    num_output: 192\n    pad: 0\n    kernel_size: 1\n    stride: 1\n    weight_filler {\n      type: \"xavier\"\n      std: 0.01\n    }\n    bias_filler {\n      type: \"constant\"\n      value: 0.2\n    }\n  }\n}\nlayer {\n  name: \"inception_resnet_v2_c1_1x3_reduce_bn\"\n  type: \"BatchNorm\"\n  bottom: \"inception_resnet_v2_c1_1x3_reduce\"\n  top: \"inception_resnet_v2_c1_1x3_reduce\"\n  batch_norm_param {\n    use_global_stats: false\n  }\n}\nlayer {\n  name: \"inception_resnet_v2_c1_1x3_reduce_scale\"\n  type: \"Scale\"\n  bottom: \"inception_resnet_v2_c1_1x3_reduce\"\n  top: \"inception_resnet_v2_c1_1x3_reduce\"\n  scale_param {\n    bias_term: true\n  }\n}\nlayer {\n  name: \"inception_resnet_v2_c1_1x3_reduce_relu\"\n  type: \"ReLU\"\n  bottom: \"inception_resnet_v2_c1_1x3_reduce\"\n  top: \"inception_resnet_v2_c1_1x3_reduce\"\n}\nlayer {\n  name: \"inception_resnet_v2_c1_1x3\"\n  type: \"Convolution\"\n  bottom: \"inception_resnet_v2_c1_1x3_reduce\"\n  top: \"inception_resnet_v2_c1_1x3\"\n  param {\n    lr_mult: 1\n    decay_mult: 1\n  }\n  param {\n    lr_mult: 2\n    decay_mult: 0\n  }\n  convolution_param {\n    num_output: 224\n    stride: 1\n    weight_filler {\n      type: \"xavier\"\n      std: 0.01\n    }\n    bias_filler {\n      type: \"constant\"\n      value: 0.2\n    }\n    pad_h: 0\n    pad_w: 1\n    kernel_h: 1\n    kernel_w: 3\n  }\n}\nlayer {\n  name: \"inception_resnet_v2_c1_1x3_bn\"\n  type: \"BatchNorm\"\n  bottom: \"inception_resnet_v2_c1_1x3\"\n  top: \"inception_resnet_v2_c1_1x3\"\n  batch_norm_param {\n    use_global_stats: false\n  }\n}\nlayer {\n  name: \"inception_resnet_v2_c1_1x3_scale\"\n  type: \"Scale\"\n  bottom: \"inception_resnet_v2_c1_1x3\"\n  top: \"inception_resnet_v2_c1_1x3\"\n  scale_param {\n    bias_term: true\n  }\n}\nlayer {\n  name: \"inception_resnet_v2_c1_1x3_relu\"\n  type: \"ReLU\"\n  bottom: \"inception_resnet_v2_c1_1x3\"\n  top: \"inception_resnet_v2_c1_1x3\"\n}\nlayer {\n  name: \"inception_resnet_v2_c1_3x1\"\n  type: \"Convolution\"\n  bottom: \"inception_resnet_v2_c1_1x3\"\n  top: \"inception_resnet_v2_c1_3x1\"\n  param {\n    lr_mult: 1\n    decay_mult: 1\n  }\n  param {\n    lr_mult: 2\n    decay_mult: 0\n  }\n  convolution_param {\n    num_output: 256\n    stride: 1\n    weight_filler {\n      type: \"xavier\"\n      std: 0.01\n    }\n    bias_filler {\n      type: \"constant\"\n      value: 0.2\n    }\n    pad_h: 1\n    pad_w: 0\n    kernel_h: 3\n    kernel_w: 1\n  }\n}\nlayer {\n  name: \"inception_resnet_v2_c1_3x1_bn\"\n  type: \"BatchNorm\"\n  bottom: \"inception_resnet_v2_c1_3x1\"\n  top: \"inception_resnet_v2_c1_3x1\"\n  batch_norm_param {\n    use_global_stats: false\n  }\n}\nlayer {\n  name: \"inception_resnet_v2_c1_3x1_scale\"\n  type: \"Scale\"\n  bottom: \"inception_resnet_v2_c1_3x1\"\n  top: \"inception_resnet_v2_c1_3x1\"\n  scale_param {\n    bias_term: true\n  }\n}\nlayer {\n  name: \"inception_resnet_v2_c1_3x1_relu\"\n  type: \"ReLU\"\n  bottom: \"inception_resnet_v2_c1_3x1\"\n  top: \"inception_resnet_v2_c1_3x1\"\n}\nlayer {\n  name: \"inception_resnet_v2_c1_concat\"\n  type: \"Concat\"\n  bottom: \"inception_resnet_v2_c1_1x1\"\n  bottom: \"inception_resnet_v2_c1_3x1\"\n  top: \"inception_resnet_v2_c1_concat\"\n}\nlayer {\n  name: \"inception_resnet_v2_c1_1x1_2\"\n  type: \"Convolution\"\n  bottom: \"inception_resnet_v2_c1_concat\"\n  top: \"inception_resnet_v2_c1_1x1_2\"\n  param {\n    lr_mult: 1\n    decay_mult: 1\n  }\n  param {\n    lr_mult: 2\n    decay_mult: 0\n  }\n  convolution_param {\n    num_output: 2048\n    pad: 0\n    kernel_size: 1\n    stride: 1\n    weight_filler {\n      type: \"xavier\"\n      std: 0.01\n    }\n    bias_filler {\n      type: \"constant\"\n      value: 0.2\n    }\n  }\n}\nlayer {\n  name: \"inception_resnet_v2_c1_1x1_2_bn\"\n  type: \"BatchNorm\"\n  bottom: \"inception_resnet_v2_c1_1x1_2\"\n  top: \"inception_resnet_v2_c1_1x1_2\"\n  batch_norm_param {\n    use_global_stats: false\n  }\n}\nlayer {\n  name: \"inception_resnet_v2_c1_1x1_2_scale\"\n  type: \"Scale\"\n  bottom: \"inception_resnet_v2_c1_1x1_2\"\n  top: \"inception_resnet_v2_c1_1x1_2\"\n  scale_param {\n    bias_term: true\n  }\n}\nlayer {\n  name: \"inception_resnet_v2_c1_residual_eltwise\"\n  type: \"Eltwise\"\n  bottom: \"reduction_b_concat\"\n  bottom: \"inception_resnet_v2_c1_1x1_2\"\n  top: \"inception_resnet_v2_c1_residual_eltwise\"\n  eltwise_param {\n    operation: SUM\n  }\n}\nlayer {\n  name: \"inception_resnet_v2_c2_1x1\"\n  type: \"Convolution\"\n  bottom: \"inception_resnet_v2_c1_residual_eltwise\"\n  top: \"inception_resnet_v2_c2_1x1\"\n  param {\n    lr_mult: 1\n    decay_mult: 1\n  }\n  param {\n    lr_mult: 2\n    decay_mult: 0\n  }\n  convolution_param {\n    num_output: 192\n    pad: 0\n    kernel_size: 1\n    stride: 1\n    weight_filler {\n      type: \"xavier\"\n      std: 0.01\n    }\n    bias_filler {\n      type: \"constant\"\n      value: 0.2\n    }\n  }\n}\nlayer {\n  name: \"inception_resnet_v2_c2_1x1_bn\"\n  type: \"BatchNorm\"\n  bottom: \"inception_resnet_v2_c2_1x1\"\n  top: \"inception_resnet_v2_c2_1x1\"\n  batch_norm_param {\n    use_global_stats: false\n  }\n}\nlayer {\n  name: \"inception_resnet_v2_c2_1x1_scale\"\n  type: \"Scale\"\n  bottom: \"inception_resnet_v2_c2_1x1\"\n  top: \"inception_resnet_v2_c2_1x1\"\n  scale_param {\n    bias_term: true\n  }\n}\nlayer {\n  name: \"inception_resnet_v2_c2_1x1_relu\"\n  type: \"ReLU\"\n  bottom: \"inception_resnet_v2_c2_1x1\"\n  top: \"inception_resnet_v2_c2_1x1\"\n}\nlayer {\n  name: \"inception_resnet_v2_c2_1x3_reduce\"\n  type: \"Convolution\"\n  bottom: \"inception_resnet_v2_c1_residual_eltwise\"\n  top: \"inception_resnet_v2_c2_1x3_reduce\"\n  param {\n    lr_mult: 1\n    decay_mult: 1\n  }\n  param {\n    lr_mult: 2\n    decay_mult: 0\n  }\n  convolution_param {\n    num_output: 192\n    pad: 0\n    kernel_size: 1\n    stride: 1\n    weight_filler {\n      type: \"xavier\"\n      std: 0.01\n    }\n    bias_filler {\n      type: \"constant\"\n      value: 0.2\n    }\n  }\n}\nlayer {\n  name: \"inception_resnet_v2_c2_1x3_reduce_bn\"\n  type: \"BatchNorm\"\n  bottom: \"inception_resnet_v2_c2_1x3_reduce\"\n  top: \"inception_resnet_v2_c2_1x3_reduce\"\n  batch_norm_param {\n    use_global_stats: false\n  }\n}\nlayer {\n  name: \"inception_resnet_v2_c2_1x3_reduce_scale\"\n  type: \"Scale\"\n  bottom: \"inception_resnet_v2_c2_1x3_reduce\"\n  top: \"inception_resnet_v2_c2_1x3_reduce\"\n  scale_param {\n    bias_term: true\n  }\n}\nlayer {\n  name: \"inception_resnet_v2_c2_1x3_reduce_relu\"\n  type: \"ReLU\"\n  bottom: \"inception_resnet_v2_c2_1x3_reduce\"\n  top: \"inception_resnet_v2_c2_1x3_reduce\"\n}\nlayer {\n  name: \"inception_resnet_v2_c2_1x3\"\n  type: \"Convolution\"\n  bottom: \"inception_resnet_v2_c2_1x3_reduce\"\n  top: \"inception_resnet_v2_c2_1x3\"\n  param {\n    lr_mult: 1\n    decay_mult: 1\n  }\n  param {\n    lr_mult: 2\n    decay_mult: 0\n  }\n  convolution_param {\n    num_output: 224\n    stride: 1\n    weight_filler {\n      type: \"xavier\"\n      std: 0.01\n    }\n    bias_filler {\n      type: \"constant\"\n      value: 0.2\n    }\n    pad_h: 0\n    pad_w: 1\n    kernel_h: 1\n    kernel_w: 3\n  }\n}\nlayer {\n  name: \"inception_resnet_v2_c2_1x3_bn\"\n  type: \"BatchNorm\"\n  bottom: \"inception_resnet_v2_c2_1x3\"\n  top: \"inception_resnet_v2_c2_1x3\"\n  batch_norm_param {\n    use_global_stats: false\n  }\n}\nlayer {\n  name: \"inception_resnet_v2_c2_1x3_scale\"\n  type: \"Scale\"\n  bottom: \"inception_resnet_v2_c2_1x3\"\n  top: \"inception_resnet_v2_c2_1x3\"\n  scale_param {\n    bias_term: true\n  }\n}\nlayer {\n  name: \"inception_resnet_v2_c2_1x3_relu\"\n  type: \"ReLU\"\n  bottom: \"inception_resnet_v2_c2_1x3\"\n  top: \"inception_resnet_v2_c2_1x3\"\n}\nlayer {\n  name: \"inception_resnet_v2_c2_3x1\"\n  type: \"Convolution\"\n  bottom: \"inception_resnet_v2_c2_1x3\"\n  top: \"inception_resnet_v2_c2_3x1\"\n  param {\n    lr_mult: 1\n    decay_mult: 1\n  }\n  param {\n    lr_mult: 2\n    decay_mult: 0\n  }\n  convolution_param {\n    num_output: 256\n    stride: 1\n    weight_filler {\n      type: \"xavier\"\n      std: 0.01\n    }\n    bias_filler {\n      type: \"constant\"\n      value: 0.2\n    }\n    pad_h: 1\n    pad_w: 0\n    kernel_h: 3\n    kernel_w: 1\n  }\n}\nlayer {\n  name: \"inception_resnet_v2_c2_3x1_bn\"\n  type: \"BatchNorm\"\n  bottom: \"inception_resnet_v2_c2_3x1\"\n  top: \"inception_resnet_v2_c2_3x1\"\n  batch_norm_param {\n    use_global_stats: false\n  }\n}\nlayer {\n  name: \"inception_resnet_v2_c2_3x1_scale\"\n  type: \"Scale\"\n  bottom: \"inception_resnet_v2_c2_3x1\"\n  top: \"inception_resnet_v2_c2_3x1\"\n  scale_param {\n    bias_term: true\n  }\n}\nlayer {\n  name: \"inception_resnet_v2_c2_3x1_relu\"\n  type: \"ReLU\"\n  bottom: \"inception_resnet_v2_c2_3x1\"\n  top: \"inception_resnet_v2_c2_3x1\"\n}\nlayer {\n  name: \"inception_resnet_v2_c2_concat\"\n  type: \"Concat\"\n  bottom: \"inception_resnet_v2_c2_1x1\"\n  bottom: \"inception_resnet_v2_c2_3x1\"\n  top: \"inception_resnet_v2_c2_concat\"\n}\nlayer {\n  name: \"inception_resnet_v2_c2_1x1_2\"\n  type: \"Convolution\"\n  bottom: \"inception_resnet_v2_c2_concat\"\n  top: \"inception_resnet_v2_c2_1x1_2\"\n  param {\n    lr_mult: 1\n    decay_mult: 1\n  }\n  param {\n    lr_mult: 2\n    decay_mult: 0\n  }\n  convolution_param {\n    num_output: 2048\n    pad: 0\n    kernel_size: 1\n    stride: 1\n    weight_filler {\n      type: \"xavier\"\n      std: 0.01\n    }\n    bias_filler {\n      type: \"constant\"\n      value: 0.2\n    }\n  }\n}\nlayer {\n  name: \"inception_resnet_v2_c2_1x1_2_bn\"\n  type: \"BatchNorm\"\n  bottom: \"inception_resnet_v2_c2_1x1_2\"\n  top: \"inception_resnet_v2_c2_1x1_2\"\n  batch_norm_param {\n    use_global_stats: false\n  }\n}\nlayer {\n  name: \"inception_resnet_v2_c2_1x1_2_scale\"\n  type: \"Scale\"\n  bottom: \"inception_resnet_v2_c2_1x1_2\"\n  top: \"inception_resnet_v2_c2_1x1_2\"\n  scale_param {\n    bias_term: true\n  }\n}\nlayer {\n  name: \"inception_resnet_v2_c2_residual_eltwise\"\n  type: \"Eltwise\"\n  bottom: \"inception_resnet_v2_c1_residual_eltwise\"\n  bottom: \"inception_resnet_v2_c2_1x1_2\"\n  top: \"inception_resnet_v2_c2_residual_eltwise\"\n  eltwise_param {\n    operation: SUM\n  }\n}\nlayer {\n  name: \"inception_resnet_v2_c3_1x1\"\n  type: \"Convolution\"\n  bottom: \"inception_resnet_v2_c2_residual_eltwise\"\n  top: \"inception_resnet_v2_c3_1x1\"\n  param {\n    lr_mult: 1\n    decay_mult: 1\n  }\n  param {\n    lr_mult: 2\n    decay_mult: 0\n  }\n  convolution_param {\n    num_output: 192\n    pad: 0\n    kernel_size: 1\n    stride: 1\n    weight_filler {\n      type: \"xavier\"\n      std: 0.01\n    }\n    bias_filler {\n      type: \"constant\"\n      value: 0.2\n    }\n  }\n}\nlayer {\n  name: \"inception_resnet_v2_c3_1x1_bn\"\n  type: \"BatchNorm\"\n  bottom: \"inception_resnet_v2_c3_1x1\"\n  top: \"inception_resnet_v2_c3_1x1\"\n  batch_norm_param {\n    use_global_stats: false\n  }\n}\nlayer {\n  name: \"inception_resnet_v2_c3_1x1_scale\"\n  type: \"Scale\"\n  bottom: \"inception_resnet_v2_c3_1x1\"\n  top: \"inception_resnet_v2_c3_1x1\"\n  scale_param {\n    bias_term: true\n  }\n}\nlayer {\n  name: \"inception_resnet_v2_c3_1x1_relu\"\n  type: \"ReLU\"\n  bottom: \"inception_resnet_v2_c3_1x1\"\n  top: \"inception_resnet_v2_c3_1x1\"\n}\nlayer {\n  name: \"inception_resnet_v2_c3_1x3_reduce\"\n  type: \"Convolution\"\n  bottom: \"inception_resnet_v2_c2_residual_eltwise\"\n  top: \"inception_resnet_v2_c3_1x3_reduce\"\n  param {\n    lr_mult: 1\n    decay_mult: 1\n  }\n  param {\n    lr_mult: 2\n    decay_mult: 0\n  }\n  convolution_param {\n    num_output: 192\n    pad: 0\n    kernel_size: 1\n    stride: 1\n    weight_filler {\n      type: \"xavier\"\n      std: 0.01\n    }\n    bias_filler {\n      type: \"constant\"\n      value: 0.2\n    }\n  }\n}\nlayer {\n  name: \"inception_resnet_v2_c3_1x3_reduce_bn\"\n  type: \"BatchNorm\"\n  bottom: \"inception_resnet_v2_c3_1x3_reduce\"\n  top: \"inception_resnet_v2_c3_1x3_reduce\"\n  batch_norm_param {\n    use_global_stats: false\n  }\n}\nlayer {\n  name: \"inception_resnet_v2_c3_1x3_reduce_scale\"\n  type: \"Scale\"\n  bottom: \"inception_resnet_v2_c3_1x3_reduce\"\n  top: \"inception_resnet_v2_c3_1x3_reduce\"\n  scale_param {\n    bias_term: true\n  }\n}\nlayer {\n  name: \"inception_resnet_v2_c3_1x3_reduce_relu\"\n  type: \"ReLU\"\n  bottom: \"inception_resnet_v2_c3_1x3_reduce\"\n  top: \"inception_resnet_v2_c3_1x3_reduce\"\n}\nlayer {\n  name: \"inception_resnet_v2_c3_1x3\"\n  type: \"Convolution\"\n  bottom: \"inception_resnet_v2_c3_1x3_reduce\"\n  top: \"inception_resnet_v2_c3_1x3\"\n  param {\n    lr_mult: 1\n    decay_mult: 1\n  }\n  param {\n    lr_mult: 2\n    decay_mult: 0\n  }\n  convolution_param {\n    num_output: 224\n    stride: 1\n    weight_filler {\n      type: \"xavier\"\n      std: 0.01\n    }\n    bias_filler {\n      type: \"constant\"\n      value: 0.2\n    }\n    pad_h: 0\n    pad_w: 1\n    kernel_h: 1\n    kernel_w: 3\n  }\n}\nlayer {\n  name: \"inception_resnet_v2_c3_1x3_bn\"\n  type: \"BatchNorm\"\n  bottom: \"inception_resnet_v2_c3_1x3\"\n  top: \"inception_resnet_v2_c3_1x3\"\n  batch_norm_param {\n    use_global_stats: false\n  }\n}\nlayer {\n  name: \"inception_resnet_v2_c3_1x3_scale\"\n  type: \"Scale\"\n  bottom: \"inception_resnet_v2_c3_1x3\"\n  top: \"inception_resnet_v2_c3_1x3\"\n  scale_param {\n    bias_term: true\n  }\n}\nlayer {\n  name: \"inception_resnet_v2_c3_1x3_relu\"\n  type: \"ReLU\"\n  bottom: \"inception_resnet_v2_c3_1x3\"\n  top: \"inception_resnet_v2_c3_1x3\"\n}\nlayer {\n  name: \"inception_resnet_v2_c3_3x1\"\n  type: \"Convolution\"\n  bottom: \"inception_resnet_v2_c3_1x3\"\n  top: \"inception_resnet_v2_c3_3x1\"\n  param {\n    lr_mult: 1\n    decay_mult: 1\n  }\n  param {\n    lr_mult: 2\n    decay_mult: 0\n  }\n  convolution_param {\n    num_output: 256\n    stride: 1\n    weight_filler {\n      type: \"xavier\"\n      std: 0.01\n    }\n    bias_filler {\n      type: \"constant\"\n      value: 0.2\n    }\n    pad_h: 1\n    pad_w: 0\n    kernel_h: 3\n    kernel_w: 1\n  }\n}\nlayer {\n  name: \"inception_resnet_v2_c3_3x1_bn\"\n  type: \"BatchNorm\"\n  bottom: \"inception_resnet_v2_c3_3x1\"\n  top: \"inception_resnet_v2_c3_3x1\"\n  batch_norm_param {\n    use_global_stats: false\n  }\n}\nlayer {\n  name: \"inception_resnet_v2_c3_3x1_scale\"\n  type: \"Scale\"\n  bottom: \"inception_resnet_v2_c3_3x1\"\n  top: \"inception_resnet_v2_c3_3x1\"\n  scale_param {\n    bias_term: true\n  }\n}\nlayer {\n  name: \"inception_resnet_v2_c3_3x1_relu\"\n  type: \"ReLU\"\n  bottom: \"inception_resnet_v2_c3_3x1\"\n  top: \"inception_resnet_v2_c3_3x1\"\n}\nlayer {\n  name: \"inception_resnet_v2_c3_concat\"\n  type: \"Concat\"\n  bottom: \"inception_resnet_v2_c3_1x1\"\n  bottom: \"inception_resnet_v2_c3_3x1\"\n  top: \"inception_resnet_v2_c3_concat\"\n}\nlayer {\n  name: \"inception_resnet_v2_c3_1x1_2\"\n  type: \"Convolution\"\n  bottom: \"inception_resnet_v2_c3_concat\"\n  top: \"inception_resnet_v2_c3_1x1_2\"\n  param {\n    lr_mult: 1\n    decay_mult: 1\n  }\n  param {\n    lr_mult: 2\n    decay_mult: 0\n  }\n  convolution_param {\n    num_output: 2048\n    pad: 0\n    kernel_size: 1\n    stride: 1\n    weight_filler {\n      type: \"xavier\"\n      std: 0.01\n    }\n    bias_filler {\n      type: \"constant\"\n      value: 0.2\n    }\n  }\n}\nlayer {\n  name: \"inception_resnet_v2_c3_1x1_2_bn\"\n  type: \"BatchNorm\"\n  bottom: \"inception_resnet_v2_c3_1x1_2\"\n  top: \"inception_resnet_v2_c3_1x1_2\"\n  batch_norm_param {\n    use_global_stats: false\n  }\n}\nlayer {\n  name: \"inception_resnet_v2_c3_1x1_2_scale\"\n  type: \"Scale\"\n  bottom: \"inception_resnet_v2_c3_1x1_2\"\n  top: \"inception_resnet_v2_c3_1x1_2\"\n  scale_param {\n    bias_term: true\n  }\n}\nlayer {\n  name: \"inception_resnet_v2_c3_residual_eltwise\"\n  type: \"Eltwise\"\n  bottom: \"inception_resnet_v2_c2_residual_eltwise\"\n  bottom: \"inception_resnet_v2_c3_1x1_2\"\n  top: \"inception_resnet_v2_c3_residual_eltwise\"\n  eltwise_param {\n    operation: SUM\n  }\n}\nlayer {\n  name: \"inception_resnet_v2_c4_1x1\"\n  type: \"Convolution\"\n  bottom: \"inception_resnet_v2_c3_residual_eltwise\"\n  top: \"inception_resnet_v2_c4_1x1\"\n  param {\n    lr_mult: 1\n    decay_mult: 1\n  }\n  param {\n    lr_mult: 2\n    decay_mult: 0\n  }\n  convolution_param {\n    num_output: 192\n    pad: 0\n    kernel_size: 1\n    stride: 1\n    weight_filler {\n      type: \"xavier\"\n      std: 0.01\n    }\n    bias_filler {\n      type: \"constant\"\n      value: 0.2\n    }\n  }\n}\nlayer {\n  name: \"inception_resnet_v2_c4_1x1_bn\"\n  type: \"BatchNorm\"\n  bottom: \"inception_resnet_v2_c4_1x1\"\n  top: \"inception_resnet_v2_c4_1x1\"\n  batch_norm_param {\n    use_global_stats: false\n  }\n}\nlayer {\n  name: \"inception_resnet_v2_c4_1x1_scale\"\n  type: \"Scale\"\n  bottom: \"inception_resnet_v2_c4_1x1\"\n  top: \"inception_resnet_v2_c4_1x1\"\n  scale_param {\n    bias_term: true\n  }\n}\nlayer {\n  name: \"inception_resnet_v2_c4_1x1_relu\"\n  type: \"ReLU\"\n  bottom: \"inception_resnet_v2_c4_1x1\"\n  top: \"inception_resnet_v2_c4_1x1\"\n}\nlayer {\n  name: \"inception_resnet_v2_c4_1x3_reduce\"\n  type: \"Convolution\"\n  bottom: \"inception_resnet_v2_c3_residual_eltwise\"\n  top: \"inception_resnet_v2_c4_1x3_reduce\"\n  param {\n    lr_mult: 1\n    decay_mult: 1\n  }\n  param {\n    lr_mult: 2\n    decay_mult: 0\n  }\n  convolution_param {\n    num_output: 192\n    pad: 0\n    kernel_size: 1\n    stride: 1\n    weight_filler {\n      type: \"xavier\"\n      std: 0.01\n    }\n    bias_filler {\n      type: \"constant\"\n      value: 0.2\n    }\n  }\n}\nlayer {\n  name: \"inception_resnet_v2_c4_1x3_reduce_bn\"\n  type: \"BatchNorm\"\n  bottom: \"inception_resnet_v2_c4_1x3_reduce\"\n  top: \"inception_resnet_v2_c4_1x3_reduce\"\n  batch_norm_param {\n    use_global_stats: false\n  }\n}\nlayer {\n  name: \"inception_resnet_v2_c4_1x3_reduce_scale\"\n  type: \"Scale\"\n  bottom: \"inception_resnet_v2_c4_1x3_reduce\"\n  top: \"inception_resnet_v2_c4_1x3_reduce\"\n  scale_param {\n    bias_term: true\n  }\n}\nlayer {\n  name: \"inception_resnet_v2_c4_1x3_reduce_relu\"\n  type: \"ReLU\"\n  bottom: \"inception_resnet_v2_c4_1x3_reduce\"\n  top: \"inception_resnet_v2_c4_1x3_reduce\"\n}\nlayer {\n  name: \"inception_resnet_v2_c4_1x3\"\n  type: \"Convolution\"\n  bottom: \"inception_resnet_v2_c4_1x3_reduce\"\n  top: \"inception_resnet_v2_c4_1x3\"\n  param {\n    lr_mult: 1\n    decay_mult: 1\n  }\n  param {\n    lr_mult: 2\n    decay_mult: 0\n  }\n  convolution_param {\n    num_output: 224\n    stride: 1\n    weight_filler {\n      type: \"xavier\"\n      std: 0.01\n    }\n    bias_filler {\n      type: \"constant\"\n      value: 0.2\n    }\n    pad_h: 0\n    pad_w: 1\n    kernel_h: 1\n    kernel_w: 3\n  }\n}\nlayer {\n  name: \"inception_resnet_v2_c4_1x3_bn\"\n  type: \"BatchNorm\"\n  bottom: \"inception_resnet_v2_c4_1x3\"\n  top: \"inception_resnet_v2_c4_1x3\"\n  batch_norm_param {\n    use_global_stats: false\n  }\n}\nlayer {\n  name: \"inception_resnet_v2_c4_1x3_scale\"\n  type: \"Scale\"\n  bottom: \"inception_resnet_v2_c4_1x3\"\n  top: \"inception_resnet_v2_c4_1x3\"\n  scale_param {\n    bias_term: true\n  }\n}\nlayer {\n  name: \"inception_resnet_v2_c4_1x3_relu\"\n  type: \"ReLU\"\n  bottom: \"inception_resnet_v2_c4_1x3\"\n  top: \"inception_resnet_v2_c4_1x3\"\n}\nlayer {\n  name: \"inception_resnet_v2_c4_3x1\"\n  type: \"Convolution\"\n  bottom: \"inception_resnet_v2_c4_1x3\"\n  top: \"inception_resnet_v2_c4_3x1\"\n  param {\n    lr_mult: 1\n    decay_mult: 1\n  }\n  param {\n    lr_mult: 2\n    decay_mult: 0\n  }\n  convolution_param {\n    num_output: 256\n    stride: 1\n    weight_filler {\n      type: \"xavier\"\n      std: 0.01\n    }\n    bias_filler {\n      type: \"constant\"\n      value: 0.2\n    }\n    pad_h: 1\n    pad_w: 0\n    kernel_h: 3\n    kernel_w: 1\n  }\n}\nlayer {\n  name: \"inception_resnet_v2_c4_3x1_bn\"\n  type: \"BatchNorm\"\n  bottom: \"inception_resnet_v2_c4_3x1\"\n  top: \"inception_resnet_v2_c4_3x1\"\n  batch_norm_param {\n    use_global_stats: false\n  }\n}\nlayer {\n  name: \"inception_resnet_v2_c4_3x1_scale\"\n  type: \"Scale\"\n  bottom: \"inception_resnet_v2_c4_3x1\"\n  top: \"inception_resnet_v2_c4_3x1\"\n  scale_param {\n    bias_term: true\n  }\n}\nlayer {\n  name: \"inception_resnet_v2_c4_3x1_relu\"\n  type: \"ReLU\"\n  bottom: \"inception_resnet_v2_c4_3x1\"\n  top: \"inception_resnet_v2_c4_3x1\"\n}\nlayer {\n  name: \"inception_resnet_v2_c4_concat\"\n  type: \"Concat\"\n  bottom: \"inception_resnet_v2_c4_1x1\"\n  bottom: \"inception_resnet_v2_c4_3x1\"\n  top: \"inception_resnet_v2_c4_concat\"\n}\nlayer {\n  name: \"inception_resnet_v2_c4_1x1_2\"\n  type: \"Convolution\"\n  bottom: \"inception_resnet_v2_c4_concat\"\n  top: \"inception_resnet_v2_c4_1x1_2\"\n  param {\n    lr_mult: 1\n    decay_mult: 1\n  }\n  param {\n    lr_mult: 2\n    decay_mult: 0\n  }\n  convolution_param {\n    num_output: 2048\n    pad: 0\n    kernel_size: 1\n    stride: 1\n    weight_filler {\n      type: \"xavier\"\n      std: 0.01\n    }\n    bias_filler {\n      type: \"constant\"\n      value: 0.2\n    }\n  }\n}\nlayer {\n  name: \"inception_resnet_v2_c4_1x1_2_bn\"\n  type: \"BatchNorm\"\n  bottom: \"inception_resnet_v2_c4_1x1_2\"\n  top: \"inception_resnet_v2_c4_1x1_2\"\n  batch_norm_param {\n    use_global_stats: false\n  }\n}\nlayer {\n  name: \"inception_resnet_v2_c4_1x1_2_scale\"\n  type: \"Scale\"\n  bottom: \"inception_resnet_v2_c4_1x1_2\"\n  top: \"inception_resnet_v2_c4_1x1_2\"\n  scale_param {\n    bias_term: true\n  }\n}\nlayer {\n  name: \"inception_resnet_v2_c4_residual_eltwise\"\n  type: \"Eltwise\"\n  bottom: \"inception_resnet_v2_c3_residual_eltwise\"\n  bottom: \"inception_resnet_v2_c4_1x1_2\"\n  top: \"inception_resnet_v2_c4_residual_eltwise\"\n  eltwise_param {\n    operation: SUM\n  }\n}\nlayer {\n  name: \"inception_resnet_v2_c5_1x1\"\n  type: \"Convolution\"\n  bottom: \"inception_resnet_v2_c4_residual_eltwise\"\n  top: \"inception_resnet_v2_c5_1x1\"\n  param {\n    lr_mult: 1\n    decay_mult: 1\n  }\n  param {\n    lr_mult: 2\n    decay_mult: 0\n  }\n  convolution_param {\n    num_output: 192\n    pad: 0\n    kernel_size: 1\n    stride: 1\n    weight_filler {\n      type: \"xavier\"\n      std: 0.01\n    }\n    bias_filler {\n      type: \"constant\"\n      value: 0.2\n    }\n  }\n}\nlayer {\n  name: \"inception_resnet_v2_c5_1x1_bn\"\n  type: \"BatchNorm\"\n  bottom: \"inception_resnet_v2_c5_1x1\"\n  top: \"inception_resnet_v2_c5_1x1\"\n  batch_norm_param {\n    use_global_stats: false\n  }\n}\nlayer {\n  name: \"inception_resnet_v2_c5_1x1_scale\"\n  type: \"Scale\"\n  bottom: \"inception_resnet_v2_c5_1x1\"\n  top: \"inception_resnet_v2_c5_1x1\"\n  scale_param {\n    bias_term: true\n  }\n}\nlayer {\n  name: \"inception_resnet_v2_c5_1x1_relu\"\n  type: \"ReLU\"\n  bottom: \"inception_resnet_v2_c5_1x1\"\n  top: \"inception_resnet_v2_c5_1x1\"\n}\nlayer {\n  name: \"inception_resnet_v2_c5_1x3_reduce\"\n  type: \"Convolution\"\n  bottom: \"inception_resnet_v2_c4_residual_eltwise\"\n  top: \"inception_resnet_v2_c5_1x3_reduce\"\n  param {\n    lr_mult: 1\n    decay_mult: 1\n  }\n  param {\n    lr_mult: 2\n    decay_mult: 0\n  }\n  convolution_param {\n    num_output: 192\n    pad: 0\n    kernel_size: 1\n    stride: 1\n    weight_filler {\n      type: \"xavier\"\n      std: 0.01\n    }\n    bias_filler {\n      type: \"constant\"\n      value: 0.2\n    }\n  }\n}\nlayer {\n  name: \"inception_resnet_v2_c5_1x3_reduce_bn\"\n  type: \"BatchNorm\"\n  bottom: \"inception_resnet_v2_c5_1x3_reduce\"\n  top: \"inception_resnet_v2_c5_1x3_reduce\"\n  batch_norm_param {\n    use_global_stats: false\n  }\n}\nlayer {\n  name: \"inception_resnet_v2_c5_1x3_reduce_scale\"\n  type: \"Scale\"\n  bottom: \"inception_resnet_v2_c5_1x3_reduce\"\n  top: \"inception_resnet_v2_c5_1x3_reduce\"\n  scale_param {\n    bias_term: true\n  }\n}\nlayer {\n  name: \"inception_resnet_v2_c5_1x3_reduce_relu\"\n  type: \"ReLU\"\n  bottom: \"inception_resnet_v2_c5_1x3_reduce\"\n  top: \"inception_resnet_v2_c5_1x3_reduce\"\n}\nlayer {\n  name: \"inception_resnet_v2_c5_1x3\"\n  type: \"Convolution\"\n  bottom: \"inception_resnet_v2_c5_1x3_reduce\"\n  top: \"inception_resnet_v2_c5_1x3\"\n  param {\n    lr_mult: 1\n    decay_mult: 1\n  }\n  param {\n    lr_mult: 2\n    decay_mult: 0\n  }\n  convolution_param {\n    num_output: 224\n    stride: 1\n    weight_filler {\n      type: \"xavier\"\n      std: 0.01\n    }\n    bias_filler {\n      type: \"constant\"\n      value: 0.2\n    }\n    pad_h: 0\n    pad_w: 1\n    kernel_h: 1\n    kernel_w: 3\n  }\n}\nlayer {\n  name: \"inception_resnet_v2_c5_1x3_bn\"\n  type: \"BatchNorm\"\n  bottom: \"inception_resnet_v2_c5_1x3\"\n  top: \"inception_resnet_v2_c5_1x3\"\n  batch_norm_param {\n    use_global_stats: false\n  }\n}\nlayer {\n  name: \"inception_resnet_v2_c5_1x3_scale\"\n  type: \"Scale\"\n  bottom: \"inception_resnet_v2_c5_1x3\"\n  top: \"inception_resnet_v2_c5_1x3\"\n  scale_param {\n    bias_term: true\n  }\n}\nlayer {\n  name: \"inception_resnet_v2_c5_1x3_relu\"\n  type: \"ReLU\"\n  bottom: \"inception_resnet_v2_c5_1x3\"\n  top: \"inception_resnet_v2_c5_1x3\"\n}\nlayer {\n  name: \"inception_resnet_v2_c5_3x1\"\n  type: \"Convolution\"\n  bottom: \"inception_resnet_v2_c5_1x3\"\n  top: \"inception_resnet_v2_c5_3x1\"\n  param {\n    lr_mult: 1\n    decay_mult: 1\n  }\n  param {\n    lr_mult: 2\n    decay_mult: 0\n  }\n  convolution_param {\n    num_output: 256\n    stride: 1\n    weight_filler {\n      type: \"xavier\"\n      std: 0.01\n    }\n    bias_filler {\n      type: \"constant\"\n      value: 0.2\n    }\n    pad_h: 1\n    pad_w: 0\n    kernel_h: 3\n    kernel_w: 1\n  }\n}\nlayer {\n  name: \"inception_resnet_v2_c5_3x1_bn\"\n  type: \"BatchNorm\"\n  bottom: \"inception_resnet_v2_c5_3x1\"\n  top: \"inception_resnet_v2_c5_3x1\"\n  batch_norm_param {\n    use_global_stats: false\n  }\n}\nlayer {\n  name: \"inception_resnet_v2_c5_3x1_scale\"\n  type: \"Scale\"\n  bottom: \"inception_resnet_v2_c5_3x1\"\n  top: \"inception_resnet_v2_c5_3x1\"\n  scale_param {\n    bias_term: true\n  }\n}\nlayer {\n  name: \"inception_resnet_v2_c5_3x1_relu\"\n  type: \"ReLU\"\n  bottom: \"inception_resnet_v2_c5_3x1\"\n  top: \"inception_resnet_v2_c5_3x1\"\n}\nlayer {\n  name: \"inception_resnet_v2_c5_concat\"\n  type: \"Concat\"\n  bottom: \"inception_resnet_v2_c5_1x1\"\n  bottom: \"inception_resnet_v2_c5_3x1\"\n  top: \"inception_resnet_v2_c5_concat\"\n}\nlayer {\n  name: \"inception_resnet_v2_c5_1x1_2\"\n  type: \"Convolution\"\n  bottom: \"inception_resnet_v2_c5_concat\"\n  top: \"inception_resnet_v2_c5_1x1_2\"\n  param {\n    lr_mult: 1\n    decay_mult: 1\n  }\n  param {\n    lr_mult: 2\n    decay_mult: 0\n  }\n  convolution_param {\n    num_output: 2048\n    pad: 0\n    kernel_size: 1\n    stride: 1\n    weight_filler {\n      type: \"xavier\"\n      std: 0.01\n    }\n    bias_filler {\n      type: \"constant\"\n      value: 0.2\n    }\n  }\n}\nlayer {\n  name: \"inception_resnet_v2_c5_1x1_2_bn\"\n  type: \"BatchNorm\"\n  bottom: \"inception_resnet_v2_c5_1x1_2\"\n  top: \"inception_resnet_v2_c5_1x1_2\"\n  batch_norm_param {\n    use_global_stats: false\n  }\n}\nlayer {\n  name: \"inception_resnet_v2_c5_1x1_2_scale\"\n  type: \"Scale\"\n  bottom: \"inception_resnet_v2_c5_1x1_2\"\n  top: \"inception_resnet_v2_c5_1x1_2\"\n  scale_param {\n    bias_term: true\n  }\n}\nlayer {\n  name: \"inception_resnet_v2_c5_residual_eltwise\"\n  type: \"Eltwise\"\n  bottom: \"inception_resnet_v2_c4_residual_eltwise\"\n  bottom: \"inception_resnet_v2_c5_1x1_2\"\n  top: \"inception_resnet_v2_c5_residual_eltwise\"\n  eltwise_param {\n    operation: SUM\n  }\n}\nlayer {\n  name: \"pool_8x8_s1\"\n  type: \"Pooling\"\n  bottom: \"inception_resnet_v2_c5_residual_eltwise\"\n  top: \"pool_8x8_s1\"\n  pooling_param {\n    pool: AVE\n    global_pooling: true\n  }\n}\nlayer {\n  name: \"pool_8x8_s1_drop\"\n  type: \"Dropout\"\n  bottom: \"pool_8x8_s1\"\n  top: \"pool_8x8_s1_drop\"\n  dropout_param {\n    dropout_ratio: 0.2\n  }\n}\nlayer {\n  name: \"classifier\"\n  type: \"InnerProduct\"\n  bottom: \"pool_8x8_s1_drop\"\n  top: \"classifier\"\n  param {\n    lr_mult: 1\n    decay_mult: 1\n  }\n  param {\n    lr_mult: 2\n    decay_mult: 0\n  }\n  inner_product_param {\n    num_output: 1000\n    weight_filler {\n      type: \"xavier\"\n    }\n    bias_filler {\n      type: \"constant\"\n      value: 0\n    }\n  }\n}\nlayer {\n  name: \"loss\"\n  type: \"SoftmaxWithLoss\"\n  bottom: \"classifier\"\n  top: \"loss\"\n}\n"
  },
  {
    "path": "presets/nin.prototxt",
    "content": "name: \"nin_imagenet\"\nlayers {\n  top: \"data\"\n  top: \"label\"\n  name: \"data\"\n  type: DATA\n  data_param {\n    source: \"/home/linmin/IMAGENET-LMDB/imagenet-train-lmdb\"\n    backend: LMDB\n    batch_size: 64\n  }\n  transform_param {\n    crop_size: 224\n    mirror: true\n    mean_file: \"/home/linmin/IMAGENET-LMDB/imagenet-train-mean\"\n  }\n  include: { phase: TRAIN }\n}\nlayers {\n  top: \"data\"\n  top: \"label\"\n  name: \"data\"\n  type: DATA\n  data_param {\n    source: \"/home/linmin/IMAGENET-LMDB/imagenet-val-lmdb\"\n    backend: LMDB\n    batch_size: 89\n  }\n  transform_param {\n    crop_size: 224\n    mirror: false\n    mean_file: \"/home/linmin/IMAGENET-LMDB/imagenet-train-mean\"\n  }\n  include: { phase: TEST }\n}\nlayers {\n  bottom: \"data\"\n  top: \"conv1\"\n  name: \"conv1\"\n  type: CONVOLUTION\n  blobs_lr: 1\n  blobs_lr: 2\n  weight_decay: 1\n  weight_decay: 0\n  convolution_param {\n    num_output: 96\n    kernel_size: 11\n    stride: 4\n    weight_filler {\n      type: \"gaussian\"\n      mean: 0\n      std: 0.01\n    }\n    bias_filler {\n      type: \"constant\"\n      value: 0\n    }\n  }\n}\nlayers {\n  bottom: \"conv1\"\n  top: \"conv1\"\n  name: \"relu0\"\n  type: RELU\n}\nlayers {\n  bottom: \"conv1\"\n  top: \"cccp1\"\n  name: \"cccp1\"\n  type: CONVOLUTION\n  blobs_lr: 1\n  blobs_lr: 2\n  weight_decay: 1\n  weight_decay: 0\n  convolution_param {\n    num_output: 96\n    kernel_size: 1\n    stride: 1\n    weight_filler {\n      type: \"gaussian\"\n      mean: 0\n      std: 0.05\n    }\n    bias_filler {\n      type: \"constant\"\n      value: 0\n    }\n  }\n}\nlayers {\n  bottom: \"cccp1\"\n  top: \"cccp1\"\n  name: \"relu1\"\n  type: RELU\n}\nlayers {\n  bottom: \"cccp1\"\n  top: \"cccp2\"\n  name: \"cccp2\"\n  type: CONVOLUTION\n  blobs_lr: 1\n  blobs_lr: 2\n  weight_decay: 1\n  weight_decay: 0\n  convolution_param {\n    num_output: 96\n    kernel_size: 1\n    stride: 1\n    weight_filler {\n      type: \"gaussian\"\n      mean: 0\n      std: 0.05\n    }\n    bias_filler {\n      type: \"constant\"\n      value: 0\n    }\n  }\n}\nlayers {\n  bottom: \"cccp2\"\n  top: \"cccp2\"\n  name: \"relu2\"\n  type: RELU\n}\nlayers {\n  bottom: \"cccp2\"\n  top: \"pool0\"\n  name: \"pool0\"\n  type: POOLING\n  pooling_param {\n    pool: MAX\n    kernel_size: 3\n    stride: 2\n  }\n}\nlayers {\n  bottom: \"pool0\"\n  top: \"conv2\"\n  name: \"conv2\"\n  type: CONVOLUTION\n  blobs_lr: 1\n  blobs_lr: 2\n  weight_decay: 1\n  weight_decay: 0\n  convolution_param {\n    num_output: 256\n    pad: 2\n    kernel_size: 5\n    stride: 1\n    weight_filler {\n      type: \"gaussian\"\n      mean: 0\n      std: 0.05\n    }\n    bias_filler {\n      type: \"constant\"\n      value: 0\n    }\n  }\n}\nlayers {\n  bottom: \"conv2\"\n  top: \"conv2\"\n  name: \"relu3\"\n  type: RELU\n}\nlayers {\n  bottom: \"conv2\"\n  top: \"cccp3\"\n  name: \"cccp3\"\n  type: CONVOLUTION\n  blobs_lr: 1\n  blobs_lr: 2\n  weight_decay: 1\n  weight_decay: 0\n  convolution_param {\n    num_output: 256\n    kernel_size: 1\n    stride: 1\n    weight_filler {\n      type: \"gaussian\"\n      mean: 0\n      std: 0.05\n    }\n    bias_filler {\n      type: \"constant\"\n      value: 0\n    }\n  }\n}\nlayers {\n  bottom: \"cccp3\"\n  top: \"cccp3\"\n  name: \"relu5\"\n  type: RELU\n}\nlayers {\n  bottom: \"cccp3\"\n  top: \"cccp4\"\n  name: \"cccp4\"\n  type: CONVOLUTION\n  blobs_lr: 1\n  blobs_lr: 2\n  weight_decay: 1\n  weight_decay: 0\n  convolution_param {\n    num_output: 256\n    kernel_size: 1\n    stride: 1\n    weight_filler {\n      type: \"gaussian\"\n      mean: 0\n      std: 0.05\n    }\n    bias_filler {\n      type: \"constant\"\n      value: 0\n    }\n  }\n}\nlayers {\n  bottom: \"cccp4\"\n  top: \"cccp4\"\n  name: \"relu6\"\n  type: RELU\n}\nlayers {\n  bottom: \"cccp4\"\n  top: \"pool2\"\n  name: \"pool2\"\n  type: POOLING\n  pooling_param {\n    pool: MAX\n    kernel_size: 3\n    stride: 2\n  }\n}\nlayers {\n  bottom: \"pool2\"\n  top: \"conv3\"\n  name: \"conv3\"\n  type: CONVOLUTION\n  blobs_lr: 1\n  blobs_lr: 2\n  weight_decay: 1\n  weight_decay: 0\n  convolution_param {\n    num_output: 384\n    pad: 1\n    kernel_size: 3\n    stride: 1\n    weight_filler {\n      type: \"gaussian\"\n      mean: 0\n      std: 0.01\n    }\n    bias_filler {\n      type: \"constant\"\n      value: 0\n    }\n  }\n}\nlayers {\n  bottom: \"conv3\"\n  top: \"conv3\"\n  name: \"relu7\"\n  type: RELU\n}\nlayers {\n  bottom: \"conv3\"\n  top: \"cccp5\"\n  name: \"cccp5\"\n  type: CONVOLUTION\n  blobs_lr: 1\n  blobs_lr: 2\n  weight_decay: 1\n  weight_decay: 0\n  convolution_param {\n    num_output: 384\n    kernel_size: 1\n    stride: 1\n    weight_filler {\n      type: \"gaussian\"\n      mean: 0\n      std: 0.05\n    }\n    bias_filler {\n      type: \"constant\"\n      value: 0\n    }\n  }\n}\nlayers {\n  bottom: \"cccp5\"\n  top: \"cccp5\"\n  name: \"relu8\"\n  type: RELU\n}\nlayers {\n  bottom: \"cccp5\"\n  top: \"cccp6\"\n  name: \"cccp6\"\n  type: CONVOLUTION\n  blobs_lr: 1\n  blobs_lr: 2\n  weight_decay: 1\n  weight_decay: 0\n  convolution_param {\n    num_output: 384\n    kernel_size: 1\n    stride: 1\n    weight_filler {\n      type: \"gaussian\"\n      mean: 0\n      std: 0.05\n    }\n    bias_filler {\n      type: \"constant\"\n      value: 0\n    }\n  }\n}\nlayers {\n  bottom: \"cccp6\"\n  top: \"cccp6\"\n  name: \"relu9\"\n  type: RELU\n}\nlayers {\n  bottom: \"cccp6\"\n  top: \"pool3\"\n  name: \"pool3\"\n  type: POOLING\n  pooling_param {\n    pool: MAX\n    kernel_size: 3\n    stride: 2\n  }\n}\nlayers {\n  bottom: \"pool3\"\n  top: \"pool3\"\n  name: \"drop\"\n  type: DROPOUT\n  dropout_param {\n    dropout_ratio: 0.5\n  }\n}\nlayers {\n  bottom: \"pool3\"\n  top: \"conv4-1024\"\n  name: \"conv4-1024\"\n  type: CONVOLUTION\n  blobs_lr: 1\n  blobs_lr: 2\n  weight_decay: 1\n  weight_decay: 0\n  convolution_param {\n    num_output: 1024\n    pad: 1\n    kernel_size: 3\n    stride: 1\n    weight_filler {\n      type: \"gaussian\"\n      mean: 0\n      std: 0.05\n    }\n    bias_filler {\n      type: \"constant\"\n      value: 0\n    }\n  }\n}\nlayers {\n  bottom: \"conv4-1024\"\n  top: \"conv4-1024\"\n  name: \"relu10\"\n  type: RELU\n}\nlayers {\n  bottom: \"conv4-1024\"\n  top: \"cccp7-1024\"\n  name: \"cccp7-1024\"\n  type: CONVOLUTION\n  blobs_lr: 1\n  blobs_lr: 2\n  weight_decay: 1\n  weight_decay: 0\n  convolution_param {\n    num_output: 1024\n    kernel_size: 1\n    stride: 1\n    weight_filler {\n      type: \"gaussian\"\n      mean: 0\n      std: 0.05\n    }\n    bias_filler {\n      type: \"constant\"\n      value: 0\n    }\n  }\n}\nlayers {\n  bottom: \"cccp7-1024\"\n  top: \"cccp7-1024\"\n  name: \"relu11\"\n  type: RELU\n}\nlayers {\n  bottom: \"cccp7-1024\"\n  top: \"cccp8-1024\"\n  name: \"cccp8-1024\"\n  type: CONVOLUTION\n  blobs_lr: 1\n  blobs_lr: 2\n  weight_decay: 1\n  weight_decay: 0\n  convolution_param {\n    num_output: 1000\n    kernel_size: 1\n    stride: 1\n    weight_filler {\n      type: \"gaussian\"\n      mean: 0\n      std: 0.01\n    }\n    bias_filler {\n      type: \"constant\"\n      value: 0\n    }\n  }\n}\nlayers {\n  bottom: \"cccp8-1024\"\n  top: \"cccp8-1024\"\n  name: \"relu12\"\n  type: RELU\n}\nlayers {\n  bottom: \"cccp8-1024\"\n  top: \"pool4\"\n  name: \"pool4\"\n  type: POOLING\n  pooling_param {\n    pool: AVE\n    kernel_size: 6\n    stride: 1\n  }\n}\nlayers {\n  name: \"accuracy\"\n  type: ACCURACY\n  bottom: \"pool4\"\n  bottom: \"label\"\n  top: \"accuracy\"\n  include: { phase: TEST }\n}\nlayers {\n  bottom: \"pool4\"\n  bottom: \"label\"\n  name: \"loss\"\n  type: SOFTMAX_LOSS\n  include: { phase: TRAIN }\n}\n"
  },
  {
    "path": "presets/resnet-152.prototxt",
    "content": "name: \"ResNet-152\"\ninput: \"data\"\ninput_dim: 1\ninput_dim: 3\ninput_dim: 224\ninput_dim: 224\n\nlayer {\n\tbottom: \"data\"\n\ttop: \"conv1\"\n\tname: \"conv1\"\n\ttype: \"Convolution\"\n\tconvolution_param {\n\t\tnum_output: 64\n\t\tkernel_size: 7\n\t\tpad: 3\n\t\tstride: 2\n\t\tbias_term: false\n\t}\n}\n\nlayer {\n\tbottom: \"conv1\"\n\ttop: \"conv1\"\n\tname: \"bn_conv1\"\n\ttype: \"BatchNorm\"\n\tbatch_norm_param {\n\t\tuse_global_stats: true\n\t}\n}\n\nlayer {\n\tbottom: \"conv1\"\n\ttop: \"conv1\"\n\tname: \"scale_conv1\"\n\ttype: \"Scale\"\n\tscale_param {\n\t\tbias_term: true\n\t}\n}\n\nlayer {\n\ttop: \"conv1\"\n\tbottom: \"conv1\"\n\tname: \"conv1_relu\"\n\ttype: \"ReLU\"\n}\n\nlayer {\n\tbottom: \"conv1\"\n\ttop: \"pool1\"\n\tname: \"pool1\"\n\ttype: \"Pooling\"\n\tpooling_param {\n\t\tkernel_size: 3\n\t\tstride: 2\n\t\tpool: MAX\n\t}\n}\n\nlayer {\n\tbottom: \"pool1\"\n\ttop: \"res2a_branch1\"\n\tname: \"res2a_branch1\"\n\ttype: \"Convolution\"\n\tconvolution_param {\n\t\tnum_output: 256\n\t\tkernel_size: 1\n\t\tpad: 0\n\t\tstride: 1\n\t\tbias_term: false\n\t}\n}\n\nlayer {\n\tbottom: \"res2a_branch1\"\n\ttop: \"res2a_branch1\"\n\tname: \"bn2a_branch1\"\n\ttype: \"BatchNorm\"\n\tbatch_norm_param {\n\t\tuse_global_stats: true\n\t}\n}\n\nlayer {\n\tbottom: \"res2a_branch1\"\n\ttop: \"res2a_branch1\"\n\tname: \"scale2a_branch1\"\n\ttype: \"Scale\"\n\tscale_param {\n\t\tbias_term: true\n\t}\n}\n\nlayer {\n\tbottom: \"pool1\"\n\ttop: \"res2a_branch2a\"\n\tname: \"res2a_branch2a\"\n\ttype: \"Convolution\"\n\tconvolution_param {\n\t\tnum_output: 64\n\t\tkernel_size: 1\n\t\tpad: 0\n\t\tstride: 1\n\t\tbias_term: false\n\t}\n}\n\nlayer {\n\tbottom: \"res2a_branch2a\"\n\ttop: \"res2a_branch2a\"\n\tname: \"bn2a_branch2a\"\n\ttype: \"BatchNorm\"\n\tbatch_norm_param {\n\t\tuse_global_stats: true\n\t}\n}\n\nlayer {\n\tbottom: \"res2a_branch2a\"\n\ttop: \"res2a_branch2a\"\n\tname: \"scale2a_branch2a\"\n\ttype: \"Scale\"\n\tscale_param {\n\t\tbias_term: true\n\t}\n}\n\nlayer {\n\ttop: \"res2a_branch2a\"\n\tbottom: \"res2a_branch2a\"\n\tname: \"res2a_branch2a_relu\"\n\ttype: \"ReLU\"\n}\n\nlayer {\n\tbottom: \"res2a_branch2a\"\n\ttop: \"res2a_branch2b\"\n\tname: \"res2a_branch2b\"\n\ttype: \"Convolution\"\n\tconvolution_param {\n\t\tnum_output: 64\n\t\tkernel_size: 3\n\t\tpad: 1\n\t\tstride: 1\n\t\tbias_term: false\n\t}\n}\n\nlayer {\n\tbottom: \"res2a_branch2b\"\n\ttop: \"res2a_branch2b\"\n\tname: \"bn2a_branch2b\"\n\ttype: \"BatchNorm\"\n\tbatch_norm_param {\n\t\tuse_global_stats: true\n\t}\n}\n\nlayer {\n\tbottom: \"res2a_branch2b\"\n\ttop: \"res2a_branch2b\"\n\tname: \"scale2a_branch2b\"\n\ttype: \"Scale\"\n\tscale_param {\n\t\tbias_term: true\n\t}\n}\n\nlayer {\n\ttop: \"res2a_branch2b\"\n\tbottom: \"res2a_branch2b\"\n\tname: \"res2a_branch2b_relu\"\n\ttype: \"ReLU\"\n}\n\nlayer {\n\tbottom: \"res2a_branch2b\"\n\ttop: \"res2a_branch2c\"\n\tname: \"res2a_branch2c\"\n\ttype: \"Convolution\"\n\tconvolution_param {\n\t\tnum_output: 256\n\t\tkernel_size: 1\n\t\tpad: 0\n\t\tstride: 1\n\t\tbias_term: false\n\t}\n}\n\nlayer {\n\tbottom: \"res2a_branch2c\"\n\ttop: \"res2a_branch2c\"\n\tname: \"bn2a_branch2c\"\n\ttype: \"BatchNorm\"\n\tbatch_norm_param {\n\t\tuse_global_stats: true\n\t}\n}\n\nlayer {\n\tbottom: \"res2a_branch2c\"\n\ttop: \"res2a_branch2c\"\n\tname: \"scale2a_branch2c\"\n\ttype: \"Scale\"\n\tscale_param {\n\t\tbias_term: true\n\t}\n}\n\nlayer {\n\tbottom: \"res2a_branch1\"\n\tbottom: \"res2a_branch2c\"\n\ttop: \"res2a\"\n\tname: \"res2a\"\n\ttype: \"Eltwise\"\n}\n\nlayer {\n\tbottom: \"res2a\"\n\ttop: \"res2a\"\n\tname: \"res2a_relu\"\n\ttype: \"ReLU\"\n}\n\nlayer {\n\tbottom: \"res2a\"\n\ttop: \"res2b_branch2a\"\n\tname: \"res2b_branch2a\"\n\ttype: \"Convolution\"\n\tconvolution_param {\n\t\tnum_output: 64\n\t\tkernel_size: 1\n\t\tpad: 0\n\t\tstride: 1\n\t\tbias_term: false\n\t}\n}\n\nlayer {\n\tbottom: \"res2b_branch2a\"\n\ttop: \"res2b_branch2a\"\n\tname: \"bn2b_branch2a\"\n\ttype: \"BatchNorm\"\n\tbatch_norm_param {\n\t\tuse_global_stats: true\n\t}\n}\n\nlayer {\n\tbottom: \"res2b_branch2a\"\n\ttop: \"res2b_branch2a\"\n\tname: \"scale2b_branch2a\"\n\ttype: \"Scale\"\n\tscale_param {\n\t\tbias_term: true\n\t}\n}\n\nlayer {\n\ttop: \"res2b_branch2a\"\n\tbottom: \"res2b_branch2a\"\n\tname: \"res2b_branch2a_relu\"\n\ttype: \"ReLU\"\n}\n\nlayer {\n\tbottom: \"res2b_branch2a\"\n\ttop: \"res2b_branch2b\"\n\tname: \"res2b_branch2b\"\n\ttype: \"Convolution\"\n\tconvolution_param {\n\t\tnum_output: 64\n\t\tkernel_size: 3\n\t\tpad: 1\n\t\tstride: 1\n\t\tbias_term: false\n\t}\n}\n\nlayer {\n\tbottom: \"res2b_branch2b\"\n\ttop: \"res2b_branch2b\"\n\tname: \"bn2b_branch2b\"\n\ttype: \"BatchNorm\"\n\tbatch_norm_param {\n\t\tuse_global_stats: true\n\t}\n}\n\nlayer {\n\tbottom: \"res2b_branch2b\"\n\ttop: \"res2b_branch2b\"\n\tname: \"scale2b_branch2b\"\n\ttype: \"Scale\"\n\tscale_param {\n\t\tbias_term: true\n\t}\n}\n\nlayer {\n\ttop: \"res2b_branch2b\"\n\tbottom: \"res2b_branch2b\"\n\tname: \"res2b_branch2b_relu\"\n\ttype: \"ReLU\"\n}\n\nlayer {\n\tbottom: \"res2b_branch2b\"\n\ttop: \"res2b_branch2c\"\n\tname: \"res2b_branch2c\"\n\ttype: \"Convolution\"\n\tconvolution_param {\n\t\tnum_output: 256\n\t\tkernel_size: 1\n\t\tpad: 0\n\t\tstride: 1\n\t\tbias_term: false\n\t}\n}\n\nlayer {\n\tbottom: \"res2b_branch2c\"\n\ttop: \"res2b_branch2c\"\n\tname: \"bn2b_branch2c\"\n\ttype: \"BatchNorm\"\n\tbatch_norm_param {\n\t\tuse_global_stats: true\n\t}\n}\n\nlayer {\n\tbottom: \"res2b_branch2c\"\n\ttop: \"res2b_branch2c\"\n\tname: \"scale2b_branch2c\"\n\ttype: \"Scale\"\n\tscale_param {\n\t\tbias_term: true\n\t}\n}\n\nlayer {\n\tbottom: \"res2a\"\n\tbottom: \"res2b_branch2c\"\n\ttop: \"res2b\"\n\tname: \"res2b\"\n\ttype: \"Eltwise\"\n}\n\nlayer {\n\tbottom: \"res2b\"\n\ttop: \"res2b\"\n\tname: \"res2b_relu\"\n\ttype: \"ReLU\"\n}\n\nlayer {\n\tbottom: \"res2b\"\n\ttop: \"res2c_branch2a\"\n\tname: \"res2c_branch2a\"\n\ttype: \"Convolution\"\n\tconvolution_param {\n\t\tnum_output: 64\n\t\tkernel_size: 1\n\t\tpad: 0\n\t\tstride: 1\n\t\tbias_term: false\n\t}\n}\n\nlayer {\n\tbottom: \"res2c_branch2a\"\n\ttop: \"res2c_branch2a\"\n\tname: \"bn2c_branch2a\"\n\ttype: \"BatchNorm\"\n\tbatch_norm_param {\n\t\tuse_global_stats: true\n\t}\n}\n\nlayer {\n\tbottom: \"res2c_branch2a\"\n\ttop: \"res2c_branch2a\"\n\tname: \"scale2c_branch2a\"\n\ttype: \"Scale\"\n\tscale_param {\n\t\tbias_term: true\n\t}\n}\n\nlayer {\n\ttop: \"res2c_branch2a\"\n\tbottom: \"res2c_branch2a\"\n\tname: \"res2c_branch2a_relu\"\n\ttype: \"ReLU\"\n}\n\nlayer {\n\tbottom: \"res2c_branch2a\"\n\ttop: \"res2c_branch2b\"\n\tname: \"res2c_branch2b\"\n\ttype: \"Convolution\"\n\tconvolution_param {\n\t\tnum_output: 64\n\t\tkernel_size: 3\n\t\tpad: 1\n\t\tstride: 1\n\t\tbias_term: false\n\t}\n}\n\nlayer {\n\tbottom: \"res2c_branch2b\"\n\ttop: \"res2c_branch2b\"\n\tname: \"bn2c_branch2b\"\n\ttype: \"BatchNorm\"\n\tbatch_norm_param {\n\t\tuse_global_stats: true\n\t}\n}\n\nlayer {\n\tbottom: \"res2c_branch2b\"\n\ttop: \"res2c_branch2b\"\n\tname: \"scale2c_branch2b\"\n\ttype: \"Scale\"\n\tscale_param {\n\t\tbias_term: true\n\t}\n}\n\nlayer {\n\ttop: \"res2c_branch2b\"\n\tbottom: \"res2c_branch2b\"\n\tname: \"res2c_branch2b_relu\"\n\ttype: \"ReLU\"\n}\n\nlayer {\n\tbottom: \"res2c_branch2b\"\n\ttop: \"res2c_branch2c\"\n\tname: \"res2c_branch2c\"\n\ttype: \"Convolution\"\n\tconvolution_param {\n\t\tnum_output: 256\n\t\tkernel_size: 1\n\t\tpad: 0\n\t\tstride: 1\n\t\tbias_term: false\n\t}\n}\n\nlayer {\n\tbottom: \"res2c_branch2c\"\n\ttop: \"res2c_branch2c\"\n\tname: \"bn2c_branch2c\"\n\ttype: \"BatchNorm\"\n\tbatch_norm_param {\n\t\tuse_global_stats: true\n\t}\n}\n\nlayer {\n\tbottom: \"res2c_branch2c\"\n\ttop: \"res2c_branch2c\"\n\tname: \"scale2c_branch2c\"\n\ttype: \"Scale\"\n\tscale_param {\n\t\tbias_term: true\n\t}\n}\n\nlayer {\n\tbottom: \"res2b\"\n\tbottom: \"res2c_branch2c\"\n\ttop: \"res2c\"\n\tname: \"res2c\"\n\ttype: \"Eltwise\"\n}\n\nlayer {\n\tbottom: \"res2c\"\n\ttop: \"res2c\"\n\tname: \"res2c_relu\"\n\ttype: \"ReLU\"\n}\n\nlayer {\n\tbottom: \"res2c\"\n\ttop: \"res3a_branch1\"\n\tname: \"res3a_branch1\"\n\ttype: \"Convolution\"\n\tconvolution_param {\n\t\tnum_output: 512\n\t\tkernel_size: 1\n\t\tpad: 0\n\t\tstride: 2\n\t\tbias_term: false\n\t}\n}\n\nlayer {\n\tbottom: \"res3a_branch1\"\n\ttop: \"res3a_branch1\"\n\tname: \"bn3a_branch1\"\n\ttype: \"BatchNorm\"\n\tbatch_norm_param {\n\t\tuse_global_stats: true\n\t}\n}\n\nlayer {\n\tbottom: \"res3a_branch1\"\n\ttop: \"res3a_branch1\"\n\tname: \"scale3a_branch1\"\n\ttype: \"Scale\"\n\tscale_param {\n\t\tbias_term: true\n\t}\n}\n\nlayer {\n\tbottom: \"res2c\"\n\ttop: \"res3a_branch2a\"\n\tname: \"res3a_branch2a\"\n\ttype: \"Convolution\"\n\tconvolution_param {\n\t\tnum_output: 128\n\t\tkernel_size: 1\n\t\tpad: 0\n\t\tstride: 2\n\t\tbias_term: false\n\t}\n}\n\nlayer {\n\tbottom: \"res3a_branch2a\"\n\ttop: \"res3a_branch2a\"\n\tname: \"bn3a_branch2a\"\n\ttype: \"BatchNorm\"\n\tbatch_norm_param {\n\t\tuse_global_stats: true\n\t}\n}\n\nlayer {\n\tbottom: \"res3a_branch2a\"\n\ttop: \"res3a_branch2a\"\n\tname: \"scale3a_branch2a\"\n\ttype: \"Scale\"\n\tscale_param {\n\t\tbias_term: true\n\t}\n}\n\nlayer {\n\ttop: \"res3a_branch2a\"\n\tbottom: \"res3a_branch2a\"\n\tname: \"res3a_branch2a_relu\"\n\ttype: \"ReLU\"\n}\n\nlayer {\n\tbottom: \"res3a_branch2a\"\n\ttop: \"res3a_branch2b\"\n\tname: \"res3a_branch2b\"\n\ttype: \"Convolution\"\n\tconvolution_param {\n\t\tnum_output: 128\n\t\tkernel_size: 3\n\t\tpad: 1\n\t\tstride: 1\n\t\tbias_term: false\n\t}\n}\n\nlayer {\n\tbottom: \"res3a_branch2b\"\n\ttop: \"res3a_branch2b\"\n\tname: \"bn3a_branch2b\"\n\ttype: \"BatchNorm\"\n\tbatch_norm_param {\n\t\tuse_global_stats: true\n\t}\n}\n\nlayer {\n\tbottom: \"res3a_branch2b\"\n\ttop: \"res3a_branch2b\"\n\tname: \"scale3a_branch2b\"\n\ttype: \"Scale\"\n\tscale_param {\n\t\tbias_term: true\n\t}\n}\n\nlayer {\n\ttop: \"res3a_branch2b\"\n\tbottom: \"res3a_branch2b\"\n\tname: \"res3a_branch2b_relu\"\n\ttype: \"ReLU\"\n}\n\nlayer {\n\tbottom: \"res3a_branch2b\"\n\ttop: \"res3a_branch2c\"\n\tname: \"res3a_branch2c\"\n\ttype: \"Convolution\"\n\tconvolution_param {\n\t\tnum_output: 512\n\t\tkernel_size: 1\n\t\tpad: 0\n\t\tstride: 1\n\t\tbias_term: false\n\t}\n}\n\nlayer {\n\tbottom: \"res3a_branch2c\"\n\ttop: \"res3a_branch2c\"\n\tname: \"bn3a_branch2c\"\n\ttype: \"BatchNorm\"\n\tbatch_norm_param {\n\t\tuse_global_stats: true\n\t}\n}\n\nlayer {\n\tbottom: \"res3a_branch2c\"\n\ttop: \"res3a_branch2c\"\n\tname: \"scale3a_branch2c\"\n\ttype: \"Scale\"\n\tscale_param {\n\t\tbias_term: true\n\t}\n}\n\nlayer {\n\tbottom: \"res3a_branch1\"\n\tbottom: \"res3a_branch2c\"\n\ttop: \"res3a\"\n\tname: \"res3a\"\n\ttype: \"Eltwise\"\n}\n\nlayer {\n\tbottom: \"res3a\"\n\ttop: \"res3a\"\n\tname: \"res3a_relu\"\n\ttype: \"ReLU\"\n}\n\nlayer {\n\tbottom: \"res3a\"\n\ttop: \"res3b1_branch2a\"\n\tname: \"res3b1_branch2a\"\n\ttype: \"Convolution\"\n\tconvolution_param {\n\t\tnum_output: 128\n\t\tkernel_size: 1\n\t\tpad: 0\n\t\tstride: 1\n\t\tbias_term: false\n\t}\n}\n\nlayer {\n\tbottom: \"res3b1_branch2a\"\n\ttop: \"res3b1_branch2a\"\n\tname: \"bn3b1_branch2a\"\n\ttype: \"BatchNorm\"\n\tbatch_norm_param {\n\t\tuse_global_stats: true\n\t}\n}\n\nlayer {\n\tbottom: \"res3b1_branch2a\"\n\ttop: \"res3b1_branch2a\"\n\tname: \"scale3b1_branch2a\"\n\ttype: \"Scale\"\n\tscale_param {\n\t\tbias_term: true\n\t}\n}\n\nlayer {\n\ttop: \"res3b1_branch2a\"\n\tbottom: \"res3b1_branch2a\"\n\tname: \"res3b1_branch2a_relu\"\n\ttype: \"ReLU\"\n}\n\nlayer {\n\tbottom: \"res3b1_branch2a\"\n\ttop: \"res3b1_branch2b\"\n\tname: \"res3b1_branch2b\"\n\ttype: \"Convolution\"\n\tconvolution_param {\n\t\tnum_output: 128\n\t\tkernel_size: 3\n\t\tpad: 1\n\t\tstride: 1\n\t\tbias_term: false\n\t}\n}\n\nlayer {\n\tbottom: \"res3b1_branch2b\"\n\ttop: \"res3b1_branch2b\"\n\tname: \"bn3b1_branch2b\"\n\ttype: \"BatchNorm\"\n\tbatch_norm_param {\n\t\tuse_global_stats: true\n\t}\n}\n\nlayer {\n\tbottom: \"res3b1_branch2b\"\n\ttop: \"res3b1_branch2b\"\n\tname: \"scale3b1_branch2b\"\n\ttype: \"Scale\"\n\tscale_param {\n\t\tbias_term: true\n\t}\n}\n\nlayer {\n\ttop: \"res3b1_branch2b\"\n\tbottom: \"res3b1_branch2b\"\n\tname: \"res3b1_branch2b_relu\"\n\ttype: \"ReLU\"\n}\n\nlayer {\n\tbottom: \"res3b1_branch2b\"\n\ttop: \"res3b1_branch2c\"\n\tname: \"res3b1_branch2c\"\n\ttype: \"Convolution\"\n\tconvolution_param {\n\t\tnum_output: 512\n\t\tkernel_size: 1\n\t\tpad: 0\n\t\tstride: 1\n\t\tbias_term: false\n\t}\n}\n\nlayer {\n\tbottom: \"res3b1_branch2c\"\n\ttop: \"res3b1_branch2c\"\n\tname: \"bn3b1_branch2c\"\n\ttype: \"BatchNorm\"\n\tbatch_norm_param {\n\t\tuse_global_stats: true\n\t}\n}\n\nlayer {\n\tbottom: \"res3b1_branch2c\"\n\ttop: \"res3b1_branch2c\"\n\tname: \"scale3b1_branch2c\"\n\ttype: \"Scale\"\n\tscale_param {\n\t\tbias_term: true\n\t}\n}\n\nlayer {\n\tbottom: \"res3a\"\n\tbottom: \"res3b1_branch2c\"\n\ttop: \"res3b1\"\n\tname: \"res3b1\"\n\ttype: \"Eltwise\"\n}\n\nlayer {\n\tbottom: \"res3b1\"\n\ttop: \"res3b1\"\n\tname: \"res3b1_relu\"\n\ttype: \"ReLU\"\n}\n\nlayer {\n\tbottom: \"res3b1\"\n\ttop: \"res3b2_branch2a\"\n\tname: \"res3b2_branch2a\"\n\ttype: \"Convolution\"\n\tconvolution_param {\n\t\tnum_output: 128\n\t\tkernel_size: 1\n\t\tpad: 0\n\t\tstride: 1\n\t\tbias_term: false\n\t}\n}\n\nlayer {\n\tbottom: \"res3b2_branch2a\"\n\ttop: \"res3b2_branch2a\"\n\tname: \"bn3b2_branch2a\"\n\ttype: \"BatchNorm\"\n\tbatch_norm_param {\n\t\tuse_global_stats: true\n\t}\n}\n\nlayer {\n\tbottom: \"res3b2_branch2a\"\n\ttop: \"res3b2_branch2a\"\n\tname: \"scale3b2_branch2a\"\n\ttype: \"Scale\"\n\tscale_param {\n\t\tbias_term: true\n\t}\n}\n\nlayer {\n\ttop: \"res3b2_branch2a\"\n\tbottom: \"res3b2_branch2a\"\n\tname: \"res3b2_branch2a_relu\"\n\ttype: \"ReLU\"\n}\n\nlayer {\n\tbottom: \"res3b2_branch2a\"\n\ttop: \"res3b2_branch2b\"\n\tname: \"res3b2_branch2b\"\n\ttype: \"Convolution\"\n\tconvolution_param {\n\t\tnum_output: 128\n\t\tkernel_size: 3\n\t\tpad: 1\n\t\tstride: 1\n\t\tbias_term: false\n\t}\n}\n\nlayer {\n\tbottom: \"res3b2_branch2b\"\n\ttop: \"res3b2_branch2b\"\n\tname: \"bn3b2_branch2b\"\n\ttype: \"BatchNorm\"\n\tbatch_norm_param {\n\t\tuse_global_stats: true\n\t}\n}\n\nlayer {\n\tbottom: \"res3b2_branch2b\"\n\ttop: \"res3b2_branch2b\"\n\tname: \"scale3b2_branch2b\"\n\ttype: \"Scale\"\n\tscale_param {\n\t\tbias_term: true\n\t}\n}\n\nlayer {\n\ttop: \"res3b2_branch2b\"\n\tbottom: \"res3b2_branch2b\"\n\tname: \"res3b2_branch2b_relu\"\n\ttype: \"ReLU\"\n}\n\nlayer {\n\tbottom: \"res3b2_branch2b\"\n\ttop: \"res3b2_branch2c\"\n\tname: \"res3b2_branch2c\"\n\ttype: \"Convolution\"\n\tconvolution_param {\n\t\tnum_output: 512\n\t\tkernel_size: 1\n\t\tpad: 0\n\t\tstride: 1\n\t\tbias_term: false\n\t}\n}\n\nlayer {\n\tbottom: \"res3b2_branch2c\"\n\ttop: \"res3b2_branch2c\"\n\tname: \"bn3b2_branch2c\"\n\ttype: \"BatchNorm\"\n\tbatch_norm_param {\n\t\tuse_global_stats: true\n\t}\n}\n\nlayer {\n\tbottom: \"res3b2_branch2c\"\n\ttop: \"res3b2_branch2c\"\n\tname: \"scale3b2_branch2c\"\n\ttype: \"Scale\"\n\tscale_param {\n\t\tbias_term: true\n\t}\n}\n\nlayer {\n\tbottom: \"res3b1\"\n\tbottom: \"res3b2_branch2c\"\n\ttop: \"res3b2\"\n\tname: \"res3b2\"\n\ttype: \"Eltwise\"\n}\n\nlayer {\n\tbottom: \"res3b2\"\n\ttop: \"res3b2\"\n\tname: \"res3b2_relu\"\n\ttype: \"ReLU\"\n}\n\nlayer {\n\tbottom: \"res3b2\"\n\ttop: \"res3b3_branch2a\"\n\tname: \"res3b3_branch2a\"\n\ttype: \"Convolution\"\n\tconvolution_param {\n\t\tnum_output: 128\n\t\tkernel_size: 1\n\t\tpad: 0\n\t\tstride: 1\n\t\tbias_term: false\n\t}\n}\n\nlayer {\n\tbottom: \"res3b3_branch2a\"\n\ttop: \"res3b3_branch2a\"\n\tname: \"bn3b3_branch2a\"\n\ttype: \"BatchNorm\"\n\tbatch_norm_param {\n\t\tuse_global_stats: true\n\t}\n}\n\nlayer {\n\tbottom: \"res3b3_branch2a\"\n\ttop: \"res3b3_branch2a\"\n\tname: \"scale3b3_branch2a\"\n\ttype: \"Scale\"\n\tscale_param {\n\t\tbias_term: true\n\t}\n}\n\nlayer {\n\ttop: \"res3b3_branch2a\"\n\tbottom: \"res3b3_branch2a\"\n\tname: \"res3b3_branch2a_relu\"\n\ttype: \"ReLU\"\n}\n\nlayer {\n\tbottom: \"res3b3_branch2a\"\n\ttop: \"res3b3_branch2b\"\n\tname: \"res3b3_branch2b\"\n\ttype: \"Convolution\"\n\tconvolution_param {\n\t\tnum_output: 128\n\t\tkernel_size: 3\n\t\tpad: 1\n\t\tstride: 1\n\t\tbias_term: false\n\t}\n}\n\nlayer {\n\tbottom: \"res3b3_branch2b\"\n\ttop: \"res3b3_branch2b\"\n\tname: \"bn3b3_branch2b\"\n\ttype: \"BatchNorm\"\n\tbatch_norm_param {\n\t\tuse_global_stats: true\n\t}\n}\n\nlayer {\n\tbottom: \"res3b3_branch2b\"\n\ttop: \"res3b3_branch2b\"\n\tname: \"scale3b3_branch2b\"\n\ttype: \"Scale\"\n\tscale_param {\n\t\tbias_term: true\n\t}\n}\n\nlayer {\n\ttop: \"res3b3_branch2b\"\n\tbottom: \"res3b3_branch2b\"\n\tname: \"res3b3_branch2b_relu\"\n\ttype: \"ReLU\"\n}\n\nlayer {\n\tbottom: \"res3b3_branch2b\"\n\ttop: \"res3b3_branch2c\"\n\tname: \"res3b3_branch2c\"\n\ttype: \"Convolution\"\n\tconvolution_param {\n\t\tnum_output: 512\n\t\tkernel_size: 1\n\t\tpad: 0\n\t\tstride: 1\n\t\tbias_term: false\n\t}\n}\n\nlayer {\n\tbottom: \"res3b3_branch2c\"\n\ttop: \"res3b3_branch2c\"\n\tname: \"bn3b3_branch2c\"\n\ttype: \"BatchNorm\"\n\tbatch_norm_param {\n\t\tuse_global_stats: true\n\t}\n}\n\nlayer {\n\tbottom: \"res3b3_branch2c\"\n\ttop: \"res3b3_branch2c\"\n\tname: \"scale3b3_branch2c\"\n\ttype: \"Scale\"\n\tscale_param {\n\t\tbias_term: true\n\t}\n}\n\nlayer {\n\tbottom: \"res3b2\"\n\tbottom: \"res3b3_branch2c\"\n\ttop: \"res3b3\"\n\tname: \"res3b3\"\n\ttype: \"Eltwise\"\n}\n\nlayer {\n\tbottom: \"res3b3\"\n\ttop: \"res3b3\"\n\tname: \"res3b3_relu\"\n\ttype: \"ReLU\"\n}\n\nlayer {\n\tbottom: \"res3b3\"\n\ttop: \"res3b4_branch2a\"\n\tname: \"res3b4_branch2a\"\n\ttype: \"Convolution\"\n\tconvolution_param {\n\t\tnum_output: 128\n\t\tkernel_size: 1\n\t\tpad: 0\n\t\tstride: 1\n\t\tbias_term: false\n\t}\n}\n\nlayer {\n\tbottom: \"res3b4_branch2a\"\n\ttop: \"res3b4_branch2a\"\n\tname: \"bn3b4_branch2a\"\n\ttype: \"BatchNorm\"\n\tbatch_norm_param {\n\t\tuse_global_stats: true\n\t}\n}\n\nlayer {\n\tbottom: \"res3b4_branch2a\"\n\ttop: \"res3b4_branch2a\"\n\tname: \"scale3b4_branch2a\"\n\ttype: \"Scale\"\n\tscale_param {\n\t\tbias_term: true\n\t}\n}\n\nlayer {\n\ttop: \"res3b4_branch2a\"\n\tbottom: \"res3b4_branch2a\"\n\tname: \"res3b4_branch2a_relu\"\n\ttype: \"ReLU\"\n}\n\nlayer {\n\tbottom: \"res3b4_branch2a\"\n\ttop: \"res3b4_branch2b\"\n\tname: \"res3b4_branch2b\"\n\ttype: \"Convolution\"\n\tconvolution_param {\n\t\tnum_output: 128\n\t\tkernel_size: 3\n\t\tpad: 1\n\t\tstride: 1\n\t\tbias_term: false\n\t}\n}\n\nlayer {\n\tbottom: \"res3b4_branch2b\"\n\ttop: \"res3b4_branch2b\"\n\tname: \"bn3b4_branch2b\"\n\ttype: \"BatchNorm\"\n\tbatch_norm_param {\n\t\tuse_global_stats: true\n\t}\n}\n\nlayer {\n\tbottom: \"res3b4_branch2b\"\n\ttop: \"res3b4_branch2b\"\n\tname: \"scale3b4_branch2b\"\n\ttype: \"Scale\"\n\tscale_param {\n\t\tbias_term: true\n\t}\n}\n\nlayer {\n\ttop: \"res3b4_branch2b\"\n\tbottom: \"res3b4_branch2b\"\n\tname: \"res3b4_branch2b_relu\"\n\ttype: \"ReLU\"\n}\n\nlayer {\n\tbottom: \"res3b4_branch2b\"\n\ttop: \"res3b4_branch2c\"\n\tname: \"res3b4_branch2c\"\n\ttype: \"Convolution\"\n\tconvolution_param {\n\t\tnum_output: 512\n\t\tkernel_size: 1\n\t\tpad: 0\n\t\tstride: 1\n\t\tbias_term: false\n\t}\n}\n\nlayer {\n\tbottom: \"res3b4_branch2c\"\n\ttop: \"res3b4_branch2c\"\n\tname: \"bn3b4_branch2c\"\n\ttype: \"BatchNorm\"\n\tbatch_norm_param {\n\t\tuse_global_stats: true\n\t}\n}\n\nlayer {\n\tbottom: \"res3b4_branch2c\"\n\ttop: \"res3b4_branch2c\"\n\tname: \"scale3b4_branch2c\"\n\ttype: \"Scale\"\n\tscale_param {\n\t\tbias_term: true\n\t}\n}\n\nlayer {\n\tbottom: \"res3b3\"\n\tbottom: \"res3b4_branch2c\"\n\ttop: \"res3b4\"\n\tname: \"res3b4\"\n\ttype: \"Eltwise\"\n}\n\nlayer {\n\tbottom: \"res3b4\"\n\ttop: \"res3b4\"\n\tname: \"res3b4_relu\"\n\ttype: \"ReLU\"\n}\n\nlayer {\n\tbottom: \"res3b4\"\n\ttop: \"res3b5_branch2a\"\n\tname: \"res3b5_branch2a\"\n\ttype: \"Convolution\"\n\tconvolution_param {\n\t\tnum_output: 128\n\t\tkernel_size: 1\n\t\tpad: 0\n\t\tstride: 1\n\t\tbias_term: false\n\t}\n}\n\nlayer {\n\tbottom: \"res3b5_branch2a\"\n\ttop: \"res3b5_branch2a\"\n\tname: \"bn3b5_branch2a\"\n\ttype: \"BatchNorm\"\n\tbatch_norm_param {\n\t\tuse_global_stats: true\n\t}\n}\n\nlayer {\n\tbottom: \"res3b5_branch2a\"\n\ttop: \"res3b5_branch2a\"\n\tname: \"scale3b5_branch2a\"\n\ttype: \"Scale\"\n\tscale_param {\n\t\tbias_term: true\n\t}\n}\n\nlayer {\n\ttop: \"res3b5_branch2a\"\n\tbottom: \"res3b5_branch2a\"\n\tname: \"res3b5_branch2a_relu\"\n\ttype: \"ReLU\"\n}\n\nlayer {\n\tbottom: \"res3b5_branch2a\"\n\ttop: \"res3b5_branch2b\"\n\tname: \"res3b5_branch2b\"\n\ttype: \"Convolution\"\n\tconvolution_param {\n\t\tnum_output: 128\n\t\tkernel_size: 3\n\t\tpad: 1\n\t\tstride: 1\n\t\tbias_term: false\n\t}\n}\n\nlayer {\n\tbottom: \"res3b5_branch2b\"\n\ttop: \"res3b5_branch2b\"\n\tname: \"bn3b5_branch2b\"\n\ttype: \"BatchNorm\"\n\tbatch_norm_param {\n\t\tuse_global_stats: true\n\t}\n}\n\nlayer {\n\tbottom: \"res3b5_branch2b\"\n\ttop: \"res3b5_branch2b\"\n\tname: \"scale3b5_branch2b\"\n\ttype: \"Scale\"\n\tscale_param {\n\t\tbias_term: true\n\t}\n}\n\nlayer {\n\ttop: \"res3b5_branch2b\"\n\tbottom: \"res3b5_branch2b\"\n\tname: \"res3b5_branch2b_relu\"\n\ttype: \"ReLU\"\n}\n\nlayer {\n\tbottom: \"res3b5_branch2b\"\n\ttop: \"res3b5_branch2c\"\n\tname: \"res3b5_branch2c\"\n\ttype: \"Convolution\"\n\tconvolution_param {\n\t\tnum_output: 512\n\t\tkernel_size: 1\n\t\tpad: 0\n\t\tstride: 1\n\t\tbias_term: false\n\t}\n}\n\nlayer {\n\tbottom: \"res3b5_branch2c\"\n\ttop: \"res3b5_branch2c\"\n\tname: \"bn3b5_branch2c\"\n\ttype: \"BatchNorm\"\n\tbatch_norm_param {\n\t\tuse_global_stats: true\n\t}\n}\n\nlayer {\n\tbottom: \"res3b5_branch2c\"\n\ttop: \"res3b5_branch2c\"\n\tname: \"scale3b5_branch2c\"\n\ttype: \"Scale\"\n\tscale_param {\n\t\tbias_term: true\n\t}\n}\n\nlayer {\n\tbottom: \"res3b4\"\n\tbottom: \"res3b5_branch2c\"\n\ttop: \"res3b5\"\n\tname: \"res3b5\"\n\ttype: \"Eltwise\"\n}\n\nlayer {\n\tbottom: \"res3b5\"\n\ttop: \"res3b5\"\n\tname: \"res3b5_relu\"\n\ttype: \"ReLU\"\n}\n\nlayer {\n\tbottom: \"res3b5\"\n\ttop: \"res3b6_branch2a\"\n\tname: \"res3b6_branch2a\"\n\ttype: \"Convolution\"\n\tconvolution_param {\n\t\tnum_output: 128\n\t\tkernel_size: 1\n\t\tpad: 0\n\t\tstride: 1\n\t\tbias_term: false\n\t}\n}\n\nlayer {\n\tbottom: \"res3b6_branch2a\"\n\ttop: \"res3b6_branch2a\"\n\tname: \"bn3b6_branch2a\"\n\ttype: \"BatchNorm\"\n\tbatch_norm_param {\n\t\tuse_global_stats: true\n\t}\n}\n\nlayer {\n\tbottom: \"res3b6_branch2a\"\n\ttop: \"res3b6_branch2a\"\n\tname: \"scale3b6_branch2a\"\n\ttype: \"Scale\"\n\tscale_param {\n\t\tbias_term: true\n\t}\n}\n\nlayer {\n\ttop: \"res3b6_branch2a\"\n\tbottom: \"res3b6_branch2a\"\n\tname: \"res3b6_branch2a_relu\"\n\ttype: \"ReLU\"\n}\n\nlayer {\n\tbottom: \"res3b6_branch2a\"\n\ttop: \"res3b6_branch2b\"\n\tname: \"res3b6_branch2b\"\n\ttype: \"Convolution\"\n\tconvolution_param {\n\t\tnum_output: 128\n\t\tkernel_size: 3\n\t\tpad: 1\n\t\tstride: 1\n\t\tbias_term: false\n\t}\n}\n\nlayer {\n\tbottom: \"res3b6_branch2b\"\n\ttop: \"res3b6_branch2b\"\n\tname: \"bn3b6_branch2b\"\n\ttype: \"BatchNorm\"\n\tbatch_norm_param {\n\t\tuse_global_stats: true\n\t}\n}\n\nlayer {\n\tbottom: \"res3b6_branch2b\"\n\ttop: \"res3b6_branch2b\"\n\tname: \"scale3b6_branch2b\"\n\ttype: \"Scale\"\n\tscale_param {\n\t\tbias_term: true\n\t}\n}\n\nlayer {\n\ttop: \"res3b6_branch2b\"\n\tbottom: \"res3b6_branch2b\"\n\tname: \"res3b6_branch2b_relu\"\n\ttype: \"ReLU\"\n}\n\nlayer {\n\tbottom: \"res3b6_branch2b\"\n\ttop: \"res3b6_branch2c\"\n\tname: \"res3b6_branch2c\"\n\ttype: \"Convolution\"\n\tconvolution_param {\n\t\tnum_output: 512\n\t\tkernel_size: 1\n\t\tpad: 0\n\t\tstride: 1\n\t\tbias_term: false\n\t}\n}\n\nlayer {\n\tbottom: \"res3b6_branch2c\"\n\ttop: \"res3b6_branch2c\"\n\tname: \"bn3b6_branch2c\"\n\ttype: \"BatchNorm\"\n\tbatch_norm_param {\n\t\tuse_global_stats: true\n\t}\n}\n\nlayer {\n\tbottom: \"res3b6_branch2c\"\n\ttop: \"res3b6_branch2c\"\n\tname: \"scale3b6_branch2c\"\n\ttype: \"Scale\"\n\tscale_param {\n\t\tbias_term: true\n\t}\n}\n\nlayer {\n\tbottom: \"res3b5\"\n\tbottom: \"res3b6_branch2c\"\n\ttop: \"res3b6\"\n\tname: \"res3b6\"\n\ttype: \"Eltwise\"\n}\n\nlayer {\n\tbottom: \"res3b6\"\n\ttop: \"res3b6\"\n\tname: \"res3b6_relu\"\n\ttype: \"ReLU\"\n}\n\nlayer {\n\tbottom: \"res3b6\"\n\ttop: \"res3b7_branch2a\"\n\tname: \"res3b7_branch2a\"\n\ttype: \"Convolution\"\n\tconvolution_param {\n\t\tnum_output: 128\n\t\tkernel_size: 1\n\t\tpad: 0\n\t\tstride: 1\n\t\tbias_term: false\n\t}\n}\n\nlayer {\n\tbottom: \"res3b7_branch2a\"\n\ttop: \"res3b7_branch2a\"\n\tname: \"bn3b7_branch2a\"\n\ttype: \"BatchNorm\"\n\tbatch_norm_param {\n\t\tuse_global_stats: true\n\t}\n}\n\nlayer {\n\tbottom: \"res3b7_branch2a\"\n\ttop: \"res3b7_branch2a\"\n\tname: \"scale3b7_branch2a\"\n\ttype: \"Scale\"\n\tscale_param {\n\t\tbias_term: true\n\t}\n}\n\nlayer {\n\ttop: \"res3b7_branch2a\"\n\tbottom: \"res3b7_branch2a\"\n\tname: \"res3b7_branch2a_relu\"\n\ttype: \"ReLU\"\n}\n\nlayer {\n\tbottom: \"res3b7_branch2a\"\n\ttop: \"res3b7_branch2b\"\n\tname: \"res3b7_branch2b\"\n\ttype: \"Convolution\"\n\tconvolution_param {\n\t\tnum_output: 128\n\t\tkernel_size: 3\n\t\tpad: 1\n\t\tstride: 1\n\t\tbias_term: false\n\t}\n}\n\nlayer {\n\tbottom: \"res3b7_branch2b\"\n\ttop: \"res3b7_branch2b\"\n\tname: \"bn3b7_branch2b\"\n\ttype: \"BatchNorm\"\n\tbatch_norm_param {\n\t\tuse_global_stats: true\n\t}\n}\n\nlayer {\n\tbottom: \"res3b7_branch2b\"\n\ttop: \"res3b7_branch2b\"\n\tname: \"scale3b7_branch2b\"\n\ttype: \"Scale\"\n\tscale_param {\n\t\tbias_term: true\n\t}\n}\n\nlayer {\n\ttop: \"res3b7_branch2b\"\n\tbottom: \"res3b7_branch2b\"\n\tname: \"res3b7_branch2b_relu\"\n\ttype: \"ReLU\"\n}\n\nlayer {\n\tbottom: \"res3b7_branch2b\"\n\ttop: \"res3b7_branch2c\"\n\tname: \"res3b7_branch2c\"\n\ttype: \"Convolution\"\n\tconvolution_param {\n\t\tnum_output: 512\n\t\tkernel_size: 1\n\t\tpad: 0\n\t\tstride: 1\n\t\tbias_term: false\n\t}\n}\n\nlayer {\n\tbottom: \"res3b7_branch2c\"\n\ttop: \"res3b7_branch2c\"\n\tname: \"bn3b7_branch2c\"\n\ttype: \"BatchNorm\"\n\tbatch_norm_param {\n\t\tuse_global_stats: true\n\t}\n}\n\nlayer {\n\tbottom: \"res3b7_branch2c\"\n\ttop: \"res3b7_branch2c\"\n\tname: \"scale3b7_branch2c\"\n\ttype: \"Scale\"\n\tscale_param {\n\t\tbias_term: true\n\t}\n}\n\nlayer {\n\tbottom: \"res3b6\"\n\tbottom: \"res3b7_branch2c\"\n\ttop: \"res3b7\"\n\tname: \"res3b7\"\n\ttype: \"Eltwise\"\n}\n\nlayer {\n\tbottom: \"res3b7\"\n\ttop: \"res3b7\"\n\tname: \"res3b7_relu\"\n\ttype: \"ReLU\"\n}\n\nlayer {\n\tbottom: \"res3b7\"\n\ttop: \"res4a_branch1\"\n\tname: \"res4a_branch1\"\n\ttype: \"Convolution\"\n\tconvolution_param {\n\t\tnum_output: 1024\n\t\tkernel_size: 1\n\t\tpad: 0\n\t\tstride: 2\n\t\tbias_term: false\n\t}\n}\n\nlayer {\n\tbottom: \"res4a_branch1\"\n\ttop: \"res4a_branch1\"\n\tname: \"bn4a_branch1\"\n\ttype: \"BatchNorm\"\n\tbatch_norm_param {\n\t\tuse_global_stats: true\n\t}\n}\n\nlayer {\n\tbottom: \"res4a_branch1\"\n\ttop: \"res4a_branch1\"\n\tname: \"scale4a_branch1\"\n\ttype: \"Scale\"\n\tscale_param {\n\t\tbias_term: true\n\t}\n}\n\nlayer {\n\tbottom: \"res3b7\"\n\ttop: \"res4a_branch2a\"\n\tname: \"res4a_branch2a\"\n\ttype: \"Convolution\"\n\tconvolution_param {\n\t\tnum_output: 256\n\t\tkernel_size: 1\n\t\tpad: 0\n\t\tstride: 2\n\t\tbias_term: false\n\t}\n}\n\nlayer {\n\tbottom: \"res4a_branch2a\"\n\ttop: \"res4a_branch2a\"\n\tname: \"bn4a_branch2a\"\n\ttype: \"BatchNorm\"\n\tbatch_norm_param {\n\t\tuse_global_stats: true\n\t}\n}\n\nlayer {\n\tbottom: \"res4a_branch2a\"\n\ttop: \"res4a_branch2a\"\n\tname: \"scale4a_branch2a\"\n\ttype: \"Scale\"\n\tscale_param {\n\t\tbias_term: true\n\t}\n}\n\nlayer {\n\ttop: \"res4a_branch2a\"\n\tbottom: \"res4a_branch2a\"\n\tname: \"res4a_branch2a_relu\"\n\ttype: \"ReLU\"\n}\n\nlayer {\n\tbottom: \"res4a_branch2a\"\n\ttop: \"res4a_branch2b\"\n\tname: \"res4a_branch2b\"\n\ttype: \"Convolution\"\n\tconvolution_param {\n\t\tnum_output: 256\n\t\tkernel_size: 3\n\t\tpad: 1\n\t\tstride: 1\n\t\tbias_term: false\n\t}\n}\n\nlayer {\n\tbottom: \"res4a_branch2b\"\n\ttop: \"res4a_branch2b\"\n\tname: \"bn4a_branch2b\"\n\ttype: \"BatchNorm\"\n\tbatch_norm_param {\n\t\tuse_global_stats: true\n\t}\n}\n\nlayer {\n\tbottom: \"res4a_branch2b\"\n\ttop: \"res4a_branch2b\"\n\tname: \"scale4a_branch2b\"\n\ttype: \"Scale\"\n\tscale_param {\n\t\tbias_term: true\n\t}\n}\n\nlayer {\n\ttop: \"res4a_branch2b\"\n\tbottom: \"res4a_branch2b\"\n\tname: \"res4a_branch2b_relu\"\n\ttype: \"ReLU\"\n}\n\nlayer {\n\tbottom: \"res4a_branch2b\"\n\ttop: \"res4a_branch2c\"\n\tname: \"res4a_branch2c\"\n\ttype: \"Convolution\"\n\tconvolution_param {\n\t\tnum_output: 1024\n\t\tkernel_size: 1\n\t\tpad: 0\n\t\tstride: 1\n\t\tbias_term: false\n\t}\n}\n\nlayer {\n\tbottom: \"res4a_branch2c\"\n\ttop: \"res4a_branch2c\"\n\tname: \"bn4a_branch2c\"\n\ttype: \"BatchNorm\"\n\tbatch_norm_param {\n\t\tuse_global_stats: true\n\t}\n}\n\nlayer {\n\tbottom: \"res4a_branch2c\"\n\ttop: \"res4a_branch2c\"\n\tname: \"scale4a_branch2c\"\n\ttype: \"Scale\"\n\tscale_param {\n\t\tbias_term: true\n\t}\n}\n\nlayer {\n\tbottom: \"res4a_branch1\"\n\tbottom: \"res4a_branch2c\"\n\ttop: \"res4a\"\n\tname: \"res4a\"\n\ttype: \"Eltwise\"\n}\n\nlayer {\n\tbottom: \"res4a\"\n\ttop: \"res4a\"\n\tname: \"res4a_relu\"\n\ttype: \"ReLU\"\n}\n\nlayer {\n\tbottom: \"res4a\"\n\ttop: \"res4b1_branch2a\"\n\tname: \"res4b1_branch2a\"\n\ttype: \"Convolution\"\n\tconvolution_param {\n\t\tnum_output: 256\n\t\tkernel_size: 1\n\t\tpad: 0\n\t\tstride: 1\n\t\tbias_term: false\n\t}\n}\n\nlayer {\n\tbottom: \"res4b1_branch2a\"\n\ttop: \"res4b1_branch2a\"\n\tname: \"bn4b1_branch2a\"\n\ttype: \"BatchNorm\"\n\tbatch_norm_param {\n\t\tuse_global_stats: true\n\t}\n}\n\nlayer {\n\tbottom: \"res4b1_branch2a\"\n\ttop: \"res4b1_branch2a\"\n\tname: \"scale4b1_branch2a\"\n\ttype: \"Scale\"\n\tscale_param {\n\t\tbias_term: true\n\t}\n}\n\nlayer {\n\ttop: \"res4b1_branch2a\"\n\tbottom: \"res4b1_branch2a\"\n\tname: \"res4b1_branch2a_relu\"\n\ttype: \"ReLU\"\n}\n\nlayer {\n\tbottom: \"res4b1_branch2a\"\n\ttop: \"res4b1_branch2b\"\n\tname: \"res4b1_branch2b\"\n\ttype: \"Convolution\"\n\tconvolution_param {\n\t\tnum_output: 256\n\t\tkernel_size: 3\n\t\tpad: 1\n\t\tstride: 1\n\t\tbias_term: false\n\t}\n}\n\nlayer {\n\tbottom: \"res4b1_branch2b\"\n\ttop: \"res4b1_branch2b\"\n\tname: \"bn4b1_branch2b\"\n\ttype: \"BatchNorm\"\n\tbatch_norm_param {\n\t\tuse_global_stats: true\n\t}\n}\n\nlayer {\n\tbottom: \"res4b1_branch2b\"\n\ttop: \"res4b1_branch2b\"\n\tname: \"scale4b1_branch2b\"\n\ttype: \"Scale\"\n\tscale_param {\n\t\tbias_term: true\n\t}\n}\n\nlayer {\n\ttop: \"res4b1_branch2b\"\n\tbottom: \"res4b1_branch2b\"\n\tname: \"res4b1_branch2b_relu\"\n\ttype: \"ReLU\"\n}\n\nlayer {\n\tbottom: \"res4b1_branch2b\"\n\ttop: \"res4b1_branch2c\"\n\tname: \"res4b1_branch2c\"\n\ttype: \"Convolution\"\n\tconvolution_param {\n\t\tnum_output: 1024\n\t\tkernel_size: 1\n\t\tpad: 0\n\t\tstride: 1\n\t\tbias_term: false\n\t}\n}\n\nlayer {\n\tbottom: \"res4b1_branch2c\"\n\ttop: \"res4b1_branch2c\"\n\tname: \"bn4b1_branch2c\"\n\ttype: \"BatchNorm\"\n\tbatch_norm_param {\n\t\tuse_global_stats: true\n\t}\n}\n\nlayer {\n\tbottom: \"res4b1_branch2c\"\n\ttop: \"res4b1_branch2c\"\n\tname: \"scale4b1_branch2c\"\n\ttype: \"Scale\"\n\tscale_param {\n\t\tbias_term: true\n\t}\n}\n\nlayer {\n\tbottom: \"res4a\"\n\tbottom: \"res4b1_branch2c\"\n\ttop: \"res4b1\"\n\tname: \"res4b1\"\n\ttype: \"Eltwise\"\n}\n\nlayer {\n\tbottom: \"res4b1\"\n\ttop: \"res4b1\"\n\tname: \"res4b1_relu\"\n\ttype: \"ReLU\"\n}\n\nlayer {\n\tbottom: \"res4b1\"\n\ttop: \"res4b2_branch2a\"\n\tname: \"res4b2_branch2a\"\n\ttype: \"Convolution\"\n\tconvolution_param {\n\t\tnum_output: 256\n\t\tkernel_size: 1\n\t\tpad: 0\n\t\tstride: 1\n\t\tbias_term: false\n\t}\n}\n\nlayer {\n\tbottom: \"res4b2_branch2a\"\n\ttop: \"res4b2_branch2a\"\n\tname: \"bn4b2_branch2a\"\n\ttype: \"BatchNorm\"\n\tbatch_norm_param {\n\t\tuse_global_stats: true\n\t}\n}\n\nlayer {\n\tbottom: \"res4b2_branch2a\"\n\ttop: \"res4b2_branch2a\"\n\tname: \"scale4b2_branch2a\"\n\ttype: \"Scale\"\n\tscale_param {\n\t\tbias_term: true\n\t}\n}\n\nlayer {\n\ttop: \"res4b2_branch2a\"\n\tbottom: \"res4b2_branch2a\"\n\tname: \"res4b2_branch2a_relu\"\n\ttype: \"ReLU\"\n}\n\nlayer {\n\tbottom: \"res4b2_branch2a\"\n\ttop: \"res4b2_branch2b\"\n\tname: \"res4b2_branch2b\"\n\ttype: \"Convolution\"\n\tconvolution_param {\n\t\tnum_output: 256\n\t\tkernel_size: 3\n\t\tpad: 1\n\t\tstride: 1\n\t\tbias_term: false\n\t}\n}\n\nlayer {\n\tbottom: \"res4b2_branch2b\"\n\ttop: \"res4b2_branch2b\"\n\tname: \"bn4b2_branch2b\"\n\ttype: \"BatchNorm\"\n\tbatch_norm_param {\n\t\tuse_global_stats: true\n\t}\n}\n\nlayer {\n\tbottom: \"res4b2_branch2b\"\n\ttop: \"res4b2_branch2b\"\n\tname: \"scale4b2_branch2b\"\n\ttype: \"Scale\"\n\tscale_param {\n\t\tbias_term: true\n\t}\n}\n\nlayer {\n\ttop: \"res4b2_branch2b\"\n\tbottom: \"res4b2_branch2b\"\n\tname: \"res4b2_branch2b_relu\"\n\ttype: \"ReLU\"\n}\n\nlayer {\n\tbottom: \"res4b2_branch2b\"\n\ttop: \"res4b2_branch2c\"\n\tname: \"res4b2_branch2c\"\n\ttype: \"Convolution\"\n\tconvolution_param {\n\t\tnum_output: 1024\n\t\tkernel_size: 1\n\t\tpad: 0\n\t\tstride: 1\n\t\tbias_term: false\n\t}\n}\n\nlayer {\n\tbottom: \"res4b2_branch2c\"\n\ttop: \"res4b2_branch2c\"\n\tname: \"bn4b2_branch2c\"\n\ttype: \"BatchNorm\"\n\tbatch_norm_param {\n\t\tuse_global_stats: true\n\t}\n}\n\nlayer {\n\tbottom: \"res4b2_branch2c\"\n\ttop: \"res4b2_branch2c\"\n\tname: \"scale4b2_branch2c\"\n\ttype: \"Scale\"\n\tscale_param {\n\t\tbias_term: true\n\t}\n}\n\nlayer {\n\tbottom: \"res4b1\"\n\tbottom: \"res4b2_branch2c\"\n\ttop: \"res4b2\"\n\tname: \"res4b2\"\n\ttype: \"Eltwise\"\n}\n\nlayer {\n\tbottom: \"res4b2\"\n\ttop: \"res4b2\"\n\tname: \"res4b2_relu\"\n\ttype: \"ReLU\"\n}\n\nlayer {\n\tbottom: \"res4b2\"\n\ttop: \"res4b3_branch2a\"\n\tname: \"res4b3_branch2a\"\n\ttype: \"Convolution\"\n\tconvolution_param {\n\t\tnum_output: 256\n\t\tkernel_size: 1\n\t\tpad: 0\n\t\tstride: 1\n\t\tbias_term: false\n\t}\n}\n\nlayer {\n\tbottom: \"res4b3_branch2a\"\n\ttop: \"res4b3_branch2a\"\n\tname: \"bn4b3_branch2a\"\n\ttype: \"BatchNorm\"\n\tbatch_norm_param {\n\t\tuse_global_stats: true\n\t}\n}\n\nlayer {\n\tbottom: \"res4b3_branch2a\"\n\ttop: \"res4b3_branch2a\"\n\tname: \"scale4b3_branch2a\"\n\ttype: \"Scale\"\n\tscale_param {\n\t\tbias_term: true\n\t}\n}\n\nlayer {\n\ttop: \"res4b3_branch2a\"\n\tbottom: \"res4b3_branch2a\"\n\tname: \"res4b3_branch2a_relu\"\n\ttype: \"ReLU\"\n}\n\nlayer {\n\tbottom: \"res4b3_branch2a\"\n\ttop: \"res4b3_branch2b\"\n\tname: \"res4b3_branch2b\"\n\ttype: \"Convolution\"\n\tconvolution_param {\n\t\tnum_output: 256\n\t\tkernel_size: 3\n\t\tpad: 1\n\t\tstride: 1\n\t\tbias_term: false\n\t}\n}\n\nlayer {\n\tbottom: \"res4b3_branch2b\"\n\ttop: \"res4b3_branch2b\"\n\tname: \"bn4b3_branch2b\"\n\ttype: \"BatchNorm\"\n\tbatch_norm_param {\n\t\tuse_global_stats: true\n\t}\n}\n\nlayer {\n\tbottom: \"res4b3_branch2b\"\n\ttop: \"res4b3_branch2b\"\n\tname: \"scale4b3_branch2b\"\n\ttype: \"Scale\"\n\tscale_param {\n\t\tbias_term: true\n\t}\n}\n\nlayer {\n\ttop: \"res4b3_branch2b\"\n\tbottom: \"res4b3_branch2b\"\n\tname: \"res4b3_branch2b_relu\"\n\ttype: \"ReLU\"\n}\n\nlayer {\n\tbottom: \"res4b3_branch2b\"\n\ttop: \"res4b3_branch2c\"\n\tname: \"res4b3_branch2c\"\n\ttype: \"Convolution\"\n\tconvolution_param {\n\t\tnum_output: 1024\n\t\tkernel_size: 1\n\t\tpad: 0\n\t\tstride: 1\n\t\tbias_term: false\n\t}\n}\n\nlayer {\n\tbottom: \"res4b3_branch2c\"\n\ttop: \"res4b3_branch2c\"\n\tname: \"bn4b3_branch2c\"\n\ttype: \"BatchNorm\"\n\tbatch_norm_param {\n\t\tuse_global_stats: true\n\t}\n}\n\nlayer {\n\tbottom: \"res4b3_branch2c\"\n\ttop: \"res4b3_branch2c\"\n\tname: \"scale4b3_branch2c\"\n\ttype: \"Scale\"\n\tscale_param {\n\t\tbias_term: true\n\t}\n}\n\nlayer {\n\tbottom: \"res4b2\"\n\tbottom: \"res4b3_branch2c\"\n\ttop: \"res4b3\"\n\tname: \"res4b3\"\n\ttype: \"Eltwise\"\n}\n\nlayer {\n\tbottom: \"res4b3\"\n\ttop: \"res4b3\"\n\tname: \"res4b3_relu\"\n\ttype: \"ReLU\"\n}\n\nlayer {\n\tbottom: \"res4b3\"\n\ttop: \"res4b4_branch2a\"\n\tname: \"res4b4_branch2a\"\n\ttype: \"Convolution\"\n\tconvolution_param {\n\t\tnum_output: 256\n\t\tkernel_size: 1\n\t\tpad: 0\n\t\tstride: 1\n\t\tbias_term: false\n\t}\n}\n\nlayer {\n\tbottom: \"res4b4_branch2a\"\n\ttop: \"res4b4_branch2a\"\n\tname: \"bn4b4_branch2a\"\n\ttype: \"BatchNorm\"\n\tbatch_norm_param {\n\t\tuse_global_stats: true\n\t}\n}\n\nlayer {\n\tbottom: \"res4b4_branch2a\"\n\ttop: \"res4b4_branch2a\"\n\tname: \"scale4b4_branch2a\"\n\ttype: \"Scale\"\n\tscale_param {\n\t\tbias_term: true\n\t}\n}\n\nlayer {\n\ttop: \"res4b4_branch2a\"\n\tbottom: \"res4b4_branch2a\"\n\tname: \"res4b4_branch2a_relu\"\n\ttype: \"ReLU\"\n}\n\nlayer {\n\tbottom: \"res4b4_branch2a\"\n\ttop: \"res4b4_branch2b\"\n\tname: \"res4b4_branch2b\"\n\ttype: \"Convolution\"\n\tconvolution_param {\n\t\tnum_output: 256\n\t\tkernel_size: 3\n\t\tpad: 1\n\t\tstride: 1\n\t\tbias_term: false\n\t}\n}\n\nlayer {\n\tbottom: \"res4b4_branch2b\"\n\ttop: \"res4b4_branch2b\"\n\tname: \"bn4b4_branch2b\"\n\ttype: \"BatchNorm\"\n\tbatch_norm_param {\n\t\tuse_global_stats: true\n\t}\n}\n\nlayer {\n\tbottom: \"res4b4_branch2b\"\n\ttop: \"res4b4_branch2b\"\n\tname: \"scale4b4_branch2b\"\n\ttype: \"Scale\"\n\tscale_param {\n\t\tbias_term: true\n\t}\n}\n\nlayer {\n\ttop: \"res4b4_branch2b\"\n\tbottom: \"res4b4_branch2b\"\n\tname: \"res4b4_branch2b_relu\"\n\ttype: \"ReLU\"\n}\n\nlayer {\n\tbottom: \"res4b4_branch2b\"\n\ttop: \"res4b4_branch2c\"\n\tname: \"res4b4_branch2c\"\n\ttype: \"Convolution\"\n\tconvolution_param {\n\t\tnum_output: 1024\n\t\tkernel_size: 1\n\t\tpad: 0\n\t\tstride: 1\n\t\tbias_term: false\n\t}\n}\n\nlayer {\n\tbottom: \"res4b4_branch2c\"\n\ttop: \"res4b4_branch2c\"\n\tname: \"bn4b4_branch2c\"\n\ttype: \"BatchNorm\"\n\tbatch_norm_param {\n\t\tuse_global_stats: true\n\t}\n}\n\nlayer {\n\tbottom: \"res4b4_branch2c\"\n\ttop: \"res4b4_branch2c\"\n\tname: \"scale4b4_branch2c\"\n\ttype: \"Scale\"\n\tscale_param {\n\t\tbias_term: true\n\t}\n}\n\nlayer {\n\tbottom: \"res4b3\"\n\tbottom: \"res4b4_branch2c\"\n\ttop: \"res4b4\"\n\tname: \"res4b4\"\n\ttype: \"Eltwise\"\n}\n\nlayer {\n\tbottom: \"res4b4\"\n\ttop: \"res4b4\"\n\tname: \"res4b4_relu\"\n\ttype: \"ReLU\"\n}\n\nlayer {\n\tbottom: \"res4b4\"\n\ttop: \"res4b5_branch2a\"\n\tname: \"res4b5_branch2a\"\n\ttype: \"Convolution\"\n\tconvolution_param {\n\t\tnum_output: 256\n\t\tkernel_size: 1\n\t\tpad: 0\n\t\tstride: 1\n\t\tbias_term: false\n\t}\n}\n\nlayer {\n\tbottom: \"res4b5_branch2a\"\n\ttop: \"res4b5_branch2a\"\n\tname: \"bn4b5_branch2a\"\n\ttype: \"BatchNorm\"\n\tbatch_norm_param {\n\t\tuse_global_stats: true\n\t}\n}\n\nlayer {\n\tbottom: \"res4b5_branch2a\"\n\ttop: \"res4b5_branch2a\"\n\tname: \"scale4b5_branch2a\"\n\ttype: \"Scale\"\n\tscale_param {\n\t\tbias_term: true\n\t}\n}\n\nlayer {\n\ttop: \"res4b5_branch2a\"\n\tbottom: \"res4b5_branch2a\"\n\tname: \"res4b5_branch2a_relu\"\n\ttype: \"ReLU\"\n}\n\nlayer {\n\tbottom: \"res4b5_branch2a\"\n\ttop: \"res4b5_branch2b\"\n\tname: \"res4b5_branch2b\"\n\ttype: \"Convolution\"\n\tconvolution_param {\n\t\tnum_output: 256\n\t\tkernel_size: 3\n\t\tpad: 1\n\t\tstride: 1\n\t\tbias_term: false\n\t}\n}\n\nlayer {\n\tbottom: \"res4b5_branch2b\"\n\ttop: \"res4b5_branch2b\"\n\tname: \"bn4b5_branch2b\"\n\ttype: \"BatchNorm\"\n\tbatch_norm_param {\n\t\tuse_global_stats: true\n\t}\n}\n\nlayer {\n\tbottom: \"res4b5_branch2b\"\n\ttop: \"res4b5_branch2b\"\n\tname: \"scale4b5_branch2b\"\n\ttype: \"Scale\"\n\tscale_param {\n\t\tbias_term: true\n\t}\n}\n\nlayer {\n\ttop: \"res4b5_branch2b\"\n\tbottom: \"res4b5_branch2b\"\n\tname: \"res4b5_branch2b_relu\"\n\ttype: \"ReLU\"\n}\n\nlayer {\n\tbottom: \"res4b5_branch2b\"\n\ttop: \"res4b5_branch2c\"\n\tname: \"res4b5_branch2c\"\n\ttype: \"Convolution\"\n\tconvolution_param {\n\t\tnum_output: 1024\n\t\tkernel_size: 1\n\t\tpad: 0\n\t\tstride: 1\n\t\tbias_term: false\n\t}\n}\n\nlayer {\n\tbottom: \"res4b5_branch2c\"\n\ttop: \"res4b5_branch2c\"\n\tname: \"bn4b5_branch2c\"\n\ttype: \"BatchNorm\"\n\tbatch_norm_param {\n\t\tuse_global_stats: true\n\t}\n}\n\nlayer {\n\tbottom: \"res4b5_branch2c\"\n\ttop: \"res4b5_branch2c\"\n\tname: \"scale4b5_branch2c\"\n\ttype: \"Scale\"\n\tscale_param {\n\t\tbias_term: true\n\t}\n}\n\nlayer {\n\tbottom: \"res4b4\"\n\tbottom: \"res4b5_branch2c\"\n\ttop: \"res4b5\"\n\tname: \"res4b5\"\n\ttype: \"Eltwise\"\n}\n\nlayer {\n\tbottom: \"res4b5\"\n\ttop: \"res4b5\"\n\tname: \"res4b5_relu\"\n\ttype: \"ReLU\"\n}\n\nlayer {\n\tbottom: \"res4b5\"\n\ttop: \"res4b6_branch2a\"\n\tname: \"res4b6_branch2a\"\n\ttype: \"Convolution\"\n\tconvolution_param {\n\t\tnum_output: 256\n\t\tkernel_size: 1\n\t\tpad: 0\n\t\tstride: 1\n\t\tbias_term: false\n\t}\n}\n\nlayer {\n\tbottom: \"res4b6_branch2a\"\n\ttop: \"res4b6_branch2a\"\n\tname: \"bn4b6_branch2a\"\n\ttype: \"BatchNorm\"\n\tbatch_norm_param {\n\t\tuse_global_stats: true\n\t}\n}\n\nlayer {\n\tbottom: \"res4b6_branch2a\"\n\ttop: \"res4b6_branch2a\"\n\tname: \"scale4b6_branch2a\"\n\ttype: \"Scale\"\n\tscale_param {\n\t\tbias_term: true\n\t}\n}\n\nlayer {\n\ttop: \"res4b6_branch2a\"\n\tbottom: \"res4b6_branch2a\"\n\tname: \"res4b6_branch2a_relu\"\n\ttype: \"ReLU\"\n}\n\nlayer {\n\tbottom: \"res4b6_branch2a\"\n\ttop: \"res4b6_branch2b\"\n\tname: \"res4b6_branch2b\"\n\ttype: \"Convolution\"\n\tconvolution_param {\n\t\tnum_output: 256\n\t\tkernel_size: 3\n\t\tpad: 1\n\t\tstride: 1\n\t\tbias_term: false\n\t}\n}\n\nlayer {\n\tbottom: \"res4b6_branch2b\"\n\ttop: \"res4b6_branch2b\"\n\tname: \"bn4b6_branch2b\"\n\ttype: \"BatchNorm\"\n\tbatch_norm_param {\n\t\tuse_global_stats: true\n\t}\n}\n\nlayer {\n\tbottom: \"res4b6_branch2b\"\n\ttop: \"res4b6_branch2b\"\n\tname: \"scale4b6_branch2b\"\n\ttype: \"Scale\"\n\tscale_param {\n\t\tbias_term: true\n\t}\n}\n\nlayer {\n\ttop: \"res4b6_branch2b\"\n\tbottom: \"res4b6_branch2b\"\n\tname: \"res4b6_branch2b_relu\"\n\ttype: \"ReLU\"\n}\n\nlayer {\n\tbottom: \"res4b6_branch2b\"\n\ttop: \"res4b6_branch2c\"\n\tname: \"res4b6_branch2c\"\n\ttype: \"Convolution\"\n\tconvolution_param {\n\t\tnum_output: 1024\n\t\tkernel_size: 1\n\t\tpad: 0\n\t\tstride: 1\n\t\tbias_term: false\n\t}\n}\n\nlayer {\n\tbottom: \"res4b6_branch2c\"\n\ttop: \"res4b6_branch2c\"\n\tname: \"bn4b6_branch2c\"\n\ttype: \"BatchNorm\"\n\tbatch_norm_param {\n\t\tuse_global_stats: true\n\t}\n}\n\nlayer {\n\tbottom: \"res4b6_branch2c\"\n\ttop: \"res4b6_branch2c\"\n\tname: \"scale4b6_branch2c\"\n\ttype: \"Scale\"\n\tscale_param {\n\t\tbias_term: true\n\t}\n}\n\nlayer {\n\tbottom: \"res4b5\"\n\tbottom: \"res4b6_branch2c\"\n\ttop: \"res4b6\"\n\tname: \"res4b6\"\n\ttype: \"Eltwise\"\n}\n\nlayer {\n\tbottom: \"res4b6\"\n\ttop: \"res4b6\"\n\tname: \"res4b6_relu\"\n\ttype: \"ReLU\"\n}\n\nlayer {\n\tbottom: \"res4b6\"\n\ttop: \"res4b7_branch2a\"\n\tname: \"res4b7_branch2a\"\n\ttype: \"Convolution\"\n\tconvolution_param {\n\t\tnum_output: 256\n\t\tkernel_size: 1\n\t\tpad: 0\n\t\tstride: 1\n\t\tbias_term: false\n\t}\n}\n\nlayer {\n\tbottom: \"res4b7_branch2a\"\n\ttop: \"res4b7_branch2a\"\n\tname: \"bn4b7_branch2a\"\n\ttype: \"BatchNorm\"\n\tbatch_norm_param {\n\t\tuse_global_stats: true\n\t}\n}\n\nlayer {\n\tbottom: \"res4b7_branch2a\"\n\ttop: \"res4b7_branch2a\"\n\tname: \"scale4b7_branch2a\"\n\ttype: \"Scale\"\n\tscale_param {\n\t\tbias_term: true\n\t}\n}\n\nlayer {\n\ttop: \"res4b7_branch2a\"\n\tbottom: \"res4b7_branch2a\"\n\tname: \"res4b7_branch2a_relu\"\n\ttype: \"ReLU\"\n}\n\nlayer {\n\tbottom: \"res4b7_branch2a\"\n\ttop: \"res4b7_branch2b\"\n\tname: \"res4b7_branch2b\"\n\ttype: \"Convolution\"\n\tconvolution_param {\n\t\tnum_output: 256\n\t\tkernel_size: 3\n\t\tpad: 1\n\t\tstride: 1\n\t\tbias_term: false\n\t}\n}\n\nlayer {\n\tbottom: \"res4b7_branch2b\"\n\ttop: \"res4b7_branch2b\"\n\tname: \"bn4b7_branch2b\"\n\ttype: \"BatchNorm\"\n\tbatch_norm_param {\n\t\tuse_global_stats: true\n\t}\n}\n\nlayer {\n\tbottom: \"res4b7_branch2b\"\n\ttop: \"res4b7_branch2b\"\n\tname: \"scale4b7_branch2b\"\n\ttype: \"Scale\"\n\tscale_param {\n\t\tbias_term: true\n\t}\n}\n\nlayer {\n\ttop: \"res4b7_branch2b\"\n\tbottom: \"res4b7_branch2b\"\n\tname: \"res4b7_branch2b_relu\"\n\ttype: \"ReLU\"\n}\n\nlayer {\n\tbottom: \"res4b7_branch2b\"\n\ttop: \"res4b7_branch2c\"\n\tname: \"res4b7_branch2c\"\n\ttype: \"Convolution\"\n\tconvolution_param {\n\t\tnum_output: 1024\n\t\tkernel_size: 1\n\t\tpad: 0\n\t\tstride: 1\n\t\tbias_term: false\n\t}\n}\n\nlayer {\n\tbottom: \"res4b7_branch2c\"\n\ttop: \"res4b7_branch2c\"\n\tname: \"bn4b7_branch2c\"\n\ttype: \"BatchNorm\"\n\tbatch_norm_param {\n\t\tuse_global_stats: true\n\t}\n}\n\nlayer {\n\tbottom: \"res4b7_branch2c\"\n\ttop: \"res4b7_branch2c\"\n\tname: \"scale4b7_branch2c\"\n\ttype: \"Scale\"\n\tscale_param {\n\t\tbias_term: true\n\t}\n}\n\nlayer {\n\tbottom: \"res4b6\"\n\tbottom: \"res4b7_branch2c\"\n\ttop: \"res4b7\"\n\tname: \"res4b7\"\n\ttype: \"Eltwise\"\n}\n\nlayer {\n\tbottom: \"res4b7\"\n\ttop: \"res4b7\"\n\tname: \"res4b7_relu\"\n\ttype: \"ReLU\"\n}\n\nlayer {\n\tbottom: \"res4b7\"\n\ttop: \"res4b8_branch2a\"\n\tname: \"res4b8_branch2a\"\n\ttype: \"Convolution\"\n\tconvolution_param {\n\t\tnum_output: 256\n\t\tkernel_size: 1\n\t\tpad: 0\n\t\tstride: 1\n\t\tbias_term: false\n\t}\n}\n\nlayer {\n\tbottom: \"res4b8_branch2a\"\n\ttop: \"res4b8_branch2a\"\n\tname: \"bn4b8_branch2a\"\n\ttype: \"BatchNorm\"\n\tbatch_norm_param {\n\t\tuse_global_stats: true\n\t}\n}\n\nlayer {\n\tbottom: \"res4b8_branch2a\"\n\ttop: \"res4b8_branch2a\"\n\tname: \"scale4b8_branch2a\"\n\ttype: \"Scale\"\n\tscale_param {\n\t\tbias_term: true\n\t}\n}\n\nlayer {\n\ttop: \"res4b8_branch2a\"\n\tbottom: \"res4b8_branch2a\"\n\tname: \"res4b8_branch2a_relu\"\n\ttype: \"ReLU\"\n}\n\nlayer {\n\tbottom: \"res4b8_branch2a\"\n\ttop: \"res4b8_branch2b\"\n\tname: \"res4b8_branch2b\"\n\ttype: \"Convolution\"\n\tconvolution_param {\n\t\tnum_output: 256\n\t\tkernel_size: 3\n\t\tpad: 1\n\t\tstride: 1\n\t\tbias_term: false\n\t}\n}\n\nlayer {\n\tbottom: \"res4b8_branch2b\"\n\ttop: \"res4b8_branch2b\"\n\tname: \"bn4b8_branch2b\"\n\ttype: \"BatchNorm\"\n\tbatch_norm_param {\n\t\tuse_global_stats: true\n\t}\n}\n\nlayer {\n\tbottom: \"res4b8_branch2b\"\n\ttop: \"res4b8_branch2b\"\n\tname: \"scale4b8_branch2b\"\n\ttype: \"Scale\"\n\tscale_param {\n\t\tbias_term: true\n\t}\n}\n\nlayer {\n\ttop: \"res4b8_branch2b\"\n\tbottom: \"res4b8_branch2b\"\n\tname: \"res4b8_branch2b_relu\"\n\ttype: \"ReLU\"\n}\n\nlayer {\n\tbottom: \"res4b8_branch2b\"\n\ttop: \"res4b8_branch2c\"\n\tname: \"res4b8_branch2c\"\n\ttype: \"Convolution\"\n\tconvolution_param {\n\t\tnum_output: 1024\n\t\tkernel_size: 1\n\t\tpad: 0\n\t\tstride: 1\n\t\tbias_term: false\n\t}\n}\n\nlayer {\n\tbottom: \"res4b8_branch2c\"\n\ttop: \"res4b8_branch2c\"\n\tname: \"bn4b8_branch2c\"\n\ttype: \"BatchNorm\"\n\tbatch_norm_param {\n\t\tuse_global_stats: true\n\t}\n}\n\nlayer {\n\tbottom: \"res4b8_branch2c\"\n\ttop: \"res4b8_branch2c\"\n\tname: \"scale4b8_branch2c\"\n\ttype: \"Scale\"\n\tscale_param {\n\t\tbias_term: true\n\t}\n}\n\nlayer {\n\tbottom: \"res4b7\"\n\tbottom: \"res4b8_branch2c\"\n\ttop: \"res4b8\"\n\tname: \"res4b8\"\n\ttype: \"Eltwise\"\n}\n\nlayer {\n\tbottom: \"res4b8\"\n\ttop: \"res4b8\"\n\tname: \"res4b8_relu\"\n\ttype: \"ReLU\"\n}\n\nlayer {\n\tbottom: \"res4b8\"\n\ttop: \"res4b9_branch2a\"\n\tname: \"res4b9_branch2a\"\n\ttype: \"Convolution\"\n\tconvolution_param {\n\t\tnum_output: 256\n\t\tkernel_size: 1\n\t\tpad: 0\n\t\tstride: 1\n\t\tbias_term: false\n\t}\n}\n\nlayer {\n\tbottom: \"res4b9_branch2a\"\n\ttop: \"res4b9_branch2a\"\n\tname: \"bn4b9_branch2a\"\n\ttype: \"BatchNorm\"\n\tbatch_norm_param {\n\t\tuse_global_stats: true\n\t}\n}\n\nlayer {\n\tbottom: \"res4b9_branch2a\"\n\ttop: \"res4b9_branch2a\"\n\tname: \"scale4b9_branch2a\"\n\ttype: \"Scale\"\n\tscale_param {\n\t\tbias_term: true\n\t}\n}\n\nlayer {\n\ttop: \"res4b9_branch2a\"\n\tbottom: \"res4b9_branch2a\"\n\tname: \"res4b9_branch2a_relu\"\n\ttype: \"ReLU\"\n}\n\nlayer {\n\tbottom: \"res4b9_branch2a\"\n\ttop: \"res4b9_branch2b\"\n\tname: \"res4b9_branch2b\"\n\ttype: \"Convolution\"\n\tconvolution_param {\n\t\tnum_output: 256\n\t\tkernel_size: 3\n\t\tpad: 1\n\t\tstride: 1\n\t\tbias_term: false\n\t}\n}\n\nlayer {\n\tbottom: \"res4b9_branch2b\"\n\ttop: \"res4b9_branch2b\"\n\tname: \"bn4b9_branch2b\"\n\ttype: \"BatchNorm\"\n\tbatch_norm_param {\n\t\tuse_global_stats: true\n\t}\n}\n\nlayer {\n\tbottom: \"res4b9_branch2b\"\n\ttop: \"res4b9_branch2b\"\n\tname: \"scale4b9_branch2b\"\n\ttype: \"Scale\"\n\tscale_param {\n\t\tbias_term: true\n\t}\n}\n\nlayer {\n\ttop: \"res4b9_branch2b\"\n\tbottom: \"res4b9_branch2b\"\n\tname: \"res4b9_branch2b_relu\"\n\ttype: \"ReLU\"\n}\n\nlayer {\n\tbottom: \"res4b9_branch2b\"\n\ttop: \"res4b9_branch2c\"\n\tname: \"res4b9_branch2c\"\n\ttype: \"Convolution\"\n\tconvolution_param {\n\t\tnum_output: 1024\n\t\tkernel_size: 1\n\t\tpad: 0\n\t\tstride: 1\n\t\tbias_term: false\n\t}\n}\n\nlayer {\n\tbottom: \"res4b9_branch2c\"\n\ttop: \"res4b9_branch2c\"\n\tname: \"bn4b9_branch2c\"\n\ttype: \"BatchNorm\"\n\tbatch_norm_param {\n\t\tuse_global_stats: true\n\t}\n}\n\nlayer {\n\tbottom: \"res4b9_branch2c\"\n\ttop: \"res4b9_branch2c\"\n\tname: \"scale4b9_branch2c\"\n\ttype: \"Scale\"\n\tscale_param {\n\t\tbias_term: true\n\t}\n}\n\nlayer {\n\tbottom: \"res4b8\"\n\tbottom: \"res4b9_branch2c\"\n\ttop: \"res4b9\"\n\tname: \"res4b9\"\n\ttype: \"Eltwise\"\n}\n\nlayer {\n\tbottom: \"res4b9\"\n\ttop: \"res4b9\"\n\tname: \"res4b9_relu\"\n\ttype: \"ReLU\"\n}\n\nlayer {\n\tbottom: \"res4b9\"\n\ttop: \"res4b10_branch2a\"\n\tname: \"res4b10_branch2a\"\n\ttype: \"Convolution\"\n\tconvolution_param {\n\t\tnum_output: 256\n\t\tkernel_size: 1\n\t\tpad: 0\n\t\tstride: 1\n\t\tbias_term: false\n\t}\n}\n\nlayer {\n\tbottom: \"res4b10_branch2a\"\n\ttop: \"res4b10_branch2a\"\n\tname: \"bn4b10_branch2a\"\n\ttype: \"BatchNorm\"\n\tbatch_norm_param {\n\t\tuse_global_stats: true\n\t}\n}\n\nlayer {\n\tbottom: \"res4b10_branch2a\"\n\ttop: \"res4b10_branch2a\"\n\tname: \"scale4b10_branch2a\"\n\ttype: \"Scale\"\n\tscale_param {\n\t\tbias_term: true\n\t}\n}\n\nlayer {\n\ttop: \"res4b10_branch2a\"\n\tbottom: \"res4b10_branch2a\"\n\tname: \"res4b10_branch2a_relu\"\n\ttype: \"ReLU\"\n}\n\nlayer {\n\tbottom: \"res4b10_branch2a\"\n\ttop: \"res4b10_branch2b\"\n\tname: \"res4b10_branch2b\"\n\ttype: \"Convolution\"\n\tconvolution_param {\n\t\tnum_output: 256\n\t\tkernel_size: 3\n\t\tpad: 1\n\t\tstride: 1\n\t\tbias_term: false\n\t}\n}\n\nlayer {\n\tbottom: \"res4b10_branch2b\"\n\ttop: \"res4b10_branch2b\"\n\tname: \"bn4b10_branch2b\"\n\ttype: \"BatchNorm\"\n\tbatch_norm_param {\n\t\tuse_global_stats: true\n\t}\n}\n\nlayer {\n\tbottom: \"res4b10_branch2b\"\n\ttop: \"res4b10_branch2b\"\n\tname: \"scale4b10_branch2b\"\n\ttype: \"Scale\"\n\tscale_param {\n\t\tbias_term: true\n\t}\n}\n\nlayer {\n\ttop: \"res4b10_branch2b\"\n\tbottom: \"res4b10_branch2b\"\n\tname: \"res4b10_branch2b_relu\"\n\ttype: \"ReLU\"\n}\n\nlayer {\n\tbottom: \"res4b10_branch2b\"\n\ttop: \"res4b10_branch2c\"\n\tname: \"res4b10_branch2c\"\n\ttype: \"Convolution\"\n\tconvolution_param {\n\t\tnum_output: 1024\n\t\tkernel_size: 1\n\t\tpad: 0\n\t\tstride: 1\n\t\tbias_term: false\n\t}\n}\n\nlayer {\n\tbottom: \"res4b10_branch2c\"\n\ttop: \"res4b10_branch2c\"\n\tname: \"bn4b10_branch2c\"\n\ttype: \"BatchNorm\"\n\tbatch_norm_param {\n\t\tuse_global_stats: true\n\t}\n}\n\nlayer {\n\tbottom: \"res4b10_branch2c\"\n\ttop: \"res4b10_branch2c\"\n\tname: \"scale4b10_branch2c\"\n\ttype: \"Scale\"\n\tscale_param {\n\t\tbias_term: true\n\t}\n}\n\nlayer {\n\tbottom: \"res4b9\"\n\tbottom: \"res4b10_branch2c\"\n\ttop: \"res4b10\"\n\tname: \"res4b10\"\n\ttype: \"Eltwise\"\n}\n\nlayer {\n\tbottom: \"res4b10\"\n\ttop: \"res4b10\"\n\tname: \"res4b10_relu\"\n\ttype: \"ReLU\"\n}\n\nlayer {\n\tbottom: \"res4b10\"\n\ttop: \"res4b11_branch2a\"\n\tname: \"res4b11_branch2a\"\n\ttype: \"Convolution\"\n\tconvolution_param {\n\t\tnum_output: 256\n\t\tkernel_size: 1\n\t\tpad: 0\n\t\tstride: 1\n\t\tbias_term: false\n\t}\n}\n\nlayer {\n\tbottom: \"res4b11_branch2a\"\n\ttop: \"res4b11_branch2a\"\n\tname: \"bn4b11_branch2a\"\n\ttype: \"BatchNorm\"\n\tbatch_norm_param {\n\t\tuse_global_stats: true\n\t}\n}\n\nlayer {\n\tbottom: \"res4b11_branch2a\"\n\ttop: \"res4b11_branch2a\"\n\tname: \"scale4b11_branch2a\"\n\ttype: \"Scale\"\n\tscale_param {\n\t\tbias_term: true\n\t}\n}\n\nlayer {\n\ttop: \"res4b11_branch2a\"\n\tbottom: \"res4b11_branch2a\"\n\tname: \"res4b11_branch2a_relu\"\n\ttype: \"ReLU\"\n}\n\nlayer {\n\tbottom: \"res4b11_branch2a\"\n\ttop: \"res4b11_branch2b\"\n\tname: \"res4b11_branch2b\"\n\ttype: \"Convolution\"\n\tconvolution_param {\n\t\tnum_output: 256\n\t\tkernel_size: 3\n\t\tpad: 1\n\t\tstride: 1\n\t\tbias_term: false\n\t}\n}\n\nlayer {\n\tbottom: \"res4b11_branch2b\"\n\ttop: \"res4b11_branch2b\"\n\tname: \"bn4b11_branch2b\"\n\ttype: \"BatchNorm\"\n\tbatch_norm_param {\n\t\tuse_global_stats: true\n\t}\n}\n\nlayer {\n\tbottom: \"res4b11_branch2b\"\n\ttop: \"res4b11_branch2b\"\n\tname: \"scale4b11_branch2b\"\n\ttype: \"Scale\"\n\tscale_param {\n\t\tbias_term: true\n\t}\n}\n\nlayer {\n\ttop: \"res4b11_branch2b\"\n\tbottom: \"res4b11_branch2b\"\n\tname: \"res4b11_branch2b_relu\"\n\ttype: \"ReLU\"\n}\n\nlayer {\n\tbottom: \"res4b11_branch2b\"\n\ttop: \"res4b11_branch2c\"\n\tname: \"res4b11_branch2c\"\n\ttype: \"Convolution\"\n\tconvolution_param {\n\t\tnum_output: 1024\n\t\tkernel_size: 1\n\t\tpad: 0\n\t\tstride: 1\n\t\tbias_term: false\n\t}\n}\n\nlayer {\n\tbottom: \"res4b11_branch2c\"\n\ttop: \"res4b11_branch2c\"\n\tname: \"bn4b11_branch2c\"\n\ttype: \"BatchNorm\"\n\tbatch_norm_param {\n\t\tuse_global_stats: true\n\t}\n}\n\nlayer {\n\tbottom: \"res4b11_branch2c\"\n\ttop: \"res4b11_branch2c\"\n\tname: \"scale4b11_branch2c\"\n\ttype: \"Scale\"\n\tscale_param {\n\t\tbias_term: true\n\t}\n}\n\nlayer {\n\tbottom: \"res4b10\"\n\tbottom: \"res4b11_branch2c\"\n\ttop: \"res4b11\"\n\tname: \"res4b11\"\n\ttype: \"Eltwise\"\n}\n\nlayer {\n\tbottom: \"res4b11\"\n\ttop: \"res4b11\"\n\tname: \"res4b11_relu\"\n\ttype: \"ReLU\"\n}\n\nlayer {\n\tbottom: \"res4b11\"\n\ttop: \"res4b12_branch2a\"\n\tname: \"res4b12_branch2a\"\n\ttype: \"Convolution\"\n\tconvolution_param {\n\t\tnum_output: 256\n\t\tkernel_size: 1\n\t\tpad: 0\n\t\tstride: 1\n\t\tbias_term: false\n\t}\n}\n\nlayer {\n\tbottom: \"res4b12_branch2a\"\n\ttop: \"res4b12_branch2a\"\n\tname: \"bn4b12_branch2a\"\n\ttype: \"BatchNorm\"\n\tbatch_norm_param {\n\t\tuse_global_stats: true\n\t}\n}\n\nlayer {\n\tbottom: \"res4b12_branch2a\"\n\ttop: \"res4b12_branch2a\"\n\tname: \"scale4b12_branch2a\"\n\ttype: \"Scale\"\n\tscale_param {\n\t\tbias_term: true\n\t}\n}\n\nlayer {\n\ttop: \"res4b12_branch2a\"\n\tbottom: \"res4b12_branch2a\"\n\tname: \"res4b12_branch2a_relu\"\n\ttype: \"ReLU\"\n}\n\nlayer {\n\tbottom: \"res4b12_branch2a\"\n\ttop: \"res4b12_branch2b\"\n\tname: \"res4b12_branch2b\"\n\ttype: \"Convolution\"\n\tconvolution_param {\n\t\tnum_output: 256\n\t\tkernel_size: 3\n\t\tpad: 1\n\t\tstride: 1\n\t\tbias_term: false\n\t}\n}\n\nlayer {\n\tbottom: \"res4b12_branch2b\"\n\ttop: \"res4b12_branch2b\"\n\tname: \"bn4b12_branch2b\"\n\ttype: \"BatchNorm\"\n\tbatch_norm_param {\n\t\tuse_global_stats: true\n\t}\n}\n\nlayer {\n\tbottom: \"res4b12_branch2b\"\n\ttop: \"res4b12_branch2b\"\n\tname: \"scale4b12_branch2b\"\n\ttype: \"Scale\"\n\tscale_param {\n\t\tbias_term: true\n\t}\n}\n\nlayer {\n\ttop: \"res4b12_branch2b\"\n\tbottom: \"res4b12_branch2b\"\n\tname: \"res4b12_branch2b_relu\"\n\ttype: \"ReLU\"\n}\n\nlayer {\n\tbottom: \"res4b12_branch2b\"\n\ttop: \"res4b12_branch2c\"\n\tname: \"res4b12_branch2c\"\n\ttype: \"Convolution\"\n\tconvolution_param {\n\t\tnum_output: 1024\n\t\tkernel_size: 1\n\t\tpad: 0\n\t\tstride: 1\n\t\tbias_term: false\n\t}\n}\n\nlayer {\n\tbottom: \"res4b12_branch2c\"\n\ttop: \"res4b12_branch2c\"\n\tname: \"bn4b12_branch2c\"\n\ttype: \"BatchNorm\"\n\tbatch_norm_param {\n\t\tuse_global_stats: true\n\t}\n}\n\nlayer {\n\tbottom: \"res4b12_branch2c\"\n\ttop: \"res4b12_branch2c\"\n\tname: \"scale4b12_branch2c\"\n\ttype: \"Scale\"\n\tscale_param {\n\t\tbias_term: true\n\t}\n}\n\nlayer {\n\tbottom: \"res4b11\"\n\tbottom: \"res4b12_branch2c\"\n\ttop: \"res4b12\"\n\tname: \"res4b12\"\n\ttype: \"Eltwise\"\n}\n\nlayer {\n\tbottom: \"res4b12\"\n\ttop: \"res4b12\"\n\tname: \"res4b12_relu\"\n\ttype: \"ReLU\"\n}\n\nlayer {\n\tbottom: \"res4b12\"\n\ttop: \"res4b13_branch2a\"\n\tname: \"res4b13_branch2a\"\n\ttype: \"Convolution\"\n\tconvolution_param {\n\t\tnum_output: 256\n\t\tkernel_size: 1\n\t\tpad: 0\n\t\tstride: 1\n\t\tbias_term: false\n\t}\n}\n\nlayer {\n\tbottom: \"res4b13_branch2a\"\n\ttop: \"res4b13_branch2a\"\n\tname: \"bn4b13_branch2a\"\n\ttype: \"BatchNorm\"\n\tbatch_norm_param {\n\t\tuse_global_stats: true\n\t}\n}\n\nlayer {\n\tbottom: \"res4b13_branch2a\"\n\ttop: \"res4b13_branch2a\"\n\tname: \"scale4b13_branch2a\"\n\ttype: \"Scale\"\n\tscale_param {\n\t\tbias_term: true\n\t}\n}\n\nlayer {\n\ttop: \"res4b13_branch2a\"\n\tbottom: \"res4b13_branch2a\"\n\tname: \"res4b13_branch2a_relu\"\n\ttype: \"ReLU\"\n}\n\nlayer {\n\tbottom: \"res4b13_branch2a\"\n\ttop: \"res4b13_branch2b\"\n\tname: \"res4b13_branch2b\"\n\ttype: \"Convolution\"\n\tconvolution_param {\n\t\tnum_output: 256\n\t\tkernel_size: 3\n\t\tpad: 1\n\t\tstride: 1\n\t\tbias_term: false\n\t}\n}\n\nlayer {\n\tbottom: \"res4b13_branch2b\"\n\ttop: \"res4b13_branch2b\"\n\tname: \"bn4b13_branch2b\"\n\ttype: \"BatchNorm\"\n\tbatch_norm_param {\n\t\tuse_global_stats: true\n\t}\n}\n\nlayer {\n\tbottom: \"res4b13_branch2b\"\n\ttop: \"res4b13_branch2b\"\n\tname: \"scale4b13_branch2b\"\n\ttype: \"Scale\"\n\tscale_param {\n\t\tbias_term: true\n\t}\n}\n\nlayer {\n\ttop: \"res4b13_branch2b\"\n\tbottom: \"res4b13_branch2b\"\n\tname: \"res4b13_branch2b_relu\"\n\ttype: \"ReLU\"\n}\n\nlayer {\n\tbottom: \"res4b13_branch2b\"\n\ttop: \"res4b13_branch2c\"\n\tname: \"res4b13_branch2c\"\n\ttype: \"Convolution\"\n\tconvolution_param {\n\t\tnum_output: 1024\n\t\tkernel_size: 1\n\t\tpad: 0\n\t\tstride: 1\n\t\tbias_term: false\n\t}\n}\n\nlayer {\n\tbottom: \"res4b13_branch2c\"\n\ttop: \"res4b13_branch2c\"\n\tname: \"bn4b13_branch2c\"\n\ttype: \"BatchNorm\"\n\tbatch_norm_param {\n\t\tuse_global_stats: true\n\t}\n}\n\nlayer {\n\tbottom: \"res4b13_branch2c\"\n\ttop: \"res4b13_branch2c\"\n\tname: \"scale4b13_branch2c\"\n\ttype: \"Scale\"\n\tscale_param {\n\t\tbias_term: true\n\t}\n}\n\nlayer {\n\tbottom: \"res4b12\"\n\tbottom: \"res4b13_branch2c\"\n\ttop: \"res4b13\"\n\tname: \"res4b13\"\n\ttype: \"Eltwise\"\n}\n\nlayer {\n\tbottom: \"res4b13\"\n\ttop: \"res4b13\"\n\tname: \"res4b13_relu\"\n\ttype: \"ReLU\"\n}\n\nlayer {\n\tbottom: \"res4b13\"\n\ttop: \"res4b14_branch2a\"\n\tname: \"res4b14_branch2a\"\n\ttype: \"Convolution\"\n\tconvolution_param {\n\t\tnum_output: 256\n\t\tkernel_size: 1\n\t\tpad: 0\n\t\tstride: 1\n\t\tbias_term: false\n\t}\n}\n\nlayer {\n\tbottom: \"res4b14_branch2a\"\n\ttop: \"res4b14_branch2a\"\n\tname: \"bn4b14_branch2a\"\n\ttype: \"BatchNorm\"\n\tbatch_norm_param {\n\t\tuse_global_stats: true\n\t}\n}\n\nlayer {\n\tbottom: \"res4b14_branch2a\"\n\ttop: \"res4b14_branch2a\"\n\tname: \"scale4b14_branch2a\"\n\ttype: \"Scale\"\n\tscale_param {\n\t\tbias_term: true\n\t}\n}\n\nlayer {\n\ttop: \"res4b14_branch2a\"\n\tbottom: \"res4b14_branch2a\"\n\tname: \"res4b14_branch2a_relu\"\n\ttype: \"ReLU\"\n}\n\nlayer {\n\tbottom: \"res4b14_branch2a\"\n\ttop: \"res4b14_branch2b\"\n\tname: \"res4b14_branch2b\"\n\ttype: \"Convolution\"\n\tconvolution_param {\n\t\tnum_output: 256\n\t\tkernel_size: 3\n\t\tpad: 1\n\t\tstride: 1\n\t\tbias_term: false\n\t}\n}\n\nlayer {\n\tbottom: \"res4b14_branch2b\"\n\ttop: \"res4b14_branch2b\"\n\tname: \"bn4b14_branch2b\"\n\ttype: \"BatchNorm\"\n\tbatch_norm_param {\n\t\tuse_global_stats: true\n\t}\n}\n\nlayer {\n\tbottom: \"res4b14_branch2b\"\n\ttop: \"res4b14_branch2b\"\n\tname: \"scale4b14_branch2b\"\n\ttype: \"Scale\"\n\tscale_param {\n\t\tbias_term: true\n\t}\n}\n\nlayer {\n\ttop: \"res4b14_branch2b\"\n\tbottom: \"res4b14_branch2b\"\n\tname: \"res4b14_branch2b_relu\"\n\ttype: \"ReLU\"\n}\n\nlayer {\n\tbottom: \"res4b14_branch2b\"\n\ttop: \"res4b14_branch2c\"\n\tname: \"res4b14_branch2c\"\n\ttype: \"Convolution\"\n\tconvolution_param {\n\t\tnum_output: 1024\n\t\tkernel_size: 1\n\t\tpad: 0\n\t\tstride: 1\n\t\tbias_term: false\n\t}\n}\n\nlayer {\n\tbottom: \"res4b14_branch2c\"\n\ttop: \"res4b14_branch2c\"\n\tname: \"bn4b14_branch2c\"\n\ttype: \"BatchNorm\"\n\tbatch_norm_param {\n\t\tuse_global_stats: true\n\t}\n}\n\nlayer {\n\tbottom: \"res4b14_branch2c\"\n\ttop: \"res4b14_branch2c\"\n\tname: \"scale4b14_branch2c\"\n\ttype: \"Scale\"\n\tscale_param {\n\t\tbias_term: true\n\t}\n}\n\nlayer {\n\tbottom: \"res4b13\"\n\tbottom: \"res4b14_branch2c\"\n\ttop: \"res4b14\"\n\tname: \"res4b14\"\n\ttype: \"Eltwise\"\n}\n\nlayer {\n\tbottom: \"res4b14\"\n\ttop: \"res4b14\"\n\tname: \"res4b14_relu\"\n\ttype: \"ReLU\"\n}\n\nlayer {\n\tbottom: \"res4b14\"\n\ttop: \"res4b15_branch2a\"\n\tname: \"res4b15_branch2a\"\n\ttype: \"Convolution\"\n\tconvolution_param {\n\t\tnum_output: 256\n\t\tkernel_size: 1\n\t\tpad: 0\n\t\tstride: 1\n\t\tbias_term: false\n\t}\n}\n\nlayer {\n\tbottom: \"res4b15_branch2a\"\n\ttop: \"res4b15_branch2a\"\n\tname: \"bn4b15_branch2a\"\n\ttype: \"BatchNorm\"\n\tbatch_norm_param {\n\t\tuse_global_stats: true\n\t}\n}\n\nlayer {\n\tbottom: \"res4b15_branch2a\"\n\ttop: \"res4b15_branch2a\"\n\tname: \"scale4b15_branch2a\"\n\ttype: \"Scale\"\n\tscale_param {\n\t\tbias_term: true\n\t}\n}\n\nlayer {\n\ttop: \"res4b15_branch2a\"\n\tbottom: \"res4b15_branch2a\"\n\tname: \"res4b15_branch2a_relu\"\n\ttype: \"ReLU\"\n}\n\nlayer {\n\tbottom: \"res4b15_branch2a\"\n\ttop: \"res4b15_branch2b\"\n\tname: \"res4b15_branch2b\"\n\ttype: \"Convolution\"\n\tconvolution_param {\n\t\tnum_output: 256\n\t\tkernel_size: 3\n\t\tpad: 1\n\t\tstride: 1\n\t\tbias_term: false\n\t}\n}\n\nlayer {\n\tbottom: \"res4b15_branch2b\"\n\ttop: \"res4b15_branch2b\"\n\tname: \"bn4b15_branch2b\"\n\ttype: \"BatchNorm\"\n\tbatch_norm_param {\n\t\tuse_global_stats: true\n\t}\n}\n\nlayer {\n\tbottom: \"res4b15_branch2b\"\n\ttop: \"res4b15_branch2b\"\n\tname: \"scale4b15_branch2b\"\n\ttype: \"Scale\"\n\tscale_param {\n\t\tbias_term: true\n\t}\n}\n\nlayer {\n\ttop: \"res4b15_branch2b\"\n\tbottom: \"res4b15_branch2b\"\n\tname: \"res4b15_branch2b_relu\"\n\ttype: \"ReLU\"\n}\n\nlayer {\n\tbottom: \"res4b15_branch2b\"\n\ttop: \"res4b15_branch2c\"\n\tname: \"res4b15_branch2c\"\n\ttype: \"Convolution\"\n\tconvolution_param {\n\t\tnum_output: 1024\n\t\tkernel_size: 1\n\t\tpad: 0\n\t\tstride: 1\n\t\tbias_term: false\n\t}\n}\n\nlayer {\n\tbottom: \"res4b15_branch2c\"\n\ttop: \"res4b15_branch2c\"\n\tname: \"bn4b15_branch2c\"\n\ttype: \"BatchNorm\"\n\tbatch_norm_param {\n\t\tuse_global_stats: true\n\t}\n}\n\nlayer {\n\tbottom: \"res4b15_branch2c\"\n\ttop: \"res4b15_branch2c\"\n\tname: \"scale4b15_branch2c\"\n\ttype: \"Scale\"\n\tscale_param {\n\t\tbias_term: true\n\t}\n}\n\nlayer {\n\tbottom: \"res4b14\"\n\tbottom: \"res4b15_branch2c\"\n\ttop: \"res4b15\"\n\tname: \"res4b15\"\n\ttype: \"Eltwise\"\n}\n\nlayer {\n\tbottom: \"res4b15\"\n\ttop: \"res4b15\"\n\tname: \"res4b15_relu\"\n\ttype: \"ReLU\"\n}\n\nlayer {\n\tbottom: \"res4b15\"\n\ttop: \"res4b16_branch2a\"\n\tname: \"res4b16_branch2a\"\n\ttype: \"Convolution\"\n\tconvolution_param {\n\t\tnum_output: 256\n\t\tkernel_size: 1\n\t\tpad: 0\n\t\tstride: 1\n\t\tbias_term: false\n\t}\n}\n\nlayer {\n\tbottom: \"res4b16_branch2a\"\n\ttop: \"res4b16_branch2a\"\n\tname: \"bn4b16_branch2a\"\n\ttype: \"BatchNorm\"\n\tbatch_norm_param {\n\t\tuse_global_stats: true\n\t}\n}\n\nlayer {\n\tbottom: \"res4b16_branch2a\"\n\ttop: \"res4b16_branch2a\"\n\tname: \"scale4b16_branch2a\"\n\ttype: \"Scale\"\n\tscale_param {\n\t\tbias_term: true\n\t}\n}\n\nlayer {\n\ttop: \"res4b16_branch2a\"\n\tbottom: \"res4b16_branch2a\"\n\tname: \"res4b16_branch2a_relu\"\n\ttype: \"ReLU\"\n}\n\nlayer {\n\tbottom: \"res4b16_branch2a\"\n\ttop: \"res4b16_branch2b\"\n\tname: \"res4b16_branch2b\"\n\ttype: \"Convolution\"\n\tconvolution_param {\n\t\tnum_output: 256\n\t\tkernel_size: 3\n\t\tpad: 1\n\t\tstride: 1\n\t\tbias_term: false\n\t}\n}\n\nlayer {\n\tbottom: \"res4b16_branch2b\"\n\ttop: \"res4b16_branch2b\"\n\tname: \"bn4b16_branch2b\"\n\ttype: \"BatchNorm\"\n\tbatch_norm_param {\n\t\tuse_global_stats: true\n\t}\n}\n\nlayer {\n\tbottom: \"res4b16_branch2b\"\n\ttop: \"res4b16_branch2b\"\n\tname: \"scale4b16_branch2b\"\n\ttype: \"Scale\"\n\tscale_param {\n\t\tbias_term: true\n\t}\n}\n\nlayer {\n\ttop: \"res4b16_branch2b\"\n\tbottom: \"res4b16_branch2b\"\n\tname: \"res4b16_branch2b_relu\"\n\ttype: \"ReLU\"\n}\n\nlayer {\n\tbottom: \"res4b16_branch2b\"\n\ttop: \"res4b16_branch2c\"\n\tname: \"res4b16_branch2c\"\n\ttype: \"Convolution\"\n\tconvolution_param {\n\t\tnum_output: 1024\n\t\tkernel_size: 1\n\t\tpad: 0\n\t\tstride: 1\n\t\tbias_term: false\n\t}\n}\n\nlayer {\n\tbottom: \"res4b16_branch2c\"\n\ttop: \"res4b16_branch2c\"\n\tname: \"bn4b16_branch2c\"\n\ttype: \"BatchNorm\"\n\tbatch_norm_param {\n\t\tuse_global_stats: true\n\t}\n}\n\nlayer {\n\tbottom: \"res4b16_branch2c\"\n\ttop: \"res4b16_branch2c\"\n\tname: \"scale4b16_branch2c\"\n\ttype: \"Scale\"\n\tscale_param {\n\t\tbias_term: true\n\t}\n}\n\nlayer {\n\tbottom: \"res4b15\"\n\tbottom: \"res4b16_branch2c\"\n\ttop: \"res4b16\"\n\tname: \"res4b16\"\n\ttype: \"Eltwise\"\n}\n\nlayer {\n\tbottom: \"res4b16\"\n\ttop: \"res4b16\"\n\tname: \"res4b16_relu\"\n\ttype: \"ReLU\"\n}\n\nlayer {\n\tbottom: \"res4b16\"\n\ttop: \"res4b17_branch2a\"\n\tname: \"res4b17_branch2a\"\n\ttype: \"Convolution\"\n\tconvolution_param {\n\t\tnum_output: 256\n\t\tkernel_size: 1\n\t\tpad: 0\n\t\tstride: 1\n\t\tbias_term: false\n\t}\n}\n\nlayer {\n\tbottom: \"res4b17_branch2a\"\n\ttop: \"res4b17_branch2a\"\n\tname: \"bn4b17_branch2a\"\n\ttype: \"BatchNorm\"\n\tbatch_norm_param {\n\t\tuse_global_stats: true\n\t}\n}\n\nlayer {\n\tbottom: \"res4b17_branch2a\"\n\ttop: \"res4b17_branch2a\"\n\tname: \"scale4b17_branch2a\"\n\ttype: \"Scale\"\n\tscale_param {\n\t\tbias_term: true\n\t}\n}\n\nlayer {\n\ttop: \"res4b17_branch2a\"\n\tbottom: \"res4b17_branch2a\"\n\tname: \"res4b17_branch2a_relu\"\n\ttype: \"ReLU\"\n}\n\nlayer {\n\tbottom: \"res4b17_branch2a\"\n\ttop: \"res4b17_branch2b\"\n\tname: \"res4b17_branch2b\"\n\ttype: \"Convolution\"\n\tconvolution_param {\n\t\tnum_output: 256\n\t\tkernel_size: 3\n\t\tpad: 1\n\t\tstride: 1\n\t\tbias_term: false\n\t}\n}\n\nlayer {\n\tbottom: \"res4b17_branch2b\"\n\ttop: \"res4b17_branch2b\"\n\tname: \"bn4b17_branch2b\"\n\ttype: \"BatchNorm\"\n\tbatch_norm_param {\n\t\tuse_global_stats: true\n\t}\n}\n\nlayer {\n\tbottom: \"res4b17_branch2b\"\n\ttop: \"res4b17_branch2b\"\n\tname: \"scale4b17_branch2b\"\n\ttype: \"Scale\"\n\tscale_param {\n\t\tbias_term: true\n\t}\n}\n\nlayer {\n\ttop: \"res4b17_branch2b\"\n\tbottom: \"res4b17_branch2b\"\n\tname: \"res4b17_branch2b_relu\"\n\ttype: \"ReLU\"\n}\n\nlayer {\n\tbottom: \"res4b17_branch2b\"\n\ttop: \"res4b17_branch2c\"\n\tname: \"res4b17_branch2c\"\n\ttype: \"Convolution\"\n\tconvolution_param {\n\t\tnum_output: 1024\n\t\tkernel_size: 1\n\t\tpad: 0\n\t\tstride: 1\n\t\tbias_term: false\n\t}\n}\n\nlayer {\n\tbottom: \"res4b17_branch2c\"\n\ttop: \"res4b17_branch2c\"\n\tname: \"bn4b17_branch2c\"\n\ttype: \"BatchNorm\"\n\tbatch_norm_param {\n\t\tuse_global_stats: true\n\t}\n}\n\nlayer {\n\tbottom: \"res4b17_branch2c\"\n\ttop: \"res4b17_branch2c\"\n\tname: \"scale4b17_branch2c\"\n\ttype: \"Scale\"\n\tscale_param {\n\t\tbias_term: true\n\t}\n}\n\nlayer {\n\tbottom: \"res4b16\"\n\tbottom: \"res4b17_branch2c\"\n\ttop: \"res4b17\"\n\tname: \"res4b17\"\n\ttype: \"Eltwise\"\n}\n\nlayer {\n\tbottom: \"res4b17\"\n\ttop: \"res4b17\"\n\tname: \"res4b17_relu\"\n\ttype: \"ReLU\"\n}\n\nlayer {\n\tbottom: \"res4b17\"\n\ttop: \"res4b18_branch2a\"\n\tname: \"res4b18_branch2a\"\n\ttype: \"Convolution\"\n\tconvolution_param {\n\t\tnum_output: 256\n\t\tkernel_size: 1\n\t\tpad: 0\n\t\tstride: 1\n\t\tbias_term: false\n\t}\n}\n\nlayer {\n\tbottom: \"res4b18_branch2a\"\n\ttop: \"res4b18_branch2a\"\n\tname: \"bn4b18_branch2a\"\n\ttype: \"BatchNorm\"\n\tbatch_norm_param {\n\t\tuse_global_stats: true\n\t}\n}\n\nlayer {\n\tbottom: \"res4b18_branch2a\"\n\ttop: \"res4b18_branch2a\"\n\tname: \"scale4b18_branch2a\"\n\ttype: \"Scale\"\n\tscale_param {\n\t\tbias_term: true\n\t}\n}\n\nlayer {\n\ttop: \"res4b18_branch2a\"\n\tbottom: \"res4b18_branch2a\"\n\tname: \"res4b18_branch2a_relu\"\n\ttype: \"ReLU\"\n}\n\nlayer {\n\tbottom: \"res4b18_branch2a\"\n\ttop: \"res4b18_branch2b\"\n\tname: \"res4b18_branch2b\"\n\ttype: \"Convolution\"\n\tconvolution_param {\n\t\tnum_output: 256\n\t\tkernel_size: 3\n\t\tpad: 1\n\t\tstride: 1\n\t\tbias_term: false\n\t}\n}\n\nlayer {\n\tbottom: \"res4b18_branch2b\"\n\ttop: \"res4b18_branch2b\"\n\tname: \"bn4b18_branch2b\"\n\ttype: \"BatchNorm\"\n\tbatch_norm_param {\n\t\tuse_global_stats: true\n\t}\n}\n\nlayer {\n\tbottom: \"res4b18_branch2b\"\n\ttop: \"res4b18_branch2b\"\n\tname: \"scale4b18_branch2b\"\n\ttype: \"Scale\"\n\tscale_param {\n\t\tbias_term: true\n\t}\n}\n\nlayer {\n\ttop: \"res4b18_branch2b\"\n\tbottom: \"res4b18_branch2b\"\n\tname: \"res4b18_branch2b_relu\"\n\ttype: \"ReLU\"\n}\n\nlayer {\n\tbottom: \"res4b18_branch2b\"\n\ttop: \"res4b18_branch2c\"\n\tname: \"res4b18_branch2c\"\n\ttype: \"Convolution\"\n\tconvolution_param {\n\t\tnum_output: 1024\n\t\tkernel_size: 1\n\t\tpad: 0\n\t\tstride: 1\n\t\tbias_term: false\n\t}\n}\n\nlayer {\n\tbottom: \"res4b18_branch2c\"\n\ttop: \"res4b18_branch2c\"\n\tname: \"bn4b18_branch2c\"\n\ttype: \"BatchNorm\"\n\tbatch_norm_param {\n\t\tuse_global_stats: true\n\t}\n}\n\nlayer {\n\tbottom: \"res4b18_branch2c\"\n\ttop: \"res4b18_branch2c\"\n\tname: \"scale4b18_branch2c\"\n\ttype: \"Scale\"\n\tscale_param {\n\t\tbias_term: true\n\t}\n}\n\nlayer {\n\tbottom: \"res4b17\"\n\tbottom: \"res4b18_branch2c\"\n\ttop: \"res4b18\"\n\tname: \"res4b18\"\n\ttype: \"Eltwise\"\n}\n\nlayer {\n\tbottom: \"res4b18\"\n\ttop: \"res4b18\"\n\tname: \"res4b18_relu\"\n\ttype: \"ReLU\"\n}\n\nlayer {\n\tbottom: \"res4b18\"\n\ttop: \"res4b19_branch2a\"\n\tname: \"res4b19_branch2a\"\n\ttype: \"Convolution\"\n\tconvolution_param {\n\t\tnum_output: 256\n\t\tkernel_size: 1\n\t\tpad: 0\n\t\tstride: 1\n\t\tbias_term: false\n\t}\n}\n\nlayer {\n\tbottom: \"res4b19_branch2a\"\n\ttop: \"res4b19_branch2a\"\n\tname: \"bn4b19_branch2a\"\n\ttype: \"BatchNorm\"\n\tbatch_norm_param {\n\t\tuse_global_stats: true\n\t}\n}\n\nlayer {\n\tbottom: \"res4b19_branch2a\"\n\ttop: \"res4b19_branch2a\"\n\tname: \"scale4b19_branch2a\"\n\ttype: \"Scale\"\n\tscale_param {\n\t\tbias_term: true\n\t}\n}\n\nlayer {\n\ttop: \"res4b19_branch2a\"\n\tbottom: \"res4b19_branch2a\"\n\tname: \"res4b19_branch2a_relu\"\n\ttype: \"ReLU\"\n}\n\nlayer {\n\tbottom: \"res4b19_branch2a\"\n\ttop: \"res4b19_branch2b\"\n\tname: \"res4b19_branch2b\"\n\ttype: \"Convolution\"\n\tconvolution_param {\n\t\tnum_output: 256\n\t\tkernel_size: 3\n\t\tpad: 1\n\t\tstride: 1\n\t\tbias_term: false\n\t}\n}\n\nlayer {\n\tbottom: \"res4b19_branch2b\"\n\ttop: \"res4b19_branch2b\"\n\tname: \"bn4b19_branch2b\"\n\ttype: \"BatchNorm\"\n\tbatch_norm_param {\n\t\tuse_global_stats: true\n\t}\n}\n\nlayer {\n\tbottom: \"res4b19_branch2b\"\n\ttop: \"res4b19_branch2b\"\n\tname: \"scale4b19_branch2b\"\n\ttype: \"Scale\"\n\tscale_param {\n\t\tbias_term: true\n\t}\n}\n\nlayer {\n\ttop: \"res4b19_branch2b\"\n\tbottom: \"res4b19_branch2b\"\n\tname: \"res4b19_branch2b_relu\"\n\ttype: \"ReLU\"\n}\n\nlayer {\n\tbottom: \"res4b19_branch2b\"\n\ttop: \"res4b19_branch2c\"\n\tname: \"res4b19_branch2c\"\n\ttype: \"Convolution\"\n\tconvolution_param {\n\t\tnum_output: 1024\n\t\tkernel_size: 1\n\t\tpad: 0\n\t\tstride: 1\n\t\tbias_term: false\n\t}\n}\n\nlayer {\n\tbottom: \"res4b19_branch2c\"\n\ttop: \"res4b19_branch2c\"\n\tname: \"bn4b19_branch2c\"\n\ttype: \"BatchNorm\"\n\tbatch_norm_param {\n\t\tuse_global_stats: true\n\t}\n}\n\nlayer {\n\tbottom: \"res4b19_branch2c\"\n\ttop: \"res4b19_branch2c\"\n\tname: \"scale4b19_branch2c\"\n\ttype: \"Scale\"\n\tscale_param {\n\t\tbias_term: true\n\t}\n}\n\nlayer {\n\tbottom: \"res4b18\"\n\tbottom: \"res4b19_branch2c\"\n\ttop: \"res4b19\"\n\tname: \"res4b19\"\n\ttype: \"Eltwise\"\n}\n\nlayer {\n\tbottom: \"res4b19\"\n\ttop: \"res4b19\"\n\tname: \"res4b19_relu\"\n\ttype: \"ReLU\"\n}\n\nlayer {\n\tbottom: \"res4b19\"\n\ttop: \"res4b20_branch2a\"\n\tname: \"res4b20_branch2a\"\n\ttype: \"Convolution\"\n\tconvolution_param {\n\t\tnum_output: 256\n\t\tkernel_size: 1\n\t\tpad: 0\n\t\tstride: 1\n\t\tbias_term: false\n\t}\n}\n\nlayer {\n\tbottom: \"res4b20_branch2a\"\n\ttop: \"res4b20_branch2a\"\n\tname: \"bn4b20_branch2a\"\n\ttype: \"BatchNorm\"\n\tbatch_norm_param {\n\t\tuse_global_stats: true\n\t}\n}\n\nlayer {\n\tbottom: \"res4b20_branch2a\"\n\ttop: \"res4b20_branch2a\"\n\tname: \"scale4b20_branch2a\"\n\ttype: \"Scale\"\n\tscale_param {\n\t\tbias_term: true\n\t}\n}\n\nlayer {\n\ttop: \"res4b20_branch2a\"\n\tbottom: \"res4b20_branch2a\"\n\tname: \"res4b20_branch2a_relu\"\n\ttype: \"ReLU\"\n}\n\nlayer {\n\tbottom: \"res4b20_branch2a\"\n\ttop: \"res4b20_branch2b\"\n\tname: \"res4b20_branch2b\"\n\ttype: \"Convolution\"\n\tconvolution_param {\n\t\tnum_output: 256\n\t\tkernel_size: 3\n\t\tpad: 1\n\t\tstride: 1\n\t\tbias_term: false\n\t}\n}\n\nlayer {\n\tbottom: \"res4b20_branch2b\"\n\ttop: \"res4b20_branch2b\"\n\tname: \"bn4b20_branch2b\"\n\ttype: \"BatchNorm\"\n\tbatch_norm_param {\n\t\tuse_global_stats: true\n\t}\n}\n\nlayer {\n\tbottom: \"res4b20_branch2b\"\n\ttop: \"res4b20_branch2b\"\n\tname: \"scale4b20_branch2b\"\n\ttype: \"Scale\"\n\tscale_param {\n\t\tbias_term: true\n\t}\n}\n\nlayer {\n\ttop: \"res4b20_branch2b\"\n\tbottom: \"res4b20_branch2b\"\n\tname: \"res4b20_branch2b_relu\"\n\ttype: \"ReLU\"\n}\n\nlayer {\n\tbottom: \"res4b20_branch2b\"\n\ttop: \"res4b20_branch2c\"\n\tname: \"res4b20_branch2c\"\n\ttype: \"Convolution\"\n\tconvolution_param {\n\t\tnum_output: 1024\n\t\tkernel_size: 1\n\t\tpad: 0\n\t\tstride: 1\n\t\tbias_term: false\n\t}\n}\n\nlayer {\n\tbottom: \"res4b20_branch2c\"\n\ttop: \"res4b20_branch2c\"\n\tname: \"bn4b20_branch2c\"\n\ttype: \"BatchNorm\"\n\tbatch_norm_param {\n\t\tuse_global_stats: true\n\t}\n}\n\nlayer {\n\tbottom: \"res4b20_branch2c\"\n\ttop: \"res4b20_branch2c\"\n\tname: \"scale4b20_branch2c\"\n\ttype: \"Scale\"\n\tscale_param {\n\t\tbias_term: true\n\t}\n}\n\nlayer {\n\tbottom: \"res4b19\"\n\tbottom: \"res4b20_branch2c\"\n\ttop: \"res4b20\"\n\tname: \"res4b20\"\n\ttype: \"Eltwise\"\n}\n\nlayer {\n\tbottom: \"res4b20\"\n\ttop: \"res4b20\"\n\tname: \"res4b20_relu\"\n\ttype: \"ReLU\"\n}\n\nlayer {\n\tbottom: \"res4b20\"\n\ttop: \"res4b21_branch2a\"\n\tname: \"res4b21_branch2a\"\n\ttype: \"Convolution\"\n\tconvolution_param {\n\t\tnum_output: 256\n\t\tkernel_size: 1\n\t\tpad: 0\n\t\tstride: 1\n\t\tbias_term: false\n\t}\n}\n\nlayer {\n\tbottom: \"res4b21_branch2a\"\n\ttop: \"res4b21_branch2a\"\n\tname: \"bn4b21_branch2a\"\n\ttype: \"BatchNorm\"\n\tbatch_norm_param {\n\t\tuse_global_stats: true\n\t}\n}\n\nlayer {\n\tbottom: \"res4b21_branch2a\"\n\ttop: \"res4b21_branch2a\"\n\tname: \"scale4b21_branch2a\"\n\ttype: \"Scale\"\n\tscale_param {\n\t\tbias_term: true\n\t}\n}\n\nlayer {\n\ttop: \"res4b21_branch2a\"\n\tbottom: \"res4b21_branch2a\"\n\tname: \"res4b21_branch2a_relu\"\n\ttype: \"ReLU\"\n}\n\nlayer {\n\tbottom: \"res4b21_branch2a\"\n\ttop: \"res4b21_branch2b\"\n\tname: \"res4b21_branch2b\"\n\ttype: \"Convolution\"\n\tconvolution_param {\n\t\tnum_output: 256\n\t\tkernel_size: 3\n\t\tpad: 1\n\t\tstride: 1\n\t\tbias_term: false\n\t}\n}\n\nlayer {\n\tbottom: \"res4b21_branch2b\"\n\ttop: \"res4b21_branch2b\"\n\tname: \"bn4b21_branch2b\"\n\ttype: \"BatchNorm\"\n\tbatch_norm_param {\n\t\tuse_global_stats: true\n\t}\n}\n\nlayer {\n\tbottom: \"res4b21_branch2b\"\n\ttop: \"res4b21_branch2b\"\n\tname: \"scale4b21_branch2b\"\n\ttype: \"Scale\"\n\tscale_param {\n\t\tbias_term: true\n\t}\n}\n\nlayer {\n\ttop: \"res4b21_branch2b\"\n\tbottom: \"res4b21_branch2b\"\n\tname: \"res4b21_branch2b_relu\"\n\ttype: \"ReLU\"\n}\n\nlayer {\n\tbottom: \"res4b21_branch2b\"\n\ttop: \"res4b21_branch2c\"\n\tname: \"res4b21_branch2c\"\n\ttype: \"Convolution\"\n\tconvolution_param {\n\t\tnum_output: 1024\n\t\tkernel_size: 1\n\t\tpad: 0\n\t\tstride: 1\n\t\tbias_term: false\n\t}\n}\n\nlayer {\n\tbottom: \"res4b21_branch2c\"\n\ttop: \"res4b21_branch2c\"\n\tname: \"bn4b21_branch2c\"\n\ttype: \"BatchNorm\"\n\tbatch_norm_param {\n\t\tuse_global_stats: true\n\t}\n}\n\nlayer {\n\tbottom: \"res4b21_branch2c\"\n\ttop: \"res4b21_branch2c\"\n\tname: \"scale4b21_branch2c\"\n\ttype: \"Scale\"\n\tscale_param {\n\t\tbias_term: true\n\t}\n}\n\nlayer {\n\tbottom: \"res4b20\"\n\tbottom: \"res4b21_branch2c\"\n\ttop: \"res4b21\"\n\tname: \"res4b21\"\n\ttype: \"Eltwise\"\n}\n\nlayer {\n\tbottom: \"res4b21\"\n\ttop: \"res4b21\"\n\tname: \"res4b21_relu\"\n\ttype: \"ReLU\"\n}\n\nlayer {\n\tbottom: \"res4b21\"\n\ttop: \"res4b22_branch2a\"\n\tname: \"res4b22_branch2a\"\n\ttype: \"Convolution\"\n\tconvolution_param {\n\t\tnum_output: 256\n\t\tkernel_size: 1\n\t\tpad: 0\n\t\tstride: 1\n\t\tbias_term: false\n\t}\n}\n\nlayer {\n\tbottom: \"res4b22_branch2a\"\n\ttop: \"res4b22_branch2a\"\n\tname: \"bn4b22_branch2a\"\n\ttype: \"BatchNorm\"\n\tbatch_norm_param {\n\t\tuse_global_stats: true\n\t}\n}\n\nlayer {\n\tbottom: \"res4b22_branch2a\"\n\ttop: \"res4b22_branch2a\"\n\tname: \"scale4b22_branch2a\"\n\ttype: \"Scale\"\n\tscale_param {\n\t\tbias_term: true\n\t}\n}\n\nlayer {\n\ttop: \"res4b22_branch2a\"\n\tbottom: \"res4b22_branch2a\"\n\tname: \"res4b22_branch2a_relu\"\n\ttype: \"ReLU\"\n}\n\nlayer {\n\tbottom: \"res4b22_branch2a\"\n\ttop: \"res4b22_branch2b\"\n\tname: \"res4b22_branch2b\"\n\ttype: \"Convolution\"\n\tconvolution_param {\n\t\tnum_output: 256\n\t\tkernel_size: 3\n\t\tpad: 1\n\t\tstride: 1\n\t\tbias_term: false\n\t}\n}\n\nlayer {\n\tbottom: \"res4b22_branch2b\"\n\ttop: \"res4b22_branch2b\"\n\tname: \"bn4b22_branch2b\"\n\ttype: \"BatchNorm\"\n\tbatch_norm_param {\n\t\tuse_global_stats: true\n\t}\n}\n\nlayer {\n\tbottom: \"res4b22_branch2b\"\n\ttop: \"res4b22_branch2b\"\n\tname: \"scale4b22_branch2b\"\n\ttype: \"Scale\"\n\tscale_param {\n\t\tbias_term: true\n\t}\n}\n\nlayer {\n\ttop: \"res4b22_branch2b\"\n\tbottom: \"res4b22_branch2b\"\n\tname: \"res4b22_branch2b_relu\"\n\ttype: \"ReLU\"\n}\n\nlayer {\n\tbottom: \"res4b22_branch2b\"\n\ttop: \"res4b22_branch2c\"\n\tname: \"res4b22_branch2c\"\n\ttype: \"Convolution\"\n\tconvolution_param {\n\t\tnum_output: 1024\n\t\tkernel_size: 1\n\t\tpad: 0\n\t\tstride: 1\n\t\tbias_term: false\n\t}\n}\n\nlayer {\n\tbottom: \"res4b22_branch2c\"\n\ttop: \"res4b22_branch2c\"\n\tname: \"bn4b22_branch2c\"\n\ttype: \"BatchNorm\"\n\tbatch_norm_param {\n\t\tuse_global_stats: true\n\t}\n}\n\nlayer {\n\tbottom: \"res4b22_branch2c\"\n\ttop: \"res4b22_branch2c\"\n\tname: \"scale4b22_branch2c\"\n\ttype: \"Scale\"\n\tscale_param {\n\t\tbias_term: true\n\t}\n}\n\nlayer {\n\tbottom: \"res4b21\"\n\tbottom: \"res4b22_branch2c\"\n\ttop: \"res4b22\"\n\tname: \"res4b22\"\n\ttype: \"Eltwise\"\n}\n\nlayer {\n\tbottom: \"res4b22\"\n\ttop: \"res4b22\"\n\tname: \"res4b22_relu\"\n\ttype: \"ReLU\"\n}\n\nlayer {\n\tbottom: \"res4b22\"\n\ttop: \"res4b23_branch2a\"\n\tname: \"res4b23_branch2a\"\n\ttype: \"Convolution\"\n\tconvolution_param {\n\t\tnum_output: 256\n\t\tkernel_size: 1\n\t\tpad: 0\n\t\tstride: 1\n\t\tbias_term: false\n\t}\n}\n\nlayer {\n\tbottom: \"res4b23_branch2a\"\n\ttop: \"res4b23_branch2a\"\n\tname: \"bn4b23_branch2a\"\n\ttype: \"BatchNorm\"\n\tbatch_norm_param {\n\t\tuse_global_stats: true\n\t}\n}\n\nlayer {\n\tbottom: \"res4b23_branch2a\"\n\ttop: \"res4b23_branch2a\"\n\tname: \"scale4b23_branch2a\"\n\ttype: \"Scale\"\n\tscale_param {\n\t\tbias_term: true\n\t}\n}\n\nlayer {\n\ttop: \"res4b23_branch2a\"\n\tbottom: \"res4b23_branch2a\"\n\tname: \"res4b23_branch2a_relu\"\n\ttype: \"ReLU\"\n}\n\nlayer {\n\tbottom: \"res4b23_branch2a\"\n\ttop: \"res4b23_branch2b\"\n\tname: \"res4b23_branch2b\"\n\ttype: \"Convolution\"\n\tconvolution_param {\n\t\tnum_output: 256\n\t\tkernel_size: 3\n\t\tpad: 1\n\t\tstride: 1\n\t\tbias_term: false\n\t}\n}\n\nlayer {\n\tbottom: \"res4b23_branch2b\"\n\ttop: \"res4b23_branch2b\"\n\tname: \"bn4b23_branch2b\"\n\ttype: \"BatchNorm\"\n\tbatch_norm_param {\n\t\tuse_global_stats: true\n\t}\n}\n\nlayer {\n\tbottom: \"res4b23_branch2b\"\n\ttop: \"res4b23_branch2b\"\n\tname: \"scale4b23_branch2b\"\n\ttype: \"Scale\"\n\tscale_param {\n\t\tbias_term: true\n\t}\n}\n\nlayer {\n\ttop: \"res4b23_branch2b\"\n\tbottom: \"res4b23_branch2b\"\n\tname: \"res4b23_branch2b_relu\"\n\ttype: \"ReLU\"\n}\n\nlayer {\n\tbottom: \"res4b23_branch2b\"\n\ttop: \"res4b23_branch2c\"\n\tname: \"res4b23_branch2c\"\n\ttype: \"Convolution\"\n\tconvolution_param {\n\t\tnum_output: 1024\n\t\tkernel_size: 1\n\t\tpad: 0\n\t\tstride: 1\n\t\tbias_term: false\n\t}\n}\n\nlayer {\n\tbottom: \"res4b23_branch2c\"\n\ttop: \"res4b23_branch2c\"\n\tname: \"bn4b23_branch2c\"\n\ttype: \"BatchNorm\"\n\tbatch_norm_param {\n\t\tuse_global_stats: true\n\t}\n}\n\nlayer {\n\tbottom: \"res4b23_branch2c\"\n\ttop: \"res4b23_branch2c\"\n\tname: \"scale4b23_branch2c\"\n\ttype: \"Scale\"\n\tscale_param {\n\t\tbias_term: true\n\t}\n}\n\nlayer {\n\tbottom: \"res4b22\"\n\tbottom: \"res4b23_branch2c\"\n\ttop: \"res4b23\"\n\tname: \"res4b23\"\n\ttype: \"Eltwise\"\n}\n\nlayer {\n\tbottom: \"res4b23\"\n\ttop: \"res4b23\"\n\tname: \"res4b23_relu\"\n\ttype: \"ReLU\"\n}\n\nlayer {\n\tbottom: \"res4b23\"\n\ttop: \"res4b24_branch2a\"\n\tname: \"res4b24_branch2a\"\n\ttype: \"Convolution\"\n\tconvolution_param {\n\t\tnum_output: 256\n\t\tkernel_size: 1\n\t\tpad: 0\n\t\tstride: 1\n\t\tbias_term: false\n\t}\n}\n\nlayer {\n\tbottom: \"res4b24_branch2a\"\n\ttop: \"res4b24_branch2a\"\n\tname: \"bn4b24_branch2a\"\n\ttype: \"BatchNorm\"\n\tbatch_norm_param {\n\t\tuse_global_stats: true\n\t}\n}\n\nlayer {\n\tbottom: \"res4b24_branch2a\"\n\ttop: \"res4b24_branch2a\"\n\tname: \"scale4b24_branch2a\"\n\ttype: \"Scale\"\n\tscale_param {\n\t\tbias_term: true\n\t}\n}\n\nlayer {\n\ttop: \"res4b24_branch2a\"\n\tbottom: \"res4b24_branch2a\"\n\tname: \"res4b24_branch2a_relu\"\n\ttype: \"ReLU\"\n}\n\nlayer {\n\tbottom: \"res4b24_branch2a\"\n\ttop: \"res4b24_branch2b\"\n\tname: \"res4b24_branch2b\"\n\ttype: \"Convolution\"\n\tconvolution_param {\n\t\tnum_output: 256\n\t\tkernel_size: 3\n\t\tpad: 1\n\t\tstride: 1\n\t\tbias_term: false\n\t}\n}\n\nlayer {\n\tbottom: \"res4b24_branch2b\"\n\ttop: \"res4b24_branch2b\"\n\tname: \"bn4b24_branch2b\"\n\ttype: \"BatchNorm\"\n\tbatch_norm_param {\n\t\tuse_global_stats: true\n\t}\n}\n\nlayer {\n\tbottom: \"res4b24_branch2b\"\n\ttop: \"res4b24_branch2b\"\n\tname: \"scale4b24_branch2b\"\n\ttype: \"Scale\"\n\tscale_param {\n\t\tbias_term: true\n\t}\n}\n\nlayer {\n\ttop: \"res4b24_branch2b\"\n\tbottom: \"res4b24_branch2b\"\n\tname: \"res4b24_branch2b_relu\"\n\ttype: \"ReLU\"\n}\n\nlayer {\n\tbottom: \"res4b24_branch2b\"\n\ttop: \"res4b24_branch2c\"\n\tname: \"res4b24_branch2c\"\n\ttype: \"Convolution\"\n\tconvolution_param {\n\t\tnum_output: 1024\n\t\tkernel_size: 1\n\t\tpad: 0\n\t\tstride: 1\n\t\tbias_term: false\n\t}\n}\n\nlayer {\n\tbottom: \"res4b24_branch2c\"\n\ttop: \"res4b24_branch2c\"\n\tname: \"bn4b24_branch2c\"\n\ttype: \"BatchNorm\"\n\tbatch_norm_param {\n\t\tuse_global_stats: true\n\t}\n}\n\nlayer {\n\tbottom: \"res4b24_branch2c\"\n\ttop: \"res4b24_branch2c\"\n\tname: \"scale4b24_branch2c\"\n\ttype: \"Scale\"\n\tscale_param {\n\t\tbias_term: true\n\t}\n}\n\nlayer {\n\tbottom: \"res4b23\"\n\tbottom: \"res4b24_branch2c\"\n\ttop: \"res4b24\"\n\tname: \"res4b24\"\n\ttype: \"Eltwise\"\n}\n\nlayer {\n\tbottom: \"res4b24\"\n\ttop: \"res4b24\"\n\tname: \"res4b24_relu\"\n\ttype: \"ReLU\"\n}\n\nlayer {\n\tbottom: \"res4b24\"\n\ttop: \"res4b25_branch2a\"\n\tname: \"res4b25_branch2a\"\n\ttype: \"Convolution\"\n\tconvolution_param {\n\t\tnum_output: 256\n\t\tkernel_size: 1\n\t\tpad: 0\n\t\tstride: 1\n\t\tbias_term: false\n\t}\n}\n\nlayer {\n\tbottom: \"res4b25_branch2a\"\n\ttop: \"res4b25_branch2a\"\n\tname: \"bn4b25_branch2a\"\n\ttype: \"BatchNorm\"\n\tbatch_norm_param {\n\t\tuse_global_stats: true\n\t}\n}\n\nlayer {\n\tbottom: \"res4b25_branch2a\"\n\ttop: \"res4b25_branch2a\"\n\tname: \"scale4b25_branch2a\"\n\ttype: \"Scale\"\n\tscale_param {\n\t\tbias_term: true\n\t}\n}\n\nlayer {\n\ttop: \"res4b25_branch2a\"\n\tbottom: \"res4b25_branch2a\"\n\tname: \"res4b25_branch2a_relu\"\n\ttype: \"ReLU\"\n}\n\nlayer {\n\tbottom: \"res4b25_branch2a\"\n\ttop: \"res4b25_branch2b\"\n\tname: \"res4b25_branch2b\"\n\ttype: \"Convolution\"\n\tconvolution_param {\n\t\tnum_output: 256\n\t\tkernel_size: 3\n\t\tpad: 1\n\t\tstride: 1\n\t\tbias_term: false\n\t}\n}\n\nlayer {\n\tbottom: \"res4b25_branch2b\"\n\ttop: \"res4b25_branch2b\"\n\tname: \"bn4b25_branch2b\"\n\ttype: \"BatchNorm\"\n\tbatch_norm_param {\n\t\tuse_global_stats: true\n\t}\n}\n\nlayer {\n\tbottom: \"res4b25_branch2b\"\n\ttop: \"res4b25_branch2b\"\n\tname: \"scale4b25_branch2b\"\n\ttype: \"Scale\"\n\tscale_param {\n\t\tbias_term: true\n\t}\n}\n\nlayer {\n\ttop: \"res4b25_branch2b\"\n\tbottom: \"res4b25_branch2b\"\n\tname: \"res4b25_branch2b_relu\"\n\ttype: \"ReLU\"\n}\n\nlayer {\n\tbottom: \"res4b25_branch2b\"\n\ttop: \"res4b25_branch2c\"\n\tname: \"res4b25_branch2c\"\n\ttype: \"Convolution\"\n\tconvolution_param {\n\t\tnum_output: 1024\n\t\tkernel_size: 1\n\t\tpad: 0\n\t\tstride: 1\n\t\tbias_term: false\n\t}\n}\n\nlayer {\n\tbottom: \"res4b25_branch2c\"\n\ttop: \"res4b25_branch2c\"\n\tname: \"bn4b25_branch2c\"\n\ttype: \"BatchNorm\"\n\tbatch_norm_param {\n\t\tuse_global_stats: true\n\t}\n}\n\nlayer {\n\tbottom: \"res4b25_branch2c\"\n\ttop: \"res4b25_branch2c\"\n\tname: \"scale4b25_branch2c\"\n\ttype: \"Scale\"\n\tscale_param {\n\t\tbias_term: true\n\t}\n}\n\nlayer {\n\tbottom: \"res4b24\"\n\tbottom: \"res4b25_branch2c\"\n\ttop: \"res4b25\"\n\tname: \"res4b25\"\n\ttype: \"Eltwise\"\n}\n\nlayer {\n\tbottom: \"res4b25\"\n\ttop: \"res4b25\"\n\tname: \"res4b25_relu\"\n\ttype: \"ReLU\"\n}\n\nlayer {\n\tbottom: \"res4b25\"\n\ttop: \"res4b26_branch2a\"\n\tname: \"res4b26_branch2a\"\n\ttype: \"Convolution\"\n\tconvolution_param {\n\t\tnum_output: 256\n\t\tkernel_size: 1\n\t\tpad: 0\n\t\tstride: 1\n\t\tbias_term: false\n\t}\n}\n\nlayer {\n\tbottom: \"res4b26_branch2a\"\n\ttop: \"res4b26_branch2a\"\n\tname: \"bn4b26_branch2a\"\n\ttype: \"BatchNorm\"\n\tbatch_norm_param {\n\t\tuse_global_stats: true\n\t}\n}\n\nlayer {\n\tbottom: \"res4b26_branch2a\"\n\ttop: \"res4b26_branch2a\"\n\tname: \"scale4b26_branch2a\"\n\ttype: \"Scale\"\n\tscale_param {\n\t\tbias_term: true\n\t}\n}\n\nlayer {\n\ttop: \"res4b26_branch2a\"\n\tbottom: \"res4b26_branch2a\"\n\tname: \"res4b26_branch2a_relu\"\n\ttype: \"ReLU\"\n}\n\nlayer {\n\tbottom: \"res4b26_branch2a\"\n\ttop: \"res4b26_branch2b\"\n\tname: \"res4b26_branch2b\"\n\ttype: \"Convolution\"\n\tconvolution_param {\n\t\tnum_output: 256\n\t\tkernel_size: 3\n\t\tpad: 1\n\t\tstride: 1\n\t\tbias_term: false\n\t}\n}\n\nlayer {\n\tbottom: \"res4b26_branch2b\"\n\ttop: \"res4b26_branch2b\"\n\tname: \"bn4b26_branch2b\"\n\ttype: \"BatchNorm\"\n\tbatch_norm_param {\n\t\tuse_global_stats: true\n\t}\n}\n\nlayer {\n\tbottom: \"res4b26_branch2b\"\n\ttop: \"res4b26_branch2b\"\n\tname: \"scale4b26_branch2b\"\n\ttype: \"Scale\"\n\tscale_param {\n\t\tbias_term: true\n\t}\n}\n\nlayer {\n\ttop: \"res4b26_branch2b\"\n\tbottom: \"res4b26_branch2b\"\n\tname: \"res4b26_branch2b_relu\"\n\ttype: \"ReLU\"\n}\n\nlayer {\n\tbottom: \"res4b26_branch2b\"\n\ttop: \"res4b26_branch2c\"\n\tname: \"res4b26_branch2c\"\n\ttype: \"Convolution\"\n\tconvolution_param {\n\t\tnum_output: 1024\n\t\tkernel_size: 1\n\t\tpad: 0\n\t\tstride: 1\n\t\tbias_term: false\n\t}\n}\n\nlayer {\n\tbottom: \"res4b26_branch2c\"\n\ttop: \"res4b26_branch2c\"\n\tname: \"bn4b26_branch2c\"\n\ttype: \"BatchNorm\"\n\tbatch_norm_param {\n\t\tuse_global_stats: true\n\t}\n}\n\nlayer {\n\tbottom: \"res4b26_branch2c\"\n\ttop: \"res4b26_branch2c\"\n\tname: \"scale4b26_branch2c\"\n\ttype: \"Scale\"\n\tscale_param {\n\t\tbias_term: true\n\t}\n}\n\nlayer {\n\tbottom: \"res4b25\"\n\tbottom: \"res4b26_branch2c\"\n\ttop: \"res4b26\"\n\tname: \"res4b26\"\n\ttype: \"Eltwise\"\n}\n\nlayer {\n\tbottom: \"res4b26\"\n\ttop: \"res4b26\"\n\tname: \"res4b26_relu\"\n\ttype: \"ReLU\"\n}\n\nlayer {\n\tbottom: \"res4b26\"\n\ttop: \"res4b27_branch2a\"\n\tname: \"res4b27_branch2a\"\n\ttype: \"Convolution\"\n\tconvolution_param {\n\t\tnum_output: 256\n\t\tkernel_size: 1\n\t\tpad: 0\n\t\tstride: 1\n\t\tbias_term: false\n\t}\n}\n\nlayer {\n\tbottom: \"res4b27_branch2a\"\n\ttop: \"res4b27_branch2a\"\n\tname: \"bn4b27_branch2a\"\n\ttype: \"BatchNorm\"\n\tbatch_norm_param {\n\t\tuse_global_stats: true\n\t}\n}\n\nlayer {\n\tbottom: \"res4b27_branch2a\"\n\ttop: \"res4b27_branch2a\"\n\tname: \"scale4b27_branch2a\"\n\ttype: \"Scale\"\n\tscale_param {\n\t\tbias_term: true\n\t}\n}\n\nlayer {\n\ttop: \"res4b27_branch2a\"\n\tbottom: \"res4b27_branch2a\"\n\tname: \"res4b27_branch2a_relu\"\n\ttype: \"ReLU\"\n}\n\nlayer {\n\tbottom: \"res4b27_branch2a\"\n\ttop: \"res4b27_branch2b\"\n\tname: \"res4b27_branch2b\"\n\ttype: \"Convolution\"\n\tconvolution_param {\n\t\tnum_output: 256\n\t\tkernel_size: 3\n\t\tpad: 1\n\t\tstride: 1\n\t\tbias_term: false\n\t}\n}\n\nlayer {\n\tbottom: \"res4b27_branch2b\"\n\ttop: \"res4b27_branch2b\"\n\tname: \"bn4b27_branch2b\"\n\ttype: \"BatchNorm\"\n\tbatch_norm_param {\n\t\tuse_global_stats: true\n\t}\n}\n\nlayer {\n\tbottom: \"res4b27_branch2b\"\n\ttop: \"res4b27_branch2b\"\n\tname: \"scale4b27_branch2b\"\n\ttype: \"Scale\"\n\tscale_param {\n\t\tbias_term: true\n\t}\n}\n\nlayer {\n\ttop: \"res4b27_branch2b\"\n\tbottom: \"res4b27_branch2b\"\n\tname: \"res4b27_branch2b_relu\"\n\ttype: \"ReLU\"\n}\n\nlayer {\n\tbottom: \"res4b27_branch2b\"\n\ttop: \"res4b27_branch2c\"\n\tname: \"res4b27_branch2c\"\n\ttype: \"Convolution\"\n\tconvolution_param {\n\t\tnum_output: 1024\n\t\tkernel_size: 1\n\t\tpad: 0\n\t\tstride: 1\n\t\tbias_term: false\n\t}\n}\n\nlayer {\n\tbottom: \"res4b27_branch2c\"\n\ttop: \"res4b27_branch2c\"\n\tname: \"bn4b27_branch2c\"\n\ttype: \"BatchNorm\"\n\tbatch_norm_param {\n\t\tuse_global_stats: true\n\t}\n}\n\nlayer {\n\tbottom: \"res4b27_branch2c\"\n\ttop: \"res4b27_branch2c\"\n\tname: \"scale4b27_branch2c\"\n\ttype: \"Scale\"\n\tscale_param {\n\t\tbias_term: true\n\t}\n}\n\nlayer {\n\tbottom: \"res4b26\"\n\tbottom: \"res4b27_branch2c\"\n\ttop: \"res4b27\"\n\tname: \"res4b27\"\n\ttype: \"Eltwise\"\n}\n\nlayer {\n\tbottom: \"res4b27\"\n\ttop: \"res4b27\"\n\tname: \"res4b27_relu\"\n\ttype: \"ReLU\"\n}\n\nlayer {\n\tbottom: \"res4b27\"\n\ttop: \"res4b28_branch2a\"\n\tname: \"res4b28_branch2a\"\n\ttype: \"Convolution\"\n\tconvolution_param {\n\t\tnum_output: 256\n\t\tkernel_size: 1\n\t\tpad: 0\n\t\tstride: 1\n\t\tbias_term: false\n\t}\n}\n\nlayer {\n\tbottom: \"res4b28_branch2a\"\n\ttop: \"res4b28_branch2a\"\n\tname: \"bn4b28_branch2a\"\n\ttype: \"BatchNorm\"\n\tbatch_norm_param {\n\t\tuse_global_stats: true\n\t}\n}\n\nlayer {\n\tbottom: \"res4b28_branch2a\"\n\ttop: \"res4b28_branch2a\"\n\tname: \"scale4b28_branch2a\"\n\ttype: \"Scale\"\n\tscale_param {\n\t\tbias_term: true\n\t}\n}\n\nlayer {\n\ttop: \"res4b28_branch2a\"\n\tbottom: \"res4b28_branch2a\"\n\tname: \"res4b28_branch2a_relu\"\n\ttype: \"ReLU\"\n}\n\nlayer {\n\tbottom: \"res4b28_branch2a\"\n\ttop: \"res4b28_branch2b\"\n\tname: \"res4b28_branch2b\"\n\ttype: \"Convolution\"\n\tconvolution_param {\n\t\tnum_output: 256\n\t\tkernel_size: 3\n\t\tpad: 1\n\t\tstride: 1\n\t\tbias_term: false\n\t}\n}\n\nlayer {\n\tbottom: \"res4b28_branch2b\"\n\ttop: \"res4b28_branch2b\"\n\tname: \"bn4b28_branch2b\"\n\ttype: \"BatchNorm\"\n\tbatch_norm_param {\n\t\tuse_global_stats: true\n\t}\n}\n\nlayer {\n\tbottom: \"res4b28_branch2b\"\n\ttop: \"res4b28_branch2b\"\n\tname: \"scale4b28_branch2b\"\n\ttype: \"Scale\"\n\tscale_param {\n\t\tbias_term: true\n\t}\n}\n\nlayer {\n\ttop: \"res4b28_branch2b\"\n\tbottom: \"res4b28_branch2b\"\n\tname: \"res4b28_branch2b_relu\"\n\ttype: \"ReLU\"\n}\n\nlayer {\n\tbottom: \"res4b28_branch2b\"\n\ttop: \"res4b28_branch2c\"\n\tname: \"res4b28_branch2c\"\n\ttype: \"Convolution\"\n\tconvolution_param {\n\t\tnum_output: 1024\n\t\tkernel_size: 1\n\t\tpad: 0\n\t\tstride: 1\n\t\tbias_term: false\n\t}\n}\n\nlayer {\n\tbottom: \"res4b28_branch2c\"\n\ttop: \"res4b28_branch2c\"\n\tname: \"bn4b28_branch2c\"\n\ttype: \"BatchNorm\"\n\tbatch_norm_param {\n\t\tuse_global_stats: true\n\t}\n}\n\nlayer {\n\tbottom: \"res4b28_branch2c\"\n\ttop: \"res4b28_branch2c\"\n\tname: \"scale4b28_branch2c\"\n\ttype: \"Scale\"\n\tscale_param {\n\t\tbias_term: true\n\t}\n}\n\nlayer {\n\tbottom: \"res4b27\"\n\tbottom: \"res4b28_branch2c\"\n\ttop: \"res4b28\"\n\tname: \"res4b28\"\n\ttype: \"Eltwise\"\n}\n\nlayer {\n\tbottom: \"res4b28\"\n\ttop: \"res4b28\"\n\tname: \"res4b28_relu\"\n\ttype: \"ReLU\"\n}\n\nlayer {\n\tbottom: \"res4b28\"\n\ttop: \"res4b29_branch2a\"\n\tname: \"res4b29_branch2a\"\n\ttype: \"Convolution\"\n\tconvolution_param {\n\t\tnum_output: 256\n\t\tkernel_size: 1\n\t\tpad: 0\n\t\tstride: 1\n\t\tbias_term: false\n\t}\n}\n\nlayer {\n\tbottom: \"res4b29_branch2a\"\n\ttop: \"res4b29_branch2a\"\n\tname: \"bn4b29_branch2a\"\n\ttype: \"BatchNorm\"\n\tbatch_norm_param {\n\t\tuse_global_stats: true\n\t}\n}\n\nlayer {\n\tbottom: \"res4b29_branch2a\"\n\ttop: \"res4b29_branch2a\"\n\tname: \"scale4b29_branch2a\"\n\ttype: \"Scale\"\n\tscale_param {\n\t\tbias_term: true\n\t}\n}\n\nlayer {\n\ttop: \"res4b29_branch2a\"\n\tbottom: \"res4b29_branch2a\"\n\tname: \"res4b29_branch2a_relu\"\n\ttype: \"ReLU\"\n}\n\nlayer {\n\tbottom: \"res4b29_branch2a\"\n\ttop: \"res4b29_branch2b\"\n\tname: \"res4b29_branch2b\"\n\ttype: \"Convolution\"\n\tconvolution_param {\n\t\tnum_output: 256\n\t\tkernel_size: 3\n\t\tpad: 1\n\t\tstride: 1\n\t\tbias_term: false\n\t}\n}\n\nlayer {\n\tbottom: \"res4b29_branch2b\"\n\ttop: \"res4b29_branch2b\"\n\tname: \"bn4b29_branch2b\"\n\ttype: \"BatchNorm\"\n\tbatch_norm_param {\n\t\tuse_global_stats: true\n\t}\n}\n\nlayer {\n\tbottom: \"res4b29_branch2b\"\n\ttop: \"res4b29_branch2b\"\n\tname: \"scale4b29_branch2b\"\n\ttype: \"Scale\"\n\tscale_param {\n\t\tbias_term: true\n\t}\n}\n\nlayer {\n\ttop: \"res4b29_branch2b\"\n\tbottom: \"res4b29_branch2b\"\n\tname: \"res4b29_branch2b_relu\"\n\ttype: \"ReLU\"\n}\n\nlayer {\n\tbottom: \"res4b29_branch2b\"\n\ttop: \"res4b29_branch2c\"\n\tname: \"res4b29_branch2c\"\n\ttype: \"Convolution\"\n\tconvolution_param {\n\t\tnum_output: 1024\n\t\tkernel_size: 1\n\t\tpad: 0\n\t\tstride: 1\n\t\tbias_term: false\n\t}\n}\n\nlayer {\n\tbottom: \"res4b29_branch2c\"\n\ttop: \"res4b29_branch2c\"\n\tname: \"bn4b29_branch2c\"\n\ttype: \"BatchNorm\"\n\tbatch_norm_param {\n\t\tuse_global_stats: true\n\t}\n}\n\nlayer {\n\tbottom: \"res4b29_branch2c\"\n\ttop: \"res4b29_branch2c\"\n\tname: \"scale4b29_branch2c\"\n\ttype: \"Scale\"\n\tscale_param {\n\t\tbias_term: true\n\t}\n}\n\nlayer {\n\tbottom: \"res4b28\"\n\tbottom: \"res4b29_branch2c\"\n\ttop: \"res4b29\"\n\tname: \"res4b29\"\n\ttype: \"Eltwise\"\n}\n\nlayer {\n\tbottom: \"res4b29\"\n\ttop: \"res4b29\"\n\tname: \"res4b29_relu\"\n\ttype: \"ReLU\"\n}\n\nlayer {\n\tbottom: \"res4b29\"\n\ttop: \"res4b30_branch2a\"\n\tname: \"res4b30_branch2a\"\n\ttype: \"Convolution\"\n\tconvolution_param {\n\t\tnum_output: 256\n\t\tkernel_size: 1\n\t\tpad: 0\n\t\tstride: 1\n\t\tbias_term: false\n\t}\n}\n\nlayer {\n\tbottom: \"res4b30_branch2a\"\n\ttop: \"res4b30_branch2a\"\n\tname: \"bn4b30_branch2a\"\n\ttype: \"BatchNorm\"\n\tbatch_norm_param {\n\t\tuse_global_stats: true\n\t}\n}\n\nlayer {\n\tbottom: \"res4b30_branch2a\"\n\ttop: \"res4b30_branch2a\"\n\tname: \"scale4b30_branch2a\"\n\ttype: \"Scale\"\n\tscale_param {\n\t\tbias_term: true\n\t}\n}\n\nlayer {\n\ttop: \"res4b30_branch2a\"\n\tbottom: \"res4b30_branch2a\"\n\tname: \"res4b30_branch2a_relu\"\n\ttype: \"ReLU\"\n}\n\nlayer {\n\tbottom: \"res4b30_branch2a\"\n\ttop: \"res4b30_branch2b\"\n\tname: \"res4b30_branch2b\"\n\ttype: \"Convolution\"\n\tconvolution_param {\n\t\tnum_output: 256\n\t\tkernel_size: 3\n\t\tpad: 1\n\t\tstride: 1\n\t\tbias_term: false\n\t}\n}\n\nlayer {\n\tbottom: \"res4b30_branch2b\"\n\ttop: \"res4b30_branch2b\"\n\tname: \"bn4b30_branch2b\"\n\ttype: \"BatchNorm\"\n\tbatch_norm_param {\n\t\tuse_global_stats: true\n\t}\n}\n\nlayer {\n\tbottom: \"res4b30_branch2b\"\n\ttop: \"res4b30_branch2b\"\n\tname: \"scale4b30_branch2b\"\n\ttype: \"Scale\"\n\tscale_param {\n\t\tbias_term: true\n\t}\n}\n\nlayer {\n\ttop: \"res4b30_branch2b\"\n\tbottom: \"res4b30_branch2b\"\n\tname: \"res4b30_branch2b_relu\"\n\ttype: \"ReLU\"\n}\n\nlayer {\n\tbottom: \"res4b30_branch2b\"\n\ttop: \"res4b30_branch2c\"\n\tname: \"res4b30_branch2c\"\n\ttype: \"Convolution\"\n\tconvolution_param {\n\t\tnum_output: 1024\n\t\tkernel_size: 1\n\t\tpad: 0\n\t\tstride: 1\n\t\tbias_term: false\n\t}\n}\n\nlayer {\n\tbottom: \"res4b30_branch2c\"\n\ttop: \"res4b30_branch2c\"\n\tname: \"bn4b30_branch2c\"\n\ttype: \"BatchNorm\"\n\tbatch_norm_param {\n\t\tuse_global_stats: true\n\t}\n}\n\nlayer {\n\tbottom: \"res4b30_branch2c\"\n\ttop: \"res4b30_branch2c\"\n\tname: \"scale4b30_branch2c\"\n\ttype: \"Scale\"\n\tscale_param {\n\t\tbias_term: true\n\t}\n}\n\nlayer {\n\tbottom: \"res4b29\"\n\tbottom: \"res4b30_branch2c\"\n\ttop: \"res4b30\"\n\tname: \"res4b30\"\n\ttype: \"Eltwise\"\n}\n\nlayer {\n\tbottom: \"res4b30\"\n\ttop: \"res4b30\"\n\tname: \"res4b30_relu\"\n\ttype: \"ReLU\"\n}\n\nlayer {\n\tbottom: \"res4b30\"\n\ttop: \"res4b31_branch2a\"\n\tname: \"res4b31_branch2a\"\n\ttype: \"Convolution\"\n\tconvolution_param {\n\t\tnum_output: 256\n\t\tkernel_size: 1\n\t\tpad: 0\n\t\tstride: 1\n\t\tbias_term: false\n\t}\n}\n\nlayer {\n\tbottom: \"res4b31_branch2a\"\n\ttop: \"res4b31_branch2a\"\n\tname: \"bn4b31_branch2a\"\n\ttype: \"BatchNorm\"\n\tbatch_norm_param {\n\t\tuse_global_stats: true\n\t}\n}\n\nlayer {\n\tbottom: \"res4b31_branch2a\"\n\ttop: \"res4b31_branch2a\"\n\tname: \"scale4b31_branch2a\"\n\ttype: \"Scale\"\n\tscale_param {\n\t\tbias_term: true\n\t}\n}\n\nlayer {\n\ttop: \"res4b31_branch2a\"\n\tbottom: \"res4b31_branch2a\"\n\tname: \"res4b31_branch2a_relu\"\n\ttype: \"ReLU\"\n}\n\nlayer {\n\tbottom: \"res4b31_branch2a\"\n\ttop: \"res4b31_branch2b\"\n\tname: \"res4b31_branch2b\"\n\ttype: \"Convolution\"\n\tconvolution_param {\n\t\tnum_output: 256\n\t\tkernel_size: 3\n\t\tpad: 1\n\t\tstride: 1\n\t\tbias_term: false\n\t}\n}\n\nlayer {\n\tbottom: \"res4b31_branch2b\"\n\ttop: \"res4b31_branch2b\"\n\tname: \"bn4b31_branch2b\"\n\ttype: \"BatchNorm\"\n\tbatch_norm_param {\n\t\tuse_global_stats: true\n\t}\n}\n\nlayer {\n\tbottom: \"res4b31_branch2b\"\n\ttop: \"res4b31_branch2b\"\n\tname: \"scale4b31_branch2b\"\n\ttype: \"Scale\"\n\tscale_param {\n\t\tbias_term: true\n\t}\n}\n\nlayer {\n\ttop: \"res4b31_branch2b\"\n\tbottom: \"res4b31_branch2b\"\n\tname: \"res4b31_branch2b_relu\"\n\ttype: \"ReLU\"\n}\n\nlayer {\n\tbottom: \"res4b31_branch2b\"\n\ttop: \"res4b31_branch2c\"\n\tname: \"res4b31_branch2c\"\n\ttype: \"Convolution\"\n\tconvolution_param {\n\t\tnum_output: 1024\n\t\tkernel_size: 1\n\t\tpad: 0\n\t\tstride: 1\n\t\tbias_term: false\n\t}\n}\n\nlayer {\n\tbottom: \"res4b31_branch2c\"\n\ttop: \"res4b31_branch2c\"\n\tname: \"bn4b31_branch2c\"\n\ttype: \"BatchNorm\"\n\tbatch_norm_param {\n\t\tuse_global_stats: true\n\t}\n}\n\nlayer {\n\tbottom: \"res4b31_branch2c\"\n\ttop: \"res4b31_branch2c\"\n\tname: \"scale4b31_branch2c\"\n\ttype: \"Scale\"\n\tscale_param {\n\t\tbias_term: true\n\t}\n}\n\nlayer {\n\tbottom: \"res4b30\"\n\tbottom: \"res4b31_branch2c\"\n\ttop: \"res4b31\"\n\tname: \"res4b31\"\n\ttype: \"Eltwise\"\n}\n\nlayer {\n\tbottom: \"res4b31\"\n\ttop: \"res4b31\"\n\tname: \"res4b31_relu\"\n\ttype: \"ReLU\"\n}\n\nlayer {\n\tbottom: \"res4b31\"\n\ttop: \"res4b32_branch2a\"\n\tname: \"res4b32_branch2a\"\n\ttype: \"Convolution\"\n\tconvolution_param {\n\t\tnum_output: 256\n\t\tkernel_size: 1\n\t\tpad: 0\n\t\tstride: 1\n\t\tbias_term: false\n\t}\n}\n\nlayer {\n\tbottom: \"res4b32_branch2a\"\n\ttop: \"res4b32_branch2a\"\n\tname: \"bn4b32_branch2a\"\n\ttype: \"BatchNorm\"\n\tbatch_norm_param {\n\t\tuse_global_stats: true\n\t}\n}\n\nlayer {\n\tbottom: \"res4b32_branch2a\"\n\ttop: \"res4b32_branch2a\"\n\tname: \"scale4b32_branch2a\"\n\ttype: \"Scale\"\n\tscale_param {\n\t\tbias_term: true\n\t}\n}\n\nlayer {\n\ttop: \"res4b32_branch2a\"\n\tbottom: \"res4b32_branch2a\"\n\tname: \"res4b32_branch2a_relu\"\n\ttype: \"ReLU\"\n}\n\nlayer {\n\tbottom: \"res4b32_branch2a\"\n\ttop: \"res4b32_branch2b\"\n\tname: \"res4b32_branch2b\"\n\ttype: \"Convolution\"\n\tconvolution_param {\n\t\tnum_output: 256\n\t\tkernel_size: 3\n\t\tpad: 1\n\t\tstride: 1\n\t\tbias_term: false\n\t}\n}\n\nlayer {\n\tbottom: \"res4b32_branch2b\"\n\ttop: \"res4b32_branch2b\"\n\tname: \"bn4b32_branch2b\"\n\ttype: \"BatchNorm\"\n\tbatch_norm_param {\n\t\tuse_global_stats: true\n\t}\n}\n\nlayer {\n\tbottom: \"res4b32_branch2b\"\n\ttop: \"res4b32_branch2b\"\n\tname: \"scale4b32_branch2b\"\n\ttype: \"Scale\"\n\tscale_param {\n\t\tbias_term: true\n\t}\n}\n\nlayer {\n\ttop: \"res4b32_branch2b\"\n\tbottom: \"res4b32_branch2b\"\n\tname: \"res4b32_branch2b_relu\"\n\ttype: \"ReLU\"\n}\n\nlayer {\n\tbottom: \"res4b32_branch2b\"\n\ttop: \"res4b32_branch2c\"\n\tname: \"res4b32_branch2c\"\n\ttype: \"Convolution\"\n\tconvolution_param {\n\t\tnum_output: 1024\n\t\tkernel_size: 1\n\t\tpad: 0\n\t\tstride: 1\n\t\tbias_term: false\n\t}\n}\n\nlayer {\n\tbottom: \"res4b32_branch2c\"\n\ttop: \"res4b32_branch2c\"\n\tname: \"bn4b32_branch2c\"\n\ttype: \"BatchNorm\"\n\tbatch_norm_param {\n\t\tuse_global_stats: true\n\t}\n}\n\nlayer {\n\tbottom: \"res4b32_branch2c\"\n\ttop: \"res4b32_branch2c\"\n\tname: \"scale4b32_branch2c\"\n\ttype: \"Scale\"\n\tscale_param {\n\t\tbias_term: true\n\t}\n}\n\nlayer {\n\tbottom: \"res4b31\"\n\tbottom: \"res4b32_branch2c\"\n\ttop: \"res4b32\"\n\tname: \"res4b32\"\n\ttype: \"Eltwise\"\n}\n\nlayer {\n\tbottom: \"res4b32\"\n\ttop: \"res4b32\"\n\tname: \"res4b32_relu\"\n\ttype: \"ReLU\"\n}\n\nlayer {\n\tbottom: \"res4b32\"\n\ttop: \"res4b33_branch2a\"\n\tname: \"res4b33_branch2a\"\n\ttype: \"Convolution\"\n\tconvolution_param {\n\t\tnum_output: 256\n\t\tkernel_size: 1\n\t\tpad: 0\n\t\tstride: 1\n\t\tbias_term: false\n\t}\n}\n\nlayer {\n\tbottom: \"res4b33_branch2a\"\n\ttop: \"res4b33_branch2a\"\n\tname: \"bn4b33_branch2a\"\n\ttype: \"BatchNorm\"\n\tbatch_norm_param {\n\t\tuse_global_stats: true\n\t}\n}\n\nlayer {\n\tbottom: \"res4b33_branch2a\"\n\ttop: \"res4b33_branch2a\"\n\tname: \"scale4b33_branch2a\"\n\ttype: \"Scale\"\n\tscale_param {\n\t\tbias_term: true\n\t}\n}\n\nlayer {\n\ttop: \"res4b33_branch2a\"\n\tbottom: \"res4b33_branch2a\"\n\tname: \"res4b33_branch2a_relu\"\n\ttype: \"ReLU\"\n}\n\nlayer {\n\tbottom: \"res4b33_branch2a\"\n\ttop: \"res4b33_branch2b\"\n\tname: \"res4b33_branch2b\"\n\ttype: \"Convolution\"\n\tconvolution_param {\n\t\tnum_output: 256\n\t\tkernel_size: 3\n\t\tpad: 1\n\t\tstride: 1\n\t\tbias_term: false\n\t}\n}\n\nlayer {\n\tbottom: \"res4b33_branch2b\"\n\ttop: \"res4b33_branch2b\"\n\tname: \"bn4b33_branch2b\"\n\ttype: \"BatchNorm\"\n\tbatch_norm_param {\n\t\tuse_global_stats: true\n\t}\n}\n\nlayer {\n\tbottom: \"res4b33_branch2b\"\n\ttop: \"res4b33_branch2b\"\n\tname: \"scale4b33_branch2b\"\n\ttype: \"Scale\"\n\tscale_param {\n\t\tbias_term: true\n\t}\n}\n\nlayer {\n\ttop: \"res4b33_branch2b\"\n\tbottom: \"res4b33_branch2b\"\n\tname: \"res4b33_branch2b_relu\"\n\ttype: \"ReLU\"\n}\n\nlayer {\n\tbottom: \"res4b33_branch2b\"\n\ttop: \"res4b33_branch2c\"\n\tname: \"res4b33_branch2c\"\n\ttype: \"Convolution\"\n\tconvolution_param {\n\t\tnum_output: 1024\n\t\tkernel_size: 1\n\t\tpad: 0\n\t\tstride: 1\n\t\tbias_term: false\n\t}\n}\n\nlayer {\n\tbottom: \"res4b33_branch2c\"\n\ttop: \"res4b33_branch2c\"\n\tname: \"bn4b33_branch2c\"\n\ttype: \"BatchNorm\"\n\tbatch_norm_param {\n\t\tuse_global_stats: true\n\t}\n}\n\nlayer {\n\tbottom: \"res4b33_branch2c\"\n\ttop: \"res4b33_branch2c\"\n\tname: \"scale4b33_branch2c\"\n\ttype: \"Scale\"\n\tscale_param {\n\t\tbias_term: true\n\t}\n}\n\nlayer {\n\tbottom: \"res4b32\"\n\tbottom: \"res4b33_branch2c\"\n\ttop: \"res4b33\"\n\tname: \"res4b33\"\n\ttype: \"Eltwise\"\n}\n\nlayer {\n\tbottom: \"res4b33\"\n\ttop: \"res4b33\"\n\tname: \"res4b33_relu\"\n\ttype: \"ReLU\"\n}\n\nlayer {\n\tbottom: \"res4b33\"\n\ttop: \"res4b34_branch2a\"\n\tname: \"res4b34_branch2a\"\n\ttype: \"Convolution\"\n\tconvolution_param {\n\t\tnum_output: 256\n\t\tkernel_size: 1\n\t\tpad: 0\n\t\tstride: 1\n\t\tbias_term: false\n\t}\n}\n\nlayer {\n\tbottom: \"res4b34_branch2a\"\n\ttop: \"res4b34_branch2a\"\n\tname: \"bn4b34_branch2a\"\n\ttype: \"BatchNorm\"\n\tbatch_norm_param {\n\t\tuse_global_stats: true\n\t}\n}\n\nlayer {\n\tbottom: \"res4b34_branch2a\"\n\ttop: \"res4b34_branch2a\"\n\tname: \"scale4b34_branch2a\"\n\ttype: \"Scale\"\n\tscale_param {\n\t\tbias_term: true\n\t}\n}\n\nlayer {\n\ttop: \"res4b34_branch2a\"\n\tbottom: \"res4b34_branch2a\"\n\tname: \"res4b34_branch2a_relu\"\n\ttype: \"ReLU\"\n}\n\nlayer {\n\tbottom: \"res4b34_branch2a\"\n\ttop: \"res4b34_branch2b\"\n\tname: \"res4b34_branch2b\"\n\ttype: \"Convolution\"\n\tconvolution_param {\n\t\tnum_output: 256\n\t\tkernel_size: 3\n\t\tpad: 1\n\t\tstride: 1\n\t\tbias_term: false\n\t}\n}\n\nlayer {\n\tbottom: \"res4b34_branch2b\"\n\ttop: \"res4b34_branch2b\"\n\tname: \"bn4b34_branch2b\"\n\ttype: \"BatchNorm\"\n\tbatch_norm_param {\n\t\tuse_global_stats: true\n\t}\n}\n\nlayer {\n\tbottom: \"res4b34_branch2b\"\n\ttop: \"res4b34_branch2b\"\n\tname: \"scale4b34_branch2b\"\n\ttype: \"Scale\"\n\tscale_param {\n\t\tbias_term: true\n\t}\n}\n\nlayer {\n\ttop: \"res4b34_branch2b\"\n\tbottom: \"res4b34_branch2b\"\n\tname: \"res4b34_branch2b_relu\"\n\ttype: \"ReLU\"\n}\n\nlayer {\n\tbottom: \"res4b34_branch2b\"\n\ttop: \"res4b34_branch2c\"\n\tname: \"res4b34_branch2c\"\n\ttype: \"Convolution\"\n\tconvolution_param {\n\t\tnum_output: 1024\n\t\tkernel_size: 1\n\t\tpad: 0\n\t\tstride: 1\n\t\tbias_term: false\n\t}\n}\n\nlayer {\n\tbottom: \"res4b34_branch2c\"\n\ttop: \"res4b34_branch2c\"\n\tname: \"bn4b34_branch2c\"\n\ttype: \"BatchNorm\"\n\tbatch_norm_param {\n\t\tuse_global_stats: true\n\t}\n}\n\nlayer {\n\tbottom: \"res4b34_branch2c\"\n\ttop: \"res4b34_branch2c\"\n\tname: \"scale4b34_branch2c\"\n\ttype: \"Scale\"\n\tscale_param {\n\t\tbias_term: true\n\t}\n}\n\nlayer {\n\tbottom: \"res4b33\"\n\tbottom: \"res4b34_branch2c\"\n\ttop: \"res4b34\"\n\tname: \"res4b34\"\n\ttype: \"Eltwise\"\n}\n\nlayer {\n\tbottom: \"res4b34\"\n\ttop: \"res4b34\"\n\tname: \"res4b34_relu\"\n\ttype: \"ReLU\"\n}\n\nlayer {\n\tbottom: \"res4b34\"\n\ttop: \"res4b35_branch2a\"\n\tname: \"res4b35_branch2a\"\n\ttype: \"Convolution\"\n\tconvolution_param {\n\t\tnum_output: 256\n\t\tkernel_size: 1\n\t\tpad: 0\n\t\tstride: 1\n\t\tbias_term: false\n\t}\n}\n\nlayer {\n\tbottom: \"res4b35_branch2a\"\n\ttop: \"res4b35_branch2a\"\n\tname: \"bn4b35_branch2a\"\n\ttype: \"BatchNorm\"\n\tbatch_norm_param {\n\t\tuse_global_stats: true\n\t}\n}\n\nlayer {\n\tbottom: \"res4b35_branch2a\"\n\ttop: \"res4b35_branch2a\"\n\tname: \"scale4b35_branch2a\"\n\ttype: \"Scale\"\n\tscale_param {\n\t\tbias_term: true\n\t}\n}\n\nlayer {\n\ttop: \"res4b35_branch2a\"\n\tbottom: \"res4b35_branch2a\"\n\tname: \"res4b35_branch2a_relu\"\n\ttype: \"ReLU\"\n}\n\nlayer {\n\tbottom: \"res4b35_branch2a\"\n\ttop: \"res4b35_branch2b\"\n\tname: \"res4b35_branch2b\"\n\ttype: \"Convolution\"\n\tconvolution_param {\n\t\tnum_output: 256\n\t\tkernel_size: 3\n\t\tpad: 1\n\t\tstride: 1\n\t\tbias_term: false\n\t}\n}\n\nlayer {\n\tbottom: \"res4b35_branch2b\"\n\ttop: \"res4b35_branch2b\"\n\tname: \"bn4b35_branch2b\"\n\ttype: \"BatchNorm\"\n\tbatch_norm_param {\n\t\tuse_global_stats: true\n\t}\n}\n\nlayer {\n\tbottom: \"res4b35_branch2b\"\n\ttop: \"res4b35_branch2b\"\n\tname: \"scale4b35_branch2b\"\n\ttype: \"Scale\"\n\tscale_param {\n\t\tbias_term: true\n\t}\n}\n\nlayer {\n\ttop: \"res4b35_branch2b\"\n\tbottom: \"res4b35_branch2b\"\n\tname: \"res4b35_branch2b_relu\"\n\ttype: \"ReLU\"\n}\n\nlayer {\n\tbottom: \"res4b35_branch2b\"\n\ttop: \"res4b35_branch2c\"\n\tname: \"res4b35_branch2c\"\n\ttype: \"Convolution\"\n\tconvolution_param {\n\t\tnum_output: 1024\n\t\tkernel_size: 1\n\t\tpad: 0\n\t\tstride: 1\n\t\tbias_term: false\n\t}\n}\n\nlayer {\n\tbottom: \"res4b35_branch2c\"\n\ttop: \"res4b35_branch2c\"\n\tname: \"bn4b35_branch2c\"\n\ttype: \"BatchNorm\"\n\tbatch_norm_param {\n\t\tuse_global_stats: true\n\t}\n}\n\nlayer {\n\tbottom: \"res4b35_branch2c\"\n\ttop: \"res4b35_branch2c\"\n\tname: \"scale4b35_branch2c\"\n\ttype: \"Scale\"\n\tscale_param {\n\t\tbias_term: true\n\t}\n}\n\nlayer {\n\tbottom: \"res4b34\"\n\tbottom: \"res4b35_branch2c\"\n\ttop: \"res4b35\"\n\tname: \"res4b35\"\n\ttype: \"Eltwise\"\n}\n\nlayer {\n\tbottom: \"res4b35\"\n\ttop: \"res4b35\"\n\tname: \"res4b35_relu\"\n\ttype: \"ReLU\"\n}\n\nlayer {\n\tbottom: \"res4b35\"\n\ttop: \"res5a_branch1\"\n\tname: \"res5a_branch1\"\n\ttype: \"Convolution\"\n\tconvolution_param {\n\t\tnum_output: 2048\n\t\tkernel_size: 1\n\t\tpad: 0\n\t\tstride: 2\n\t\tbias_term: false\n\t}\n}\n\nlayer {\n\tbottom: \"res5a_branch1\"\n\ttop: \"res5a_branch1\"\n\tname: \"bn5a_branch1\"\n\ttype: \"BatchNorm\"\n\tbatch_norm_param {\n\t\tuse_global_stats: true\n\t}\n}\n\nlayer {\n\tbottom: \"res5a_branch1\"\n\ttop: \"res5a_branch1\"\n\tname: \"scale5a_branch1\"\n\ttype: \"Scale\"\n\tscale_param {\n\t\tbias_term: true\n\t}\n}\n\nlayer {\n\tbottom: \"res4b35\"\n\ttop: \"res5a_branch2a\"\n\tname: \"res5a_branch2a\"\n\ttype: \"Convolution\"\n\tconvolution_param {\n\t\tnum_output: 512\n\t\tkernel_size: 1\n\t\tpad: 0\n\t\tstride: 2\n\t\tbias_term: false\n\t}\n}\n\nlayer {\n\tbottom: \"res5a_branch2a\"\n\ttop: \"res5a_branch2a\"\n\tname: \"bn5a_branch2a\"\n\ttype: \"BatchNorm\"\n\tbatch_norm_param {\n\t\tuse_global_stats: true\n\t}\n}\n\nlayer {\n\tbottom: \"res5a_branch2a\"\n\ttop: \"res5a_branch2a\"\n\tname: \"scale5a_branch2a\"\n\ttype: \"Scale\"\n\tscale_param {\n\t\tbias_term: true\n\t}\n}\n\nlayer {\n\ttop: \"res5a_branch2a\"\n\tbottom: \"res5a_branch2a\"\n\tname: \"res5a_branch2a_relu\"\n\ttype: \"ReLU\"\n}\n\nlayer {\n\tbottom: \"res5a_branch2a\"\n\ttop: \"res5a_branch2b\"\n\tname: \"res5a_branch2b\"\n\ttype: \"Convolution\"\n\tconvolution_param {\n\t\tnum_output: 512\n\t\tkernel_size: 3\n\t\tpad: 1\n\t\tstride: 1\n\t\tbias_term: false\n\t}\n}\n\nlayer {\n\tbottom: \"res5a_branch2b\"\n\ttop: \"res5a_branch2b\"\n\tname: \"bn5a_branch2b\"\n\ttype: \"BatchNorm\"\n\tbatch_norm_param {\n\t\tuse_global_stats: true\n\t}\n}\n\nlayer {\n\tbottom: \"res5a_branch2b\"\n\ttop: \"res5a_branch2b\"\n\tname: \"scale5a_branch2b\"\n\ttype: \"Scale\"\n\tscale_param {\n\t\tbias_term: true\n\t}\n}\n\nlayer {\n\ttop: \"res5a_branch2b\"\n\tbottom: \"res5a_branch2b\"\n\tname: \"res5a_branch2b_relu\"\n\ttype: \"ReLU\"\n}\n\nlayer {\n\tbottom: \"res5a_branch2b\"\n\ttop: \"res5a_branch2c\"\n\tname: \"res5a_branch2c\"\n\ttype: \"Convolution\"\n\tconvolution_param {\n\t\tnum_output: 2048\n\t\tkernel_size: 1\n\t\tpad: 0\n\t\tstride: 1\n\t\tbias_term: false\n\t}\n}\n\nlayer {\n\tbottom: \"res5a_branch2c\"\n\ttop: \"res5a_branch2c\"\n\tname: \"bn5a_branch2c\"\n\ttype: \"BatchNorm\"\n\tbatch_norm_param {\n\t\tuse_global_stats: true\n\t}\n}\n\nlayer {\n\tbottom: \"res5a_branch2c\"\n\ttop: \"res5a_branch2c\"\n\tname: \"scale5a_branch2c\"\n\ttype: \"Scale\"\n\tscale_param {\n\t\tbias_term: true\n\t}\n}\n\nlayer {\n\tbottom: \"res5a_branch1\"\n\tbottom: \"res5a_branch2c\"\n\ttop: \"res5a\"\n\tname: \"res5a\"\n\ttype: \"Eltwise\"\n}\n\nlayer {\n\tbottom: \"res5a\"\n\ttop: \"res5a\"\n\tname: \"res5a_relu\"\n\ttype: \"ReLU\"\n}\n\nlayer {\n\tbottom: \"res5a\"\n\ttop: \"res5b_branch2a\"\n\tname: \"res5b_branch2a\"\n\ttype: \"Convolution\"\n\tconvolution_param {\n\t\tnum_output: 512\n\t\tkernel_size: 1\n\t\tpad: 0\n\t\tstride: 1\n\t\tbias_term: false\n\t}\n}\n\nlayer {\n\tbottom: \"res5b_branch2a\"\n\ttop: \"res5b_branch2a\"\n\tname: \"bn5b_branch2a\"\n\ttype: \"BatchNorm\"\n\tbatch_norm_param {\n\t\tuse_global_stats: true\n\t}\n}\n\nlayer {\n\tbottom: \"res5b_branch2a\"\n\ttop: \"res5b_branch2a\"\n\tname: \"scale5b_branch2a\"\n\ttype: \"Scale\"\n\tscale_param {\n\t\tbias_term: true\n\t}\n}\n\nlayer {\n\ttop: \"res5b_branch2a\"\n\tbottom: \"res5b_branch2a\"\n\tname: \"res5b_branch2a_relu\"\n\ttype: \"ReLU\"\n}\n\nlayer {\n\tbottom: \"res5b_branch2a\"\n\ttop: \"res5b_branch2b\"\n\tname: \"res5b_branch2b\"\n\ttype: \"Convolution\"\n\tconvolution_param {\n\t\tnum_output: 512\n\t\tkernel_size: 3\n\t\tpad: 1\n\t\tstride: 1\n\t\tbias_term: false\n\t}\n}\n\nlayer {\n\tbottom: \"res5b_branch2b\"\n\ttop: \"res5b_branch2b\"\n\tname: \"bn5b_branch2b\"\n\ttype: \"BatchNorm\"\n\tbatch_norm_param {\n\t\tuse_global_stats: true\n\t}\n}\n\nlayer {\n\tbottom: \"res5b_branch2b\"\n\ttop: \"res5b_branch2b\"\n\tname: \"scale5b_branch2b\"\n\ttype: \"Scale\"\n\tscale_param {\n\t\tbias_term: true\n\t}\n}\n\nlayer {\n\ttop: \"res5b_branch2b\"\n\tbottom: \"res5b_branch2b\"\n\tname: \"res5b_branch2b_relu\"\n\ttype: \"ReLU\"\n}\n\nlayer {\n\tbottom: \"res5b_branch2b\"\n\ttop: \"res5b_branch2c\"\n\tname: \"res5b_branch2c\"\n\ttype: \"Convolution\"\n\tconvolution_param {\n\t\tnum_output: 2048\n\t\tkernel_size: 1\n\t\tpad: 0\n\t\tstride: 1\n\t\tbias_term: false\n\t}\n}\n\nlayer {\n\tbottom: \"res5b_branch2c\"\n\ttop: \"res5b_branch2c\"\n\tname: \"bn5b_branch2c\"\n\ttype: \"BatchNorm\"\n\tbatch_norm_param {\n\t\tuse_global_stats: true\n\t}\n}\n\nlayer {\n\tbottom: \"res5b_branch2c\"\n\ttop: \"res5b_branch2c\"\n\tname: \"scale5b_branch2c\"\n\ttype: \"Scale\"\n\tscale_param {\n\t\tbias_term: true\n\t}\n}\n\nlayer {\n\tbottom: \"res5a\"\n\tbottom: \"res5b_branch2c\"\n\ttop: \"res5b\"\n\tname: \"res5b\"\n\ttype: \"Eltwise\"\n}\n\nlayer {\n\tbottom: \"res5b\"\n\ttop: \"res5b\"\n\tname: \"res5b_relu\"\n\ttype: \"ReLU\"\n}\n\nlayer {\n\tbottom: \"res5b\"\n\ttop: \"res5c_branch2a\"\n\tname: \"res5c_branch2a\"\n\ttype: \"Convolution\"\n\tconvolution_param {\n\t\tnum_output: 512\n\t\tkernel_size: 1\n\t\tpad: 0\n\t\tstride: 1\n\t\tbias_term: false\n\t}\n}\n\nlayer {\n\tbottom: \"res5c_branch2a\"\n\ttop: \"res5c_branch2a\"\n\tname: \"bn5c_branch2a\"\n\ttype: \"BatchNorm\"\n\tbatch_norm_param {\n\t\tuse_global_stats: true\n\t}\n}\n\nlayer {\n\tbottom: \"res5c_branch2a\"\n\ttop: \"res5c_branch2a\"\n\tname: \"scale5c_branch2a\"\n\ttype: \"Scale\"\n\tscale_param {\n\t\tbias_term: true\n\t}\n}\n\nlayer {\n\ttop: \"res5c_branch2a\"\n\tbottom: \"res5c_branch2a\"\n\tname: \"res5c_branch2a_relu\"\n\ttype: \"ReLU\"\n}\n\nlayer {\n\tbottom: \"res5c_branch2a\"\n\ttop: \"res5c_branch2b\"\n\tname: \"res5c_branch2b\"\n\ttype: \"Convolution\"\n\tconvolution_param {\n\t\tnum_output: 512\n\t\tkernel_size: 3\n\t\tpad: 1\n\t\tstride: 1\n\t\tbias_term: false\n\t}\n}\n\nlayer {\n\tbottom: \"res5c_branch2b\"\n\ttop: \"res5c_branch2b\"\n\tname: \"bn5c_branch2b\"\n\ttype: \"BatchNorm\"\n\tbatch_norm_param {\n\t\tuse_global_stats: true\n\t}\n}\n\nlayer {\n\tbottom: \"res5c_branch2b\"\n\ttop: \"res5c_branch2b\"\n\tname: \"scale5c_branch2b\"\n\ttype: \"Scale\"\n\tscale_param {\n\t\tbias_term: true\n\t}\n}\n\nlayer {\n\ttop: \"res5c_branch2b\"\n\tbottom: \"res5c_branch2b\"\n\tname: \"res5c_branch2b_relu\"\n\ttype: \"ReLU\"\n}\n\nlayer {\n\tbottom: \"res5c_branch2b\"\n\ttop: \"res5c_branch2c\"\n\tname: \"res5c_branch2c\"\n\ttype: \"Convolution\"\n\tconvolution_param {\n\t\tnum_output: 2048\n\t\tkernel_size: 1\n\t\tpad: 0\n\t\tstride: 1\n\t\tbias_term: false\n\t}\n}\n\nlayer {\n\tbottom: \"res5c_branch2c\"\n\ttop: \"res5c_branch2c\"\n\tname: \"bn5c_branch2c\"\n\ttype: \"BatchNorm\"\n\tbatch_norm_param {\n\t\tuse_global_stats: true\n\t}\n}\n\nlayer {\n\tbottom: \"res5c_branch2c\"\n\ttop: \"res5c_branch2c\"\n\tname: \"scale5c_branch2c\"\n\ttype: \"Scale\"\n\tscale_param {\n\t\tbias_term: true\n\t}\n}\n\nlayer {\n\tbottom: \"res5b\"\n\tbottom: \"res5c_branch2c\"\n\ttop: \"res5c\"\n\tname: \"res5c\"\n\ttype: \"Eltwise\"\n}\n\nlayer {\n\tbottom: \"res5c\"\n\ttop: \"res5c\"\n\tname: \"res5c_relu\"\n\ttype: \"ReLU\"\n}\n\nlayer {\n\tbottom: \"res5c\"\n\ttop: \"pool5\"\n\tname: \"pool5\"\n\ttype: \"Pooling\"\n\tpooling_param {\n\t\tkernel_size: 7\n\t\tstride: 1\n\t\tpool: AVE\n\t}\n}\n\nlayer {\n\tbottom: \"pool5\"\n\ttop: \"fc1000\"\n\tname: \"fc1000\"\n\ttype: \"InnerProduct\"\n\tinner_product_param {\n\t\tnum_output: 1000\n\t}\n}\n\nlayer {\n\tbottom: \"fc1000\"\n\ttop: \"prob\"\n\tname: \"prob\"\n\ttype: \"Softmax\"\n}\n\n"
  },
  {
    "path": "presets/resnet-50.prototxt",
    "content": "name: \"ResNet-50\"\ninput: \"data\"\ninput_dim: 1\ninput_dim: 3\ninput_dim: 224\ninput_dim: 224\n\nlayer {\n\tbottom: \"data\"\n\ttop: \"conv1\"\n\tname: \"conv1\"\n\ttype: \"Convolution\"\n\tconvolution_param {\n\t\tnum_output: 64\n\t\tkernel_size: 7\n\t\tpad: 3\n\t\tstride: 2\n\t}\n}\n\nlayer {\n\tbottom: \"conv1\"\n\ttop: \"conv1\"\n\tname: \"bn_conv1\"\n\ttype: \"BatchNorm\"\n\tbatch_norm_param {\n\t\tuse_global_stats: true\n\t}\n}\n\nlayer {\n\tbottom: \"conv1\"\n\ttop: \"conv1\"\n\tname: \"scale_conv1\"\n\ttype: \"Scale\"\n\tscale_param {\n\t\tbias_term: true\n\t}\n}\n\nlayer {\n\tbottom: \"conv1\"\n\ttop: \"conv1\"\n\tname: \"conv1_relu\"\n\ttype: \"ReLU\"\n}\n\nlayer {\n\tbottom: \"conv1\"\n\ttop: \"pool1\"\n\tname: \"pool1\"\n\ttype: \"Pooling\"\n\tpooling_param {\n\t\tkernel_size: 3\n\t\tstride: 2\n\t\tpool: MAX\n\t}\n}\n\nlayer {\n\tbottom: \"pool1\"\n\ttop: \"res2a_branch1\"\n\tname: \"res2a_branch1\"\n\ttype: \"Convolution\"\n\tconvolution_param {\n\t\tnum_output: 256\n\t\tkernel_size: 1\n\t\tpad: 0\n\t\tstride: 1\n\t\tbias_term: false\n\t}\n}\n\nlayer {\n\tbottom: \"res2a_branch1\"\n\ttop: \"res2a_branch1\"\n\tname: \"bn2a_branch1\"\n\ttype: \"BatchNorm\"\n\tbatch_norm_param {\n\t\tuse_global_stats: true\n\t}\n}\n\nlayer {\n\tbottom: \"res2a_branch1\"\n\ttop: \"res2a_branch1\"\n\tname: \"scale2a_branch1\"\n\ttype: \"Scale\"\n\tscale_param {\n\t\tbias_term: true\n\t}\n}\n\nlayer {\n\tbottom: \"pool1\"\n\ttop: \"res2a_branch2a\"\n\tname: \"res2a_branch2a\"\n\ttype: \"Convolution\"\n\tconvolution_param {\n\t\tnum_output: 64\n\t\tkernel_size: 1\n\t\tpad: 0\n\t\tstride: 1\n\t\tbias_term: false\n\t}\n}\n\nlayer {\n\tbottom: \"res2a_branch2a\"\n\ttop: \"res2a_branch2a\"\n\tname: \"bn2a_branch2a\"\n\ttype: \"BatchNorm\"\n\tbatch_norm_param {\n\t\tuse_global_stats: true\n\t}\n}\n\nlayer {\n\tbottom: \"res2a_branch2a\"\n\ttop: \"res2a_branch2a\"\n\tname: \"scale2a_branch2a\"\n\ttype: \"Scale\"\n\tscale_param {\n\t\tbias_term: true\n\t}\n}\n\nlayer {\n\tbottom: \"res2a_branch2a\"\n\ttop: \"res2a_branch2a\"\n\tname: \"res2a_branch2a_relu\"\n\ttype: \"ReLU\"\n}\n\nlayer {\n\tbottom: \"res2a_branch2a\"\n\ttop: \"res2a_branch2b\"\n\tname: \"res2a_branch2b\"\n\ttype: \"Convolution\"\n\tconvolution_param {\n\t\tnum_output: 64\n\t\tkernel_size: 3\n\t\tpad: 1\n\t\tstride: 1\n\t\tbias_term: false\n\t}\n}\n\nlayer {\n\tbottom: \"res2a_branch2b\"\n\ttop: \"res2a_branch2b\"\n\tname: \"bn2a_branch2b\"\n\ttype: \"BatchNorm\"\n\tbatch_norm_param {\n\t\tuse_global_stats: true\n\t}\n}\n\nlayer {\n\tbottom: \"res2a_branch2b\"\n\ttop: \"res2a_branch2b\"\n\tname: \"scale2a_branch2b\"\n\ttype: \"Scale\"\n\tscale_param {\n\t\tbias_term: true\n\t}\n}\n\nlayer {\n\tbottom: \"res2a_branch2b\"\n\ttop: \"res2a_branch2b\"\n\tname: \"res2a_branch2b_relu\"\n\ttype: \"ReLU\"\n}\n\nlayer {\n\tbottom: \"res2a_branch2b\"\n\ttop: \"res2a_branch2c\"\n\tname: \"res2a_branch2c\"\n\ttype: \"Convolution\"\n\tconvolution_param {\n\t\tnum_output: 256\n\t\tkernel_size: 1\n\t\tpad: 0\n\t\tstride: 1\n\t\tbias_term: false\n\t}\n}\n\nlayer {\n\tbottom: \"res2a_branch2c\"\n\ttop: \"res2a_branch2c\"\n\tname: \"bn2a_branch2c\"\n\ttype: \"BatchNorm\"\n\tbatch_norm_param {\n\t\tuse_global_stats: true\n\t}\n}\n\nlayer {\n\tbottom: \"res2a_branch2c\"\n\ttop: \"res2a_branch2c\"\n\tname: \"scale2a_branch2c\"\n\ttype: \"Scale\"\n\tscale_param {\n\t\tbias_term: true\n\t}\n}\n\nlayer {\n\tbottom: \"res2a_branch1\"\n\tbottom: \"res2a_branch2c\"\n\ttop: \"res2a\"\n\tname: \"res2a\"\n\ttype: \"Eltwise\"\n}\n\nlayer {\n\tbottom: \"res2a\"\n\ttop: \"res2a\"\n\tname: \"res2a_relu\"\n\ttype: \"ReLU\"\n}\n\nlayer {\n\tbottom: \"res2a\"\n\ttop: \"res2b_branch2a\"\n\tname: \"res2b_branch2a\"\n\ttype: \"Convolution\"\n\tconvolution_param {\n\t\tnum_output: 64\n\t\tkernel_size: 1\n\t\tpad: 0\n\t\tstride: 1\n\t\tbias_term: false\n\t}\n}\n\nlayer {\n\tbottom: \"res2b_branch2a\"\n\ttop: \"res2b_branch2a\"\n\tname: \"bn2b_branch2a\"\n\ttype: \"BatchNorm\"\n\tbatch_norm_param {\n\t\tuse_global_stats: true\n\t}\n}\n\nlayer {\n\tbottom: \"res2b_branch2a\"\n\ttop: \"res2b_branch2a\"\n\tname: \"scale2b_branch2a\"\n\ttype: \"Scale\"\n\tscale_param {\n\t\tbias_term: true\n\t}\n}\n\nlayer {\n\tbottom: \"res2b_branch2a\"\n\ttop: \"res2b_branch2a\"\n\tname: \"res2b_branch2a_relu\"\n\ttype: \"ReLU\"\n}\n\nlayer {\n\tbottom: \"res2b_branch2a\"\n\ttop: \"res2b_branch2b\"\n\tname: \"res2b_branch2b\"\n\ttype: \"Convolution\"\n\tconvolution_param {\n\t\tnum_output: 64\n\t\tkernel_size: 3\n\t\tpad: 1\n\t\tstride: 1\n\t\tbias_term: false\n\t}\n}\n\nlayer {\n\tbottom: \"res2b_branch2b\"\n\ttop: \"res2b_branch2b\"\n\tname: \"bn2b_branch2b\"\n\ttype: \"BatchNorm\"\n\tbatch_norm_param {\n\t\tuse_global_stats: true\n\t}\n}\n\nlayer {\n\tbottom: \"res2b_branch2b\"\n\ttop: \"res2b_branch2b\"\n\tname: \"scale2b_branch2b\"\n\ttype: \"Scale\"\n\tscale_param {\n\t\tbias_term: true\n\t}\n}\n\nlayer {\n\tbottom: \"res2b_branch2b\"\n\ttop: \"res2b_branch2b\"\n\tname: \"res2b_branch2b_relu\"\n\ttype: \"ReLU\"\n}\n\nlayer {\n\tbottom: \"res2b_branch2b\"\n\ttop: \"res2b_branch2c\"\n\tname: \"res2b_branch2c\"\n\ttype: \"Convolution\"\n\tconvolution_param {\n\t\tnum_output: 256\n\t\tkernel_size: 1\n\t\tpad: 0\n\t\tstride: 1\n\t\tbias_term: false\n\t}\n}\n\nlayer {\n\tbottom: \"res2b_branch2c\"\n\ttop: \"res2b_branch2c\"\n\tname: \"bn2b_branch2c\"\n\ttype: \"BatchNorm\"\n\tbatch_norm_param {\n\t\tuse_global_stats: true\n\t}\n}\n\nlayer {\n\tbottom: \"res2b_branch2c\"\n\ttop: \"res2b_branch2c\"\n\tname: \"scale2b_branch2c\"\n\ttype: \"Scale\"\n\tscale_param {\n\t\tbias_term: true\n\t}\n}\n\nlayer {\n\tbottom: \"res2a\"\n\tbottom: \"res2b_branch2c\"\n\ttop: \"res2b\"\n\tname: \"res2b\"\n\ttype: \"Eltwise\"\n}\n\nlayer {\n\tbottom: \"res2b\"\n\ttop: \"res2b\"\n\tname: \"res2b_relu\"\n\ttype: \"ReLU\"\n}\n\nlayer {\n\tbottom: \"res2b\"\n\ttop: \"res2c_branch2a\"\n\tname: \"res2c_branch2a\"\n\ttype: \"Convolution\"\n\tconvolution_param {\n\t\tnum_output: 64\n\t\tkernel_size: 1\n\t\tpad: 0\n\t\tstride: 1\n\t\tbias_term: false\n\t}\n}\n\nlayer {\n\tbottom: \"res2c_branch2a\"\n\ttop: \"res2c_branch2a\"\n\tname: \"bn2c_branch2a\"\n\ttype: \"BatchNorm\"\n\tbatch_norm_param {\n\t\tuse_global_stats: true\n\t}\n}\n\nlayer {\n\tbottom: \"res2c_branch2a\"\n\ttop: \"res2c_branch2a\"\n\tname: \"scale2c_branch2a\"\n\ttype: \"Scale\"\n\tscale_param {\n\t\tbias_term: true\n\t}\n}\n\nlayer {\n\tbottom: \"res2c_branch2a\"\n\ttop: \"res2c_branch2a\"\n\tname: \"res2c_branch2a_relu\"\n\ttype: \"ReLU\"\n}\n\nlayer {\n\tbottom: \"res2c_branch2a\"\n\ttop: \"res2c_branch2b\"\n\tname: \"res2c_branch2b\"\n\ttype: \"Convolution\"\n\tconvolution_param {\n\t\tnum_output: 64\n\t\tkernel_size: 3\n\t\tpad: 1\n\t\tstride: 1\n\t\tbias_term: false\n\t}\n}\n\nlayer {\n\tbottom: \"res2c_branch2b\"\n\ttop: \"res2c_branch2b\"\n\tname: \"bn2c_branch2b\"\n\ttype: \"BatchNorm\"\n\tbatch_norm_param {\n\t\tuse_global_stats: true\n\t}\n}\n\nlayer {\n\tbottom: \"res2c_branch2b\"\n\ttop: \"res2c_branch2b\"\n\tname: \"scale2c_branch2b\"\n\ttype: \"Scale\"\n\tscale_param {\n\t\tbias_term: true\n\t}\n}\n\nlayer {\n\tbottom: \"res2c_branch2b\"\n\ttop: \"res2c_branch2b\"\n\tname: \"res2c_branch2b_relu\"\n\ttype: \"ReLU\"\n}\n\nlayer {\n\tbottom: \"res2c_branch2b\"\n\ttop: \"res2c_branch2c\"\n\tname: \"res2c_branch2c\"\n\ttype: \"Convolution\"\n\tconvolution_param {\n\t\tnum_output: 256\n\t\tkernel_size: 1\n\t\tpad: 0\n\t\tstride: 1\n\t\tbias_term: false\n\t}\n}\n\nlayer {\n\tbottom: \"res2c_branch2c\"\n\ttop: \"res2c_branch2c\"\n\tname: \"bn2c_branch2c\"\n\ttype: \"BatchNorm\"\n\tbatch_norm_param {\n\t\tuse_global_stats: true\n\t}\n}\n\nlayer {\n\tbottom: \"res2c_branch2c\"\n\ttop: \"res2c_branch2c\"\n\tname: \"scale2c_branch2c\"\n\ttype: \"Scale\"\n\tscale_param {\n\t\tbias_term: true\n\t}\n}\n\nlayer {\n\tbottom: \"res2b\"\n\tbottom: \"res2c_branch2c\"\n\ttop: \"res2c\"\n\tname: \"res2c\"\n\ttype: \"Eltwise\"\n}\n\nlayer {\n\tbottom: \"res2c\"\n\ttop: \"res2c\"\n\tname: \"res2c_relu\"\n\ttype: \"ReLU\"\n}\n\nlayer {\n\tbottom: \"res2c\"\n\ttop: \"res3a_branch1\"\n\tname: \"res3a_branch1\"\n\ttype: \"Convolution\"\n\tconvolution_param {\n\t\tnum_output: 512\n\t\tkernel_size: 1\n\t\tpad: 0\n\t\tstride: 2\n\t\tbias_term: false\n\t}\n}\n\nlayer {\n\tbottom: \"res3a_branch1\"\n\ttop: \"res3a_branch1\"\n\tname: \"bn3a_branch1\"\n\ttype: \"BatchNorm\"\n\tbatch_norm_param {\n\t\tuse_global_stats: true\n\t}\n}\n\nlayer {\n\tbottom: \"res3a_branch1\"\n\ttop: \"res3a_branch1\"\n\tname: \"scale3a_branch1\"\n\ttype: \"Scale\"\n\tscale_param {\n\t\tbias_term: true\n\t}\n}\n\nlayer {\n\tbottom: \"res2c\"\n\ttop: \"res3a_branch2a\"\n\tname: \"res3a_branch2a\"\n\ttype: \"Convolution\"\n\tconvolution_param {\n\t\tnum_output: 128\n\t\tkernel_size: 1\n\t\tpad: 0\n\t\tstride: 2\n\t\tbias_term: false\n\t}\n}\n\nlayer {\n\tbottom: \"res3a_branch2a\"\n\ttop: \"res3a_branch2a\"\n\tname: \"bn3a_branch2a\"\n\ttype: \"BatchNorm\"\n\tbatch_norm_param {\n\t\tuse_global_stats: true\n\t}\n}\n\nlayer {\n\tbottom: \"res3a_branch2a\"\n\ttop: \"res3a_branch2a\"\n\tname: \"scale3a_branch2a\"\n\ttype: \"Scale\"\n\tscale_param {\n\t\tbias_term: true\n\t}\n}\n\nlayer {\n\tbottom: \"res3a_branch2a\"\n\ttop: \"res3a_branch2a\"\n\tname: \"res3a_branch2a_relu\"\n\ttype: \"ReLU\"\n}\n\nlayer {\n\tbottom: \"res3a_branch2a\"\n\ttop: \"res3a_branch2b\"\n\tname: \"res3a_branch2b\"\n\ttype: \"Convolution\"\n\tconvolution_param {\n\t\tnum_output: 128\n\t\tkernel_size: 3\n\t\tpad: 1\n\t\tstride: 1\n\t\tbias_term: false\n\t}\n}\n\nlayer {\n\tbottom: \"res3a_branch2b\"\n\ttop: \"res3a_branch2b\"\n\tname: \"bn3a_branch2b\"\n\ttype: \"BatchNorm\"\n\tbatch_norm_param {\n\t\tuse_global_stats: true\n\t}\n}\n\nlayer {\n\tbottom: \"res3a_branch2b\"\n\ttop: \"res3a_branch2b\"\n\tname: \"scale3a_branch2b\"\n\ttype: \"Scale\"\n\tscale_param {\n\t\tbias_term: true\n\t}\n}\n\nlayer {\n\tbottom: \"res3a_branch2b\"\n\ttop: \"res3a_branch2b\"\n\tname: \"res3a_branch2b_relu\"\n\ttype: \"ReLU\"\n}\n\nlayer {\n\tbottom: \"res3a_branch2b\"\n\ttop: \"res3a_branch2c\"\n\tname: \"res3a_branch2c\"\n\ttype: \"Convolution\"\n\tconvolution_param {\n\t\tnum_output: 512\n\t\tkernel_size: 1\n\t\tpad: 0\n\t\tstride: 1\n\t\tbias_term: false\n\t}\n}\n\nlayer {\n\tbottom: \"res3a_branch2c\"\n\ttop: \"res3a_branch2c\"\n\tname: \"bn3a_branch2c\"\n\ttype: \"BatchNorm\"\n\tbatch_norm_param {\n\t\tuse_global_stats: true\n\t}\n}\n\nlayer {\n\tbottom: \"res3a_branch2c\"\n\ttop: \"res3a_branch2c\"\n\tname: \"scale3a_branch2c\"\n\ttype: \"Scale\"\n\tscale_param {\n\t\tbias_term: true\n\t}\n}\n\nlayer {\n\tbottom: \"res3a_branch1\"\n\tbottom: \"res3a_branch2c\"\n\ttop: \"res3a\"\n\tname: \"res3a\"\n\ttype: \"Eltwise\"\n}\n\nlayer {\n\tbottom: \"res3a\"\n\ttop: \"res3a\"\n\tname: \"res3a_relu\"\n\ttype: \"ReLU\"\n}\n\nlayer {\n\tbottom: \"res3a\"\n\ttop: \"res3b_branch2a\"\n\tname: \"res3b_branch2a\"\n\ttype: \"Convolution\"\n\tconvolution_param {\n\t\tnum_output: 128\n\t\tkernel_size: 1\n\t\tpad: 0\n\t\tstride: 1\n\t\tbias_term: false\n\t}\n}\n\nlayer {\n\tbottom: \"res3b_branch2a\"\n\ttop: \"res3b_branch2a\"\n\tname: \"bn3b_branch2a\"\n\ttype: \"BatchNorm\"\n\tbatch_norm_param {\n\t\tuse_global_stats: true\n\t}\n}\n\nlayer {\n\tbottom: \"res3b_branch2a\"\n\ttop: \"res3b_branch2a\"\n\tname: \"scale3b_branch2a\"\n\ttype: \"Scale\"\n\tscale_param {\n\t\tbias_term: true\n\t}\n}\n\nlayer {\n\tbottom: \"res3b_branch2a\"\n\ttop: \"res3b_branch2a\"\n\tname: \"res3b_branch2a_relu\"\n\ttype: \"ReLU\"\n}\n\nlayer {\n\tbottom: \"res3b_branch2a\"\n\ttop: \"res3b_branch2b\"\n\tname: \"res3b_branch2b\"\n\ttype: \"Convolution\"\n\tconvolution_param {\n\t\tnum_output: 128\n\t\tkernel_size: 3\n\t\tpad: 1\n\t\tstride: 1\n\t\tbias_term: false\n\t}\n}\n\nlayer {\n\tbottom: \"res3b_branch2b\"\n\ttop: \"res3b_branch2b\"\n\tname: \"bn3b_branch2b\"\n\ttype: \"BatchNorm\"\n\tbatch_norm_param {\n\t\tuse_global_stats: true\n\t}\n}\n\nlayer {\n\tbottom: \"res3b_branch2b\"\n\ttop: \"res3b_branch2b\"\n\tname: \"scale3b_branch2b\"\n\ttype: \"Scale\"\n\tscale_param {\n\t\tbias_term: true\n\t}\n}\n\nlayer {\n\tbottom: \"res3b_branch2b\"\n\ttop: \"res3b_branch2b\"\n\tname: \"res3b_branch2b_relu\"\n\ttype: \"ReLU\"\n}\n\nlayer {\n\tbottom: \"res3b_branch2b\"\n\ttop: \"res3b_branch2c\"\n\tname: \"res3b_branch2c\"\n\ttype: \"Convolution\"\n\tconvolution_param {\n\t\tnum_output: 512\n\t\tkernel_size: 1\n\t\tpad: 0\n\t\tstride: 1\n\t\tbias_term: false\n\t}\n}\n\nlayer {\n\tbottom: \"res3b_branch2c\"\n\ttop: \"res3b_branch2c\"\n\tname: \"bn3b_branch2c\"\n\ttype: \"BatchNorm\"\n\tbatch_norm_param {\n\t\tuse_global_stats: true\n\t}\n}\n\nlayer {\n\tbottom: \"res3b_branch2c\"\n\ttop: \"res3b_branch2c\"\n\tname: \"scale3b_branch2c\"\n\ttype: \"Scale\"\n\tscale_param {\n\t\tbias_term: true\n\t}\n}\n\nlayer {\n\tbottom: \"res3a\"\n\tbottom: \"res3b_branch2c\"\n\ttop: \"res3b\"\n\tname: \"res3b\"\n\ttype: \"Eltwise\"\n}\n\nlayer {\n\tbottom: \"res3b\"\n\ttop: \"res3b\"\n\tname: \"res3b_relu\"\n\ttype: \"ReLU\"\n}\n\nlayer {\n\tbottom: \"res3b\"\n\ttop: \"res3c_branch2a\"\n\tname: \"res3c_branch2a\"\n\ttype: \"Convolution\"\n\tconvolution_param {\n\t\tnum_output: 128\n\t\tkernel_size: 1\n\t\tpad: 0\n\t\tstride: 1\n\t\tbias_term: false\n\t}\n}\n\nlayer {\n\tbottom: \"res3c_branch2a\"\n\ttop: \"res3c_branch2a\"\n\tname: \"bn3c_branch2a\"\n\ttype: \"BatchNorm\"\n\tbatch_norm_param {\n\t\tuse_global_stats: true\n\t}\n}\n\nlayer {\n\tbottom: \"res3c_branch2a\"\n\ttop: \"res3c_branch2a\"\n\tname: \"scale3c_branch2a\"\n\ttype: \"Scale\"\n\tscale_param {\n\t\tbias_term: true\n\t}\n}\n\nlayer {\n\tbottom: \"res3c_branch2a\"\n\ttop: \"res3c_branch2a\"\n\tname: \"res3c_branch2a_relu\"\n\ttype: \"ReLU\"\n}\n\nlayer {\n\tbottom: \"res3c_branch2a\"\n\ttop: \"res3c_branch2b\"\n\tname: \"res3c_branch2b\"\n\ttype: \"Convolution\"\n\tconvolution_param {\n\t\tnum_output: 128\n\t\tkernel_size: 3\n\t\tpad: 1\n\t\tstride: 1\n\t\tbias_term: false\n\t}\n}\n\nlayer {\n\tbottom: \"res3c_branch2b\"\n\ttop: \"res3c_branch2b\"\n\tname: \"bn3c_branch2b\"\n\ttype: \"BatchNorm\"\n\tbatch_norm_param {\n\t\tuse_global_stats: true\n\t}\n}\n\nlayer {\n\tbottom: \"res3c_branch2b\"\n\ttop: \"res3c_branch2b\"\n\tname: \"scale3c_branch2b\"\n\ttype: \"Scale\"\n\tscale_param {\n\t\tbias_term: true\n\t}\n}\n\nlayer {\n\tbottom: \"res3c_branch2b\"\n\ttop: \"res3c_branch2b\"\n\tname: \"res3c_branch2b_relu\"\n\ttype: \"ReLU\"\n}\n\nlayer {\n\tbottom: \"res3c_branch2b\"\n\ttop: \"res3c_branch2c\"\n\tname: \"res3c_branch2c\"\n\ttype: \"Convolution\"\n\tconvolution_param {\n\t\tnum_output: 512\n\t\tkernel_size: 1\n\t\tpad: 0\n\t\tstride: 1\n\t\tbias_term: false\n\t}\n}\n\nlayer {\n\tbottom: \"res3c_branch2c\"\n\ttop: \"res3c_branch2c\"\n\tname: \"bn3c_branch2c\"\n\ttype: \"BatchNorm\"\n\tbatch_norm_param {\n\t\tuse_global_stats: true\n\t}\n}\n\nlayer {\n\tbottom: \"res3c_branch2c\"\n\ttop: \"res3c_branch2c\"\n\tname: \"scale3c_branch2c\"\n\ttype: \"Scale\"\n\tscale_param {\n\t\tbias_term: true\n\t}\n}\n\nlayer {\n\tbottom: \"res3b\"\n\tbottom: \"res3c_branch2c\"\n\ttop: \"res3c\"\n\tname: \"res3c\"\n\ttype: \"Eltwise\"\n}\n\nlayer {\n\tbottom: \"res3c\"\n\ttop: \"res3c\"\n\tname: \"res3c_relu\"\n\ttype: \"ReLU\"\n}\n\nlayer {\n\tbottom: \"res3c\"\n\ttop: \"res3d_branch2a\"\n\tname: \"res3d_branch2a\"\n\ttype: \"Convolution\"\n\tconvolution_param {\n\t\tnum_output: 128\n\t\tkernel_size: 1\n\t\tpad: 0\n\t\tstride: 1\n\t\tbias_term: false\n\t}\n}\n\nlayer {\n\tbottom: \"res3d_branch2a\"\n\ttop: \"res3d_branch2a\"\n\tname: \"bn3d_branch2a\"\n\ttype: \"BatchNorm\"\n\tbatch_norm_param {\n\t\tuse_global_stats: true\n\t}\n}\n\nlayer {\n\tbottom: \"res3d_branch2a\"\n\ttop: \"res3d_branch2a\"\n\tname: \"scale3d_branch2a\"\n\ttype: \"Scale\"\n\tscale_param {\n\t\tbias_term: true\n\t}\n}\n\nlayer {\n\tbottom: \"res3d_branch2a\"\n\ttop: \"res3d_branch2a\"\n\tname: \"res3d_branch2a_relu\"\n\ttype: \"ReLU\"\n}\n\nlayer {\n\tbottom: \"res3d_branch2a\"\n\ttop: \"res3d_branch2b\"\n\tname: \"res3d_branch2b\"\n\ttype: \"Convolution\"\n\tconvolution_param {\n\t\tnum_output: 128\n\t\tkernel_size: 3\n\t\tpad: 1\n\t\tstride: 1\n\t\tbias_term: false\n\t}\n}\n\nlayer {\n\tbottom: \"res3d_branch2b\"\n\ttop: \"res3d_branch2b\"\n\tname: \"bn3d_branch2b\"\n\ttype: \"BatchNorm\"\n\tbatch_norm_param {\n\t\tuse_global_stats: true\n\t}\n}\n\nlayer {\n\tbottom: \"res3d_branch2b\"\n\ttop: \"res3d_branch2b\"\n\tname: \"scale3d_branch2b\"\n\ttype: \"Scale\"\n\tscale_param {\n\t\tbias_term: true\n\t}\n}\n\nlayer {\n\tbottom: \"res3d_branch2b\"\n\ttop: \"res3d_branch2b\"\n\tname: \"res3d_branch2b_relu\"\n\ttype: \"ReLU\"\n}\n\nlayer {\n\tbottom: \"res3d_branch2b\"\n\ttop: \"res3d_branch2c\"\n\tname: \"res3d_branch2c\"\n\ttype: \"Convolution\"\n\tconvolution_param {\n\t\tnum_output: 512\n\t\tkernel_size: 1\n\t\tpad: 0\n\t\tstride: 1\n\t\tbias_term: false\n\t}\n}\n\nlayer {\n\tbottom: \"res3d_branch2c\"\n\ttop: \"res3d_branch2c\"\n\tname: \"bn3d_branch2c\"\n\ttype: \"BatchNorm\"\n\tbatch_norm_param {\n\t\tuse_global_stats: true\n\t}\n}\n\nlayer {\n\tbottom: \"res3d_branch2c\"\n\ttop: \"res3d_branch2c\"\n\tname: \"scale3d_branch2c\"\n\ttype: \"Scale\"\n\tscale_param {\n\t\tbias_term: true\n\t}\n}\n\nlayer {\n\tbottom: \"res3c\"\n\tbottom: \"res3d_branch2c\"\n\ttop: \"res3d\"\n\tname: \"res3d\"\n\ttype: \"Eltwise\"\n}\n\nlayer {\n\tbottom: \"res3d\"\n\ttop: \"res3d\"\n\tname: \"res3d_relu\"\n\ttype: \"ReLU\"\n}\n\nlayer {\n\tbottom: \"res3d\"\n\ttop: \"res4a_branch1\"\n\tname: \"res4a_branch1\"\n\ttype: \"Convolution\"\n\tconvolution_param {\n\t\tnum_output: 1024\n\t\tkernel_size: 1\n\t\tpad: 0\n\t\tstride: 2\n\t\tbias_term: false\n\t}\n}\n\nlayer {\n\tbottom: \"res4a_branch1\"\n\ttop: \"res4a_branch1\"\n\tname: \"bn4a_branch1\"\n\ttype: \"BatchNorm\"\n\tbatch_norm_param {\n\t\tuse_global_stats: true\n\t}\n}\n\nlayer {\n\tbottom: \"res4a_branch1\"\n\ttop: \"res4a_branch1\"\n\tname: \"scale4a_branch1\"\n\ttype: \"Scale\"\n\tscale_param {\n\t\tbias_term: true\n\t}\n}\n\nlayer {\n\tbottom: \"res3d\"\n\ttop: \"res4a_branch2a\"\n\tname: \"res4a_branch2a\"\n\ttype: \"Convolution\"\n\tconvolution_param {\n\t\tnum_output: 256\n\t\tkernel_size: 1\n\t\tpad: 0\n\t\tstride: 2\n\t\tbias_term: false\n\t}\n}\n\nlayer {\n\tbottom: \"res4a_branch2a\"\n\ttop: \"res4a_branch2a\"\n\tname: \"bn4a_branch2a\"\n\ttype: \"BatchNorm\"\n\tbatch_norm_param {\n\t\tuse_global_stats: true\n\t}\n}\n\nlayer {\n\tbottom: \"res4a_branch2a\"\n\ttop: \"res4a_branch2a\"\n\tname: \"scale4a_branch2a\"\n\ttype: \"Scale\"\n\tscale_param {\n\t\tbias_term: true\n\t}\n}\n\nlayer {\n\tbottom: \"res4a_branch2a\"\n\ttop: \"res4a_branch2a\"\n\tname: \"res4a_branch2a_relu\"\n\ttype: \"ReLU\"\n}\n\nlayer {\n\tbottom: \"res4a_branch2a\"\n\ttop: \"res4a_branch2b\"\n\tname: \"res4a_branch2b\"\n\ttype: \"Convolution\"\n\tconvolution_param {\n\t\tnum_output: 256\n\t\tkernel_size: 3\n\t\tpad: 1\n\t\tstride: 1\n\t\tbias_term: false\n\t}\n}\n\nlayer {\n\tbottom: \"res4a_branch2b\"\n\ttop: \"res4a_branch2b\"\n\tname: \"bn4a_branch2b\"\n\ttype: \"BatchNorm\"\n\tbatch_norm_param {\n\t\tuse_global_stats: true\n\t}\n}\n\nlayer {\n\tbottom: \"res4a_branch2b\"\n\ttop: \"res4a_branch2b\"\n\tname: \"scale4a_branch2b\"\n\ttype: \"Scale\"\n\tscale_param {\n\t\tbias_term: true\n\t}\n}\n\nlayer {\n\tbottom: \"res4a_branch2b\"\n\ttop: \"res4a_branch2b\"\n\tname: \"res4a_branch2b_relu\"\n\ttype: \"ReLU\"\n}\n\nlayer {\n\tbottom: \"res4a_branch2b\"\n\ttop: \"res4a_branch2c\"\n\tname: \"res4a_branch2c\"\n\ttype: \"Convolution\"\n\tconvolution_param {\n\t\tnum_output: 1024\n\t\tkernel_size: 1\n\t\tpad: 0\n\t\tstride: 1\n\t\tbias_term: false\n\t}\n}\n\nlayer {\n\tbottom: \"res4a_branch2c\"\n\ttop: \"res4a_branch2c\"\n\tname: \"bn4a_branch2c\"\n\ttype: \"BatchNorm\"\n\tbatch_norm_param {\n\t\tuse_global_stats: true\n\t}\n}\n\nlayer {\n\tbottom: \"res4a_branch2c\"\n\ttop: \"res4a_branch2c\"\n\tname: \"scale4a_branch2c\"\n\ttype: \"Scale\"\n\tscale_param {\n\t\tbias_term: true\n\t}\n}\n\nlayer {\n\tbottom: \"res4a_branch1\"\n\tbottom: \"res4a_branch2c\"\n\ttop: \"res4a\"\n\tname: \"res4a\"\n\ttype: \"Eltwise\"\n}\n\nlayer {\n\tbottom: \"res4a\"\n\ttop: \"res4a\"\n\tname: \"res4a_relu\"\n\ttype: \"ReLU\"\n}\n\nlayer {\n\tbottom: \"res4a\"\n\ttop: \"res4b_branch2a\"\n\tname: \"res4b_branch2a\"\n\ttype: \"Convolution\"\n\tconvolution_param {\n\t\tnum_output: 256\n\t\tkernel_size: 1\n\t\tpad: 0\n\t\tstride: 1\n\t\tbias_term: false\n\t}\n}\n\nlayer {\n\tbottom: \"res4b_branch2a\"\n\ttop: \"res4b_branch2a\"\n\tname: \"bn4b_branch2a\"\n\ttype: \"BatchNorm\"\n\tbatch_norm_param {\n\t\tuse_global_stats: true\n\t}\n}\n\nlayer {\n\tbottom: \"res4b_branch2a\"\n\ttop: \"res4b_branch2a\"\n\tname: \"scale4b_branch2a\"\n\ttype: \"Scale\"\n\tscale_param {\n\t\tbias_term: true\n\t}\n}\n\nlayer {\n\tbottom: \"res4b_branch2a\"\n\ttop: \"res4b_branch2a\"\n\tname: \"res4b_branch2a_relu\"\n\ttype: \"ReLU\"\n}\n\nlayer {\n\tbottom: \"res4b_branch2a\"\n\ttop: \"res4b_branch2b\"\n\tname: \"res4b_branch2b\"\n\ttype: \"Convolution\"\n\tconvolution_param {\n\t\tnum_output: 256\n\t\tkernel_size: 3\n\t\tpad: 1\n\t\tstride: 1\n\t\tbias_term: false\n\t}\n}\n\nlayer {\n\tbottom: \"res4b_branch2b\"\n\ttop: \"res4b_branch2b\"\n\tname: \"bn4b_branch2b\"\n\ttype: \"BatchNorm\"\n\tbatch_norm_param {\n\t\tuse_global_stats: true\n\t}\n}\n\nlayer {\n\tbottom: \"res4b_branch2b\"\n\ttop: \"res4b_branch2b\"\n\tname: \"scale4b_branch2b\"\n\ttype: \"Scale\"\n\tscale_param {\n\t\tbias_term: true\n\t}\n}\n\nlayer {\n\tbottom: \"res4b_branch2b\"\n\ttop: \"res4b_branch2b\"\n\tname: \"res4b_branch2b_relu\"\n\ttype: \"ReLU\"\n}\n\nlayer {\n\tbottom: \"res4b_branch2b\"\n\ttop: \"res4b_branch2c\"\n\tname: \"res4b_branch2c\"\n\ttype: \"Convolution\"\n\tconvolution_param {\n\t\tnum_output: 1024\n\t\tkernel_size: 1\n\t\tpad: 0\n\t\tstride: 1\n\t\tbias_term: false\n\t}\n}\n\nlayer {\n\tbottom: \"res4b_branch2c\"\n\ttop: \"res4b_branch2c\"\n\tname: \"bn4b_branch2c\"\n\ttype: \"BatchNorm\"\n\tbatch_norm_param {\n\t\tuse_global_stats: true\n\t}\n}\n\nlayer {\n\tbottom: \"res4b_branch2c\"\n\ttop: \"res4b_branch2c\"\n\tname: \"scale4b_branch2c\"\n\ttype: \"Scale\"\n\tscale_param {\n\t\tbias_term: true\n\t}\n}\n\nlayer {\n\tbottom: \"res4a\"\n\tbottom: \"res4b_branch2c\"\n\ttop: \"res4b\"\n\tname: \"res4b\"\n\ttype: \"Eltwise\"\n}\n\nlayer {\n\tbottom: \"res4b\"\n\ttop: \"res4b\"\n\tname: \"res4b_relu\"\n\ttype: \"ReLU\"\n}\n\nlayer {\n\tbottom: \"res4b\"\n\ttop: \"res4c_branch2a\"\n\tname: \"res4c_branch2a\"\n\ttype: \"Convolution\"\n\tconvolution_param {\n\t\tnum_output: 256\n\t\tkernel_size: 1\n\t\tpad: 0\n\t\tstride: 1\n\t\tbias_term: false\n\t}\n}\n\nlayer {\n\tbottom: \"res4c_branch2a\"\n\ttop: \"res4c_branch2a\"\n\tname: \"bn4c_branch2a\"\n\ttype: \"BatchNorm\"\n\tbatch_norm_param {\n\t\tuse_global_stats: true\n\t}\n}\n\nlayer {\n\tbottom: \"res4c_branch2a\"\n\ttop: \"res4c_branch2a\"\n\tname: \"scale4c_branch2a\"\n\ttype: \"Scale\"\n\tscale_param {\n\t\tbias_term: true\n\t}\n}\n\nlayer {\n\tbottom: \"res4c_branch2a\"\n\ttop: \"res4c_branch2a\"\n\tname: \"res4c_branch2a_relu\"\n\ttype: \"ReLU\"\n}\n\nlayer {\n\tbottom: \"res4c_branch2a\"\n\ttop: \"res4c_branch2b\"\n\tname: \"res4c_branch2b\"\n\ttype: \"Convolution\"\n\tconvolution_param {\n\t\tnum_output: 256\n\t\tkernel_size: 3\n\t\tpad: 1\n\t\tstride: 1\n\t\tbias_term: false\n\t}\n}\n\nlayer {\n\tbottom: \"res4c_branch2b\"\n\ttop: \"res4c_branch2b\"\n\tname: \"bn4c_branch2b\"\n\ttype: \"BatchNorm\"\n\tbatch_norm_param {\n\t\tuse_global_stats: true\n\t}\n}\n\nlayer {\n\tbottom: \"res4c_branch2b\"\n\ttop: \"res4c_branch2b\"\n\tname: \"scale4c_branch2b\"\n\ttype: \"Scale\"\n\tscale_param {\n\t\tbias_term: true\n\t}\n}\n\nlayer {\n\tbottom: \"res4c_branch2b\"\n\ttop: \"res4c_branch2b\"\n\tname: \"res4c_branch2b_relu\"\n\ttype: \"ReLU\"\n}\n\nlayer {\n\tbottom: \"res4c_branch2b\"\n\ttop: \"res4c_branch2c\"\n\tname: \"res4c_branch2c\"\n\ttype: \"Convolution\"\n\tconvolution_param {\n\t\tnum_output: 1024\n\t\tkernel_size: 1\n\t\tpad: 0\n\t\tstride: 1\n\t\tbias_term: false\n\t}\n}\n\nlayer {\n\tbottom: \"res4c_branch2c\"\n\ttop: \"res4c_branch2c\"\n\tname: \"bn4c_branch2c\"\n\ttype: \"BatchNorm\"\n\tbatch_norm_param {\n\t\tuse_global_stats: true\n\t}\n}\n\nlayer {\n\tbottom: \"res4c_branch2c\"\n\ttop: \"res4c_branch2c\"\n\tname: \"scale4c_branch2c\"\n\ttype: \"Scale\"\n\tscale_param {\n\t\tbias_term: true\n\t}\n}\n\nlayer {\n\tbottom: \"res4b\"\n\tbottom: \"res4c_branch2c\"\n\ttop: \"res4c\"\n\tname: \"res4c\"\n\ttype: \"Eltwise\"\n}\n\nlayer {\n\tbottom: \"res4c\"\n\ttop: \"res4c\"\n\tname: \"res4c_relu\"\n\ttype: \"ReLU\"\n}\n\nlayer {\n\tbottom: \"res4c\"\n\ttop: \"res4d_branch2a\"\n\tname: \"res4d_branch2a\"\n\ttype: \"Convolution\"\n\tconvolution_param {\n\t\tnum_output: 256\n\t\tkernel_size: 1\n\t\tpad: 0\n\t\tstride: 1\n\t\tbias_term: false\n\t}\n}\n\nlayer {\n\tbottom: \"res4d_branch2a\"\n\ttop: \"res4d_branch2a\"\n\tname: \"bn4d_branch2a\"\n\ttype: \"BatchNorm\"\n\tbatch_norm_param {\n\t\tuse_global_stats: true\n\t}\n}\n\nlayer {\n\tbottom: \"res4d_branch2a\"\n\ttop: \"res4d_branch2a\"\n\tname: \"scale4d_branch2a\"\n\ttype: \"Scale\"\n\tscale_param {\n\t\tbias_term: true\n\t}\n}\n\nlayer {\n\tbottom: \"res4d_branch2a\"\n\ttop: \"res4d_branch2a\"\n\tname: \"res4d_branch2a_relu\"\n\ttype: \"ReLU\"\n}\n\nlayer {\n\tbottom: \"res4d_branch2a\"\n\ttop: \"res4d_branch2b\"\n\tname: \"res4d_branch2b\"\n\ttype: \"Convolution\"\n\tconvolution_param {\n\t\tnum_output: 256\n\t\tkernel_size: 3\n\t\tpad: 1\n\t\tstride: 1\n\t\tbias_term: false\n\t}\n}\n\nlayer {\n\tbottom: \"res4d_branch2b\"\n\ttop: \"res4d_branch2b\"\n\tname: \"bn4d_branch2b\"\n\ttype: \"BatchNorm\"\n\tbatch_norm_param {\n\t\tuse_global_stats: true\n\t}\n}\n\nlayer {\n\tbottom: \"res4d_branch2b\"\n\ttop: \"res4d_branch2b\"\n\tname: \"scale4d_branch2b\"\n\ttype: \"Scale\"\n\tscale_param {\n\t\tbias_term: true\n\t}\n}\n\nlayer {\n\tbottom: \"res4d_branch2b\"\n\ttop: \"res4d_branch2b\"\n\tname: \"res4d_branch2b_relu\"\n\ttype: \"ReLU\"\n}\n\nlayer {\n\tbottom: \"res4d_branch2b\"\n\ttop: \"res4d_branch2c\"\n\tname: \"res4d_branch2c\"\n\ttype: \"Convolution\"\n\tconvolution_param {\n\t\tnum_output: 1024\n\t\tkernel_size: 1\n\t\tpad: 0\n\t\tstride: 1\n\t\tbias_term: false\n\t}\n}\n\nlayer {\n\tbottom: \"res4d_branch2c\"\n\ttop: \"res4d_branch2c\"\n\tname: \"bn4d_branch2c\"\n\ttype: \"BatchNorm\"\n\tbatch_norm_param {\n\t\tuse_global_stats: true\n\t}\n}\n\nlayer {\n\tbottom: \"res4d_branch2c\"\n\ttop: \"res4d_branch2c\"\n\tname: \"scale4d_branch2c\"\n\ttype: \"Scale\"\n\tscale_param {\n\t\tbias_term: true\n\t}\n}\n\nlayer {\n\tbottom: \"res4c\"\n\tbottom: \"res4d_branch2c\"\n\ttop: \"res4d\"\n\tname: \"res4d\"\n\ttype: \"Eltwise\"\n}\n\nlayer {\n\tbottom: \"res4d\"\n\ttop: \"res4d\"\n\tname: \"res4d_relu\"\n\ttype: \"ReLU\"\n}\n\nlayer {\n\tbottom: \"res4d\"\n\ttop: \"res4e_branch2a\"\n\tname: \"res4e_branch2a\"\n\ttype: \"Convolution\"\n\tconvolution_param {\n\t\tnum_output: 256\n\t\tkernel_size: 1\n\t\tpad: 0\n\t\tstride: 1\n\t\tbias_term: false\n\t}\n}\n\nlayer {\n\tbottom: \"res4e_branch2a\"\n\ttop: \"res4e_branch2a\"\n\tname: \"bn4e_branch2a\"\n\ttype: \"BatchNorm\"\n\tbatch_norm_param {\n\t\tuse_global_stats: true\n\t}\n}\n\nlayer {\n\tbottom: \"res4e_branch2a\"\n\ttop: \"res4e_branch2a\"\n\tname: \"scale4e_branch2a\"\n\ttype: \"Scale\"\n\tscale_param {\n\t\tbias_term: true\n\t}\n}\n\nlayer {\n\tbottom: \"res4e_branch2a\"\n\ttop: \"res4e_branch2a\"\n\tname: \"res4e_branch2a_relu\"\n\ttype: \"ReLU\"\n}\n\nlayer {\n\tbottom: \"res4e_branch2a\"\n\ttop: \"res4e_branch2b\"\n\tname: \"res4e_branch2b\"\n\ttype: \"Convolution\"\n\tconvolution_param {\n\t\tnum_output: 256\n\t\tkernel_size: 3\n\t\tpad: 1\n\t\tstride: 1\n\t\tbias_term: false\n\t}\n}\n\nlayer {\n\tbottom: \"res4e_branch2b\"\n\ttop: \"res4e_branch2b\"\n\tname: \"bn4e_branch2b\"\n\ttype: \"BatchNorm\"\n\tbatch_norm_param {\n\t\tuse_global_stats: true\n\t}\n}\n\nlayer {\n\tbottom: \"res4e_branch2b\"\n\ttop: \"res4e_branch2b\"\n\tname: \"scale4e_branch2b\"\n\ttype: \"Scale\"\n\tscale_param {\n\t\tbias_term: true\n\t}\n}\n\nlayer {\n\tbottom: \"res4e_branch2b\"\n\ttop: \"res4e_branch2b\"\n\tname: \"res4e_branch2b_relu\"\n\ttype: \"ReLU\"\n}\n\nlayer {\n\tbottom: \"res4e_branch2b\"\n\ttop: \"res4e_branch2c\"\n\tname: \"res4e_branch2c\"\n\ttype: \"Convolution\"\n\tconvolution_param {\n\t\tnum_output: 1024\n\t\tkernel_size: 1\n\t\tpad: 0\n\t\tstride: 1\n\t\tbias_term: false\n\t}\n}\n\nlayer {\n\tbottom: \"res4e_branch2c\"\n\ttop: \"res4e_branch2c\"\n\tname: \"bn4e_branch2c\"\n\ttype: \"BatchNorm\"\n\tbatch_norm_param {\n\t\tuse_global_stats: true\n\t}\n}\n\nlayer {\n\tbottom: \"res4e_branch2c\"\n\ttop: \"res4e_branch2c\"\n\tname: \"scale4e_branch2c\"\n\ttype: \"Scale\"\n\tscale_param {\n\t\tbias_term: true\n\t}\n}\n\nlayer {\n\tbottom: \"res4d\"\n\tbottom: \"res4e_branch2c\"\n\ttop: \"res4e\"\n\tname: \"res4e\"\n\ttype: \"Eltwise\"\n}\n\nlayer {\n\tbottom: \"res4e\"\n\ttop: \"res4e\"\n\tname: \"res4e_relu\"\n\ttype: \"ReLU\"\n}\n\nlayer {\n\tbottom: \"res4e\"\n\ttop: \"res4f_branch2a\"\n\tname: \"res4f_branch2a\"\n\ttype: \"Convolution\"\n\tconvolution_param {\n\t\tnum_output: 256\n\t\tkernel_size: 1\n\t\tpad: 0\n\t\tstride: 1\n\t\tbias_term: false\n\t}\n}\n\nlayer {\n\tbottom: \"res4f_branch2a\"\n\ttop: \"res4f_branch2a\"\n\tname: \"bn4f_branch2a\"\n\ttype: \"BatchNorm\"\n\tbatch_norm_param {\n\t\tuse_global_stats: true\n\t}\n}\n\nlayer {\n\tbottom: \"res4f_branch2a\"\n\ttop: \"res4f_branch2a\"\n\tname: \"scale4f_branch2a\"\n\ttype: \"Scale\"\n\tscale_param {\n\t\tbias_term: true\n\t}\n}\n\nlayer {\n\tbottom: \"res4f_branch2a\"\n\ttop: \"res4f_branch2a\"\n\tname: \"res4f_branch2a_relu\"\n\ttype: \"ReLU\"\n}\n\nlayer {\n\tbottom: \"res4f_branch2a\"\n\ttop: \"res4f_branch2b\"\n\tname: \"res4f_branch2b\"\n\ttype: \"Convolution\"\n\tconvolution_param {\n\t\tnum_output: 256\n\t\tkernel_size: 3\n\t\tpad: 1\n\t\tstride: 1\n\t\tbias_term: false\n\t}\n}\n\nlayer {\n\tbottom: \"res4f_branch2b\"\n\ttop: \"res4f_branch2b\"\n\tname: \"bn4f_branch2b\"\n\ttype: \"BatchNorm\"\n\tbatch_norm_param {\n\t\tuse_global_stats: true\n\t}\n}\n\nlayer {\n\tbottom: \"res4f_branch2b\"\n\ttop: \"res4f_branch2b\"\n\tname: \"scale4f_branch2b\"\n\ttype: \"Scale\"\n\tscale_param {\n\t\tbias_term: true\n\t}\n}\n\nlayer {\n\tbottom: \"res4f_branch2b\"\n\ttop: \"res4f_branch2b\"\n\tname: \"res4f_branch2b_relu\"\n\ttype: \"ReLU\"\n}\n\nlayer {\n\tbottom: \"res4f_branch2b\"\n\ttop: \"res4f_branch2c\"\n\tname: \"res4f_branch2c\"\n\ttype: \"Convolution\"\n\tconvolution_param {\n\t\tnum_output: 1024\n\t\tkernel_size: 1\n\t\tpad: 0\n\t\tstride: 1\n\t\tbias_term: false\n\t}\n}\n\nlayer {\n\tbottom: \"res4f_branch2c\"\n\ttop: \"res4f_branch2c\"\n\tname: \"bn4f_branch2c\"\n\ttype: \"BatchNorm\"\n\tbatch_norm_param {\n\t\tuse_global_stats: true\n\t}\n}\n\nlayer {\n\tbottom: \"res4f_branch2c\"\n\ttop: \"res4f_branch2c\"\n\tname: \"scale4f_branch2c\"\n\ttype: \"Scale\"\n\tscale_param {\n\t\tbias_term: true\n\t}\n}\n\nlayer {\n\tbottom: \"res4e\"\n\tbottom: \"res4f_branch2c\"\n\ttop: \"res4f\"\n\tname: \"res4f\"\n\ttype: \"Eltwise\"\n}\n\nlayer {\n\tbottom: \"res4f\"\n\ttop: \"res4f\"\n\tname: \"res4f_relu\"\n\ttype: \"ReLU\"\n}\n\nlayer {\n\tbottom: \"res4f\"\n\ttop: \"res5a_branch1\"\n\tname: \"res5a_branch1\"\n\ttype: \"Convolution\"\n\tconvolution_param {\n\t\tnum_output: 2048\n\t\tkernel_size: 1\n\t\tpad: 0\n\t\tstride: 2\n\t\tbias_term: false\n\t}\n}\n\nlayer {\n\tbottom: \"res5a_branch1\"\n\ttop: \"res5a_branch1\"\n\tname: \"bn5a_branch1\"\n\ttype: \"BatchNorm\"\n\tbatch_norm_param {\n\t\tuse_global_stats: true\n\t}\n}\n\nlayer {\n\tbottom: \"res5a_branch1\"\n\ttop: \"res5a_branch1\"\n\tname: \"scale5a_branch1\"\n\ttype: \"Scale\"\n\tscale_param {\n\t\tbias_term: true\n\t}\n}\n\nlayer {\n\tbottom: \"res4f\"\n\ttop: \"res5a_branch2a\"\n\tname: \"res5a_branch2a\"\n\ttype: \"Convolution\"\n\tconvolution_param {\n\t\tnum_output: 512\n\t\tkernel_size: 1\n\t\tpad: 0\n\t\tstride: 2\n\t\tbias_term: false\n\t}\n}\n\nlayer {\n\tbottom: \"res5a_branch2a\"\n\ttop: \"res5a_branch2a\"\n\tname: \"bn5a_branch2a\"\n\ttype: \"BatchNorm\"\n\tbatch_norm_param {\n\t\tuse_global_stats: true\n\t}\n}\n\nlayer {\n\tbottom: \"res5a_branch2a\"\n\ttop: \"res5a_branch2a\"\n\tname: \"scale5a_branch2a\"\n\ttype: \"Scale\"\n\tscale_param {\n\t\tbias_term: true\n\t}\n}\n\nlayer {\n\tbottom: \"res5a_branch2a\"\n\ttop: \"res5a_branch2a\"\n\tname: \"res5a_branch2a_relu\"\n\ttype: \"ReLU\"\n}\n\nlayer {\n\tbottom: \"res5a_branch2a\"\n\ttop: \"res5a_branch2b\"\n\tname: \"res5a_branch2b\"\n\ttype: \"Convolution\"\n\tconvolution_param {\n\t\tnum_output: 512\n\t\tkernel_size: 3\n\t\tpad: 1\n\t\tstride: 1\n\t\tbias_term: false\n\t}\n}\n\nlayer {\n\tbottom: \"res5a_branch2b\"\n\ttop: \"res5a_branch2b\"\n\tname: \"bn5a_branch2b\"\n\ttype: \"BatchNorm\"\n\tbatch_norm_param {\n\t\tuse_global_stats: true\n\t}\n}\n\nlayer {\n\tbottom: \"res5a_branch2b\"\n\ttop: \"res5a_branch2b\"\n\tname: \"scale5a_branch2b\"\n\ttype: \"Scale\"\n\tscale_param {\n\t\tbias_term: true\n\t}\n}\n\nlayer {\n\tbottom: \"res5a_branch2b\"\n\ttop: \"res5a_branch2b\"\n\tname: \"res5a_branch2b_relu\"\n\ttype: \"ReLU\"\n}\n\nlayer {\n\tbottom: \"res5a_branch2b\"\n\ttop: \"res5a_branch2c\"\n\tname: \"res5a_branch2c\"\n\ttype: \"Convolution\"\n\tconvolution_param {\n\t\tnum_output: 2048\n\t\tkernel_size: 1\n\t\tpad: 0\n\t\tstride: 1\n\t\tbias_term: false\n\t}\n}\n\nlayer {\n\tbottom: \"res5a_branch2c\"\n\ttop: \"res5a_branch2c\"\n\tname: \"bn5a_branch2c\"\n\ttype: \"BatchNorm\"\n\tbatch_norm_param {\n\t\tuse_global_stats: true\n\t}\n}\n\nlayer {\n\tbottom: \"res5a_branch2c\"\n\ttop: \"res5a_branch2c\"\n\tname: \"scale5a_branch2c\"\n\ttype: \"Scale\"\n\tscale_param {\n\t\tbias_term: true\n\t}\n}\n\nlayer {\n\tbottom: \"res5a_branch1\"\n\tbottom: \"res5a_branch2c\"\n\ttop: \"res5a\"\n\tname: \"res5a\"\n\ttype: \"Eltwise\"\n}\n\nlayer {\n\tbottom: \"res5a\"\n\ttop: \"res5a\"\n\tname: \"res5a_relu\"\n\ttype: \"ReLU\"\n}\n\nlayer {\n\tbottom: \"res5a\"\n\ttop: \"res5b_branch2a\"\n\tname: \"res5b_branch2a\"\n\ttype: \"Convolution\"\n\tconvolution_param {\n\t\tnum_output: 512\n\t\tkernel_size: 1\n\t\tpad: 0\n\t\tstride: 1\n\t\tbias_term: false\n\t}\n}\n\nlayer {\n\tbottom: \"res5b_branch2a\"\n\ttop: \"res5b_branch2a\"\n\tname: \"bn5b_branch2a\"\n\ttype: \"BatchNorm\"\n\tbatch_norm_param {\n\t\tuse_global_stats: true\n\t}\n}\n\nlayer {\n\tbottom: \"res5b_branch2a\"\n\ttop: \"res5b_branch2a\"\n\tname: \"scale5b_branch2a\"\n\ttype: \"Scale\"\n\tscale_param {\n\t\tbias_term: true\n\t}\n}\n\nlayer {\n\tbottom: \"res5b_branch2a\"\n\ttop: \"res5b_branch2a\"\n\tname: \"res5b_branch2a_relu\"\n\ttype: \"ReLU\"\n}\n\nlayer {\n\tbottom: \"res5b_branch2a\"\n\ttop: \"res5b_branch2b\"\n\tname: \"res5b_branch2b\"\n\ttype: \"Convolution\"\n\tconvolution_param {\n\t\tnum_output: 512\n\t\tkernel_size: 3\n\t\tpad: 1\n\t\tstride: 1\n\t\tbias_term: false\n\t}\n}\n\nlayer {\n\tbottom: \"res5b_branch2b\"\n\ttop: \"res5b_branch2b\"\n\tname: \"bn5b_branch2b\"\n\ttype: \"BatchNorm\"\n\tbatch_norm_param {\n\t\tuse_global_stats: true\n\t}\n}\n\nlayer {\n\tbottom: \"res5b_branch2b\"\n\ttop: \"res5b_branch2b\"\n\tname: \"scale5b_branch2b\"\n\ttype: \"Scale\"\n\tscale_param {\n\t\tbias_term: true\n\t}\n}\n\nlayer {\n\tbottom: \"res5b_branch2b\"\n\ttop: \"res5b_branch2b\"\n\tname: \"res5b_branch2b_relu\"\n\ttype: \"ReLU\"\n}\n\nlayer {\n\tbottom: \"res5b_branch2b\"\n\ttop: \"res5b_branch2c\"\n\tname: \"res5b_branch2c\"\n\ttype: \"Convolution\"\n\tconvolution_param {\n\t\tnum_output: 2048\n\t\tkernel_size: 1\n\t\tpad: 0\n\t\tstride: 1\n\t\tbias_term: false\n\t}\n}\n\nlayer {\n\tbottom: \"res5b_branch2c\"\n\ttop: \"res5b_branch2c\"\n\tname: \"bn5b_branch2c\"\n\ttype: \"BatchNorm\"\n\tbatch_norm_param {\n\t\tuse_global_stats: true\n\t}\n}\n\nlayer {\n\tbottom: \"res5b_branch2c\"\n\ttop: \"res5b_branch2c\"\n\tname: \"scale5b_branch2c\"\n\ttype: \"Scale\"\n\tscale_param {\n\t\tbias_term: true\n\t}\n}\n\nlayer {\n\tbottom: \"res5a\"\n\tbottom: \"res5b_branch2c\"\n\ttop: \"res5b\"\n\tname: \"res5b\"\n\ttype: \"Eltwise\"\n}\n\nlayer {\n\tbottom: \"res5b\"\n\ttop: \"res5b\"\n\tname: \"res5b_relu\"\n\ttype: \"ReLU\"\n}\n\nlayer {\n\tbottom: \"res5b\"\n\ttop: \"res5c_branch2a\"\n\tname: \"res5c_branch2a\"\n\ttype: \"Convolution\"\n\tconvolution_param {\n\t\tnum_output: 512\n\t\tkernel_size: 1\n\t\tpad: 0\n\t\tstride: 1\n\t\tbias_term: false\n\t}\n}\n\nlayer {\n\tbottom: \"res5c_branch2a\"\n\ttop: \"res5c_branch2a\"\n\tname: \"bn5c_branch2a\"\n\ttype: \"BatchNorm\"\n\tbatch_norm_param {\n\t\tuse_global_stats: true\n\t}\n}\n\nlayer {\n\tbottom: \"res5c_branch2a\"\n\ttop: \"res5c_branch2a\"\n\tname: \"scale5c_branch2a\"\n\ttype: \"Scale\"\n\tscale_param {\n\t\tbias_term: true\n\t}\n}\n\nlayer {\n\tbottom: \"res5c_branch2a\"\n\ttop: \"res5c_branch2a\"\n\tname: \"res5c_branch2a_relu\"\n\ttype: \"ReLU\"\n}\n\nlayer {\n\tbottom: \"res5c_branch2a\"\n\ttop: \"res5c_branch2b\"\n\tname: \"res5c_branch2b\"\n\ttype: \"Convolution\"\n\tconvolution_param {\n\t\tnum_output: 512\n\t\tkernel_size: 3\n\t\tpad: 1\n\t\tstride: 1\n\t\tbias_term: false\n\t}\n}\n\nlayer {\n\tbottom: \"res5c_branch2b\"\n\ttop: \"res5c_branch2b\"\n\tname: \"bn5c_branch2b\"\n\ttype: \"BatchNorm\"\n\tbatch_norm_param {\n\t\tuse_global_stats: true\n\t}\n}\n\nlayer {\n\tbottom: \"res5c_branch2b\"\n\ttop: \"res5c_branch2b\"\n\tname: \"scale5c_branch2b\"\n\ttype: \"Scale\"\n\tscale_param {\n\t\tbias_term: true\n\t}\n}\n\nlayer {\n\tbottom: \"res5c_branch2b\"\n\ttop: \"res5c_branch2b\"\n\tname: \"res5c_branch2b_relu\"\n\ttype: \"ReLU\"\n}\n\nlayer {\n\tbottom: \"res5c_branch2b\"\n\ttop: \"res5c_branch2c\"\n\tname: \"res5c_branch2c\"\n\ttype: \"Convolution\"\n\tconvolution_param {\n\t\tnum_output: 2048\n\t\tkernel_size: 1\n\t\tpad: 0\n\t\tstride: 1\n\t\tbias_term: false\n\t}\n}\n\nlayer {\n\tbottom: \"res5c_branch2c\"\n\ttop: \"res5c_branch2c\"\n\tname: \"bn5c_branch2c\"\n\ttype: \"BatchNorm\"\n\tbatch_norm_param {\n\t\tuse_global_stats: true\n\t}\n}\n\nlayer {\n\tbottom: \"res5c_branch2c\"\n\ttop: \"res5c_branch2c\"\n\tname: \"scale5c_branch2c\"\n\ttype: \"Scale\"\n\tscale_param {\n\t\tbias_term: true\n\t}\n}\n\nlayer {\n\tbottom: \"res5b\"\n\tbottom: \"res5c_branch2c\"\n\ttop: \"res5c\"\n\tname: \"res5c\"\n\ttype: \"Eltwise\"\n}\n\nlayer {\n\tbottom: \"res5c\"\n\ttop: \"res5c\"\n\tname: \"res5c_relu\"\n\ttype: \"ReLU\"\n}\n\nlayer {\n\tbottom: \"res5c\"\n\ttop: \"pool5\"\n\tname: \"pool5\"\n\ttype: \"Pooling\"\n\tpooling_param {\n\t\tkernel_size: 7\n\t\tstride: 1\n\t\tpool: AVE\n\t}\n}\n\nlayer {\n\tbottom: \"pool5\"\n\ttop: \"fc1000\"\n\tname: \"fc1000\"\n\ttype: \"InnerProduct\"\n\tinner_product_param {\n\t\tnum_output: 1000\n\t}\n}\n\nlayer {\n\tbottom: \"fc1000\"\n\ttop: \"prob\"\n\tname: \"prob\"\n\ttype: \"Softmax\"\n}"
  },
  {
    "path": "presets/sq11b2a_e3.prototxt",
    "content": "name: \"SqueezeNet v1.1 b2a ext3\"\nlayer {\n  name: \"data\"\n  type: \"Data\"\n  top: \"data\"\n  input_param {\n      shape: {\n          dim: 1\n          dim: 3\n          dim: 256\n          dim: 256\n      }\n  }\n}\nlayer {\n  name: \"conv1\"\n  type: \"Convolution\"\n  bottom: \"data\"\n  top: \"conv1\"\n  convolution_param {\n    num_output: 64\n    kernel_size: 3\n    stride: 2\n    pad: 1\n    weight_filler {\n      type: \"xavier\"\n    }\n  }\n}\nlayer {\n  name: \"relu_conv1\"\n  type: \"ReLU\"\n  bottom: \"conv1\"\n  top: \"conv1\"\n}\nlayer {\n  name: \"fire2/squeeze3x3\"\n  type: \"Convolution\"\n  bottom: \"conv1\"\n  top: \"fire2/squeeze3x3\"\n  convolution_param {\n    num_output: 16\n    kernel_size: 3\n    stride: 2\n    pad: 1\n    weight_filler {\n      type: \"xavier\"\n    }\n  }\n}\nlayer {\n  name: \"fire2/relu_squeeze3x3\"\n  type: \"ReLU\"\n  bottom: \"fire2/squeeze3x3\"\n  top: \"fire2/squeeze3x3\"\n}\nlayer {\n  name: \"fire2/expand1x1\"\n  type: \"Convolution\"\n  bottom: \"fire2/squeeze3x3\"\n  top: \"fire2/expand1x1\"\n  convolution_param {\n    num_output: 64\n    kernel_size: 1\n    weight_filler {\n      type: \"xavier\"\n    }\n  }\n}\nlayer {\n  name: \"fire2/relu_expand1x1\"\n  type: \"ReLU\"\n  bottom: \"fire2/expand1x1\"\n  top: \"fire2/expand1x1\"\n}\nlayer {\n  name: \"fire2/expand3x3\"\n  type: \"Convolution\"\n  bottom: \"fire2/squeeze3x3\"\n  top: \"fire2/expand3x3\"\n  convolution_param {\n    num_output: 64\n    pad: 1\n    kernel_size: 3\n    weight_filler {\n      type: \"xavier\"\n    }\n  }\n}\nlayer {\n  name: \"fire2/relu_expand3x3\"\n  type: \"ReLU\"\n  bottom: \"fire2/expand3x3\"\n  top: \"fire2/expand3x3\"\n}\nlayer {\n  name: \"fire2/concat\"\n  type: \"Concat\"\n  bottom: \"fire2/expand1x1\"\n  bottom: \"fire2/expand3x3\"\n  top: \"fire2/concat\"\n}\nlayer {\n  name: \"fire3/squeeze1x1\"\n  type: \"Convolution\"\n  bottom: \"fire2/concat\"\n  top: \"fire3/squeeze1x1\"\n  convolution_param {\n    num_output: 16\n    kernel_size: 1\n    weight_filler {\n      type: \"xavier\"\n    }\n  }\n}\nlayer {\n  name: \"fire3/relu_squeeze1x1\"\n  type: \"ReLU\"\n  bottom: \"fire3/squeeze1x1\"\n  top: \"fire3/squeeze1x1\"\n}\nlayer {\n  name: \"fire3/expand1x1\"\n  type: \"Convolution\"\n  bottom: \"fire3/squeeze1x1\"\n  top: \"fire3/expand1x1\"\n  convolution_param {\n    num_output: 64\n    kernel_size: 1\n    weight_filler {\n      type: \"xavier\"\n    }\n  }\n}\nlayer {\n  name: \"fire3/relu_expand1x1\"\n  type: \"ReLU\"\n  bottom: \"fire3/expand1x1\"\n  top: \"fire3/expand1x1\"\n}\nlayer {\n  name: \"fire3/expand3x3\"\n  type: \"Convolution\"\n  bottom: \"fire3/squeeze1x1\"\n  top: \"fire3/expand3x3\"\n  convolution_param {\n    num_output: 64\n    kernel_size: 3\n    pad: 1\n    weight_filler {\n      type: \"xavier\"\n    }\n  }\n}\nlayer {\n  name: \"fire3/relu_expand3x3\"\n  type: \"ReLU\"\n  bottom: \"fire3/expand3x3\"\n  top: \"fire3/expand3x3\"\n}\nlayer {\n  name: \"fire3/concat\"\n  type: \"Concat\"\n  bottom: \"fire3/expand1x1\"\n  bottom: \"fire3/expand3x3\"\n  top: \"fire3/concat\"\n}\nlayer {\n  name: \"fire4/squeeze3x3\"\n  type: \"Convolution\"\n  bottom: \"fire3/concat\"\n  top: \"fire4/squeeze3x3\"\n  convolution_param {\n    num_output: 32\n    kernel_size: 3\n    stride: 2\n    pad: 1\n    weight_filler {\n      type: \"xavier\"\n    }\n  }\n}\nlayer {\n  name: \"fire4/relu_squeeze3x3\"\n  type: \"ReLU\"\n  bottom: \"fire4/squeeze3x3\"\n  top: \"fire4/squeeze3x3\"\n}\nlayer {\n  name: \"fire4/expand1x1\"\n  type: \"Convolution\"\n  bottom: \"fire4/squeeze3x3\"\n  top: \"fire4/expand1x1\"\n  convolution_param {\n    num_output: 128\n    kernel_size: 1\n    weight_filler {\n      type: \"xavier\"\n    }\n  }\n}\nlayer {\n  name: \"fire4/relu_expand1x1\"\n  type: \"ReLU\"\n  bottom: \"fire4/expand1x1\"\n  top: \"fire4/expand1x1\"\n}\nlayer {\n  name: \"fire4/expand3x3\"\n  type: \"Convolution\"\n  bottom: \"fire4/squeeze3x3\"\n  top: \"fire4/expand3x3\"\n  convolution_param {\n    num_output: 128\n    kernel_size: 3\n    pad: 1\n    weight_filler {\n      type: \"xavier\"\n    }\n  }\n}\nlayer {\n  name: \"fire4/relu_expand3x3\"\n  type: \"ReLU\"\n  bottom: \"fire4/expand3x3\"\n  top: \"fire4/expand3x3\"\n}\nlayer {\n  name: \"fire4/concat\"\n  type: \"Concat\"\n  bottom: \"fire4/expand1x1\"\n  bottom: \"fire4/expand3x3\"\n  top: \"fire4/concat\"\n}\nlayer {\n  name: \"fire5/squeeze1x1\"\n  type: \"Convolution\"\n  bottom: \"fire4/concat\"\n  top: \"fire5/squeeze1x1\"\n  convolution_param {\n    num_output: 32\n    kernel_size: 1\n    weight_filler {\n      type: \"xavier\"\n    }\n  }\n}\nlayer {\n  name: \"fire5/relu_squeeze1x1\"\n  type: \"ReLU\"\n  bottom: \"fire5/squeeze1x1\"\n  top: \"fire5/squeeze1x1\"\n}\nlayer {\n  name: \"fire5/expand1x1\"\n  type: \"Convolution\"\n  bottom: \"fire5/squeeze1x1\"\n  top: \"fire5/expand1x1\"\n  convolution_param {\n    num_output: 128\n    kernel_size: 1\n    weight_filler {\n      type: \"xavier\"\n    }\n  }\n}\nlayer {\n  name: \"fire5/relu_expand1x1\"\n  type: \"ReLU\"\n  bottom: \"fire5/expand1x1\"\n  top: \"fire5/expand1x1\"\n}\nlayer {\n  name: \"fire5/expand3x3\"\n  type: \"Convolution\"\n  bottom: \"fire5/squeeze1x1\"\n  top: \"fire5/expand3x3\"\n  convolution_param {\n    num_output: 128\n    kernel_size: 3\n    pad: 1\n    weight_filler {\n      type: \"xavier\"\n    }\n  }\n}\nlayer {\n  name: \"fire5/relu_expand3x3\"\n  type: \"ReLU\"\n  bottom: \"fire5/expand3x3\"\n  top: \"fire5/expand3x3\"\n}\nlayer {\n  name: \"fire5/concat\"\n  type: \"Concat\"\n  bottom: \"fire5/expand1x1\"\n  bottom: \"fire5/expand3x3\"\n  top: \"fire5/concat\"\n}\nlayer {\n  name: \"fire6/squeeze3x3\"\n  type: \"Convolution\"\n  bottom: \"fire5/concat\"\n  top: \"fire6/squeeze3x3\"\n  convolution_param {\n    num_output: 64\n    kernel_size: 3\n    stride: 2\n    pad: 1\n    weight_filler {\n      type: \"xavier\"\n    }\n  }\n}\nlayer {\n  name: \"fire6/relu_squeeze3x3\"\n  type: \"ReLU\"\n  bottom: \"fire6/squeeze3x3\"\n  top: \"fire6/squeeze3x3\"\n}\nlayer {\n  name: \"fire6/expand1x1\"\n  type: \"Convolution\"\n  bottom: \"fire6/squeeze3x3\"\n  top: \"fire6/expand1x1\"\n  convolution_param {\n    num_output: 256\n    kernel_size: 1\n    weight_filler {\n      type: \"xavier\"\n    }\n  }\n}\nlayer {\n  name: \"fire6/relu_expand1x1\"\n  type: \"ReLU\"\n  bottom: \"fire6/expand1x1\"\n  top: \"fire6/expand1x1\"\n}\nlayer {\n  name: \"fire6/expand3x3\"\n  type: \"Convolution\"\n  bottom: \"fire6/squeeze3x3\"\n  top: \"fire6/expand3x3\"\n  convolution_param {\n    num_output: 256\n    kernel_size: 3\n    pad: 1\n    weight_filler {\n      type: \"xavier\"\n    }\n  }\n}\nlayer {\n  name: \"fire6/relu_expand3x3\"\n  type: \"ReLU\"\n  bottom: \"fire6/expand3x3\"\n  top: \"fire6/expand3x3\"\n}\nlayer {\n  name: \"fire6/concat\"\n  type: \"Concat\"\n  bottom: \"fire6/expand1x1\"\n  bottom: \"fire6/expand3x3\"\n  top: \"fire6/concat\"\n}\nlayer {\n  name: \"fire7/squeeze1x1\"\n  type: \"Convolution\"\n  bottom: \"fire6/concat\"\n  top: \"fire7/squeeze1x1\"\n  convolution_param {\n    num_output: 64\n    kernel_size: 1\n    weight_filler {\n      type: \"xavier\"\n    }\n  }\n}\nlayer {\n  name: \"fire7/relu_squeeze1x1\"\n  type: \"ReLU\"\n  bottom: \"fire7/squeeze1x1\"\n  top: \"fire7/squeeze1x1\"\n}\nlayer {\n  name: \"fire7/expand1x1\"\n  type: \"Convolution\"\n  bottom: \"fire7/squeeze1x1\"\n  top: \"fire7/expand1x1\"\n  convolution_param {\n    num_output: 256\n    kernel_size: 1\n    weight_filler {\n      type: \"xavier\"\n    }\n  }\n}\nlayer {\n  name: \"fire7/relu_expand1x1\"\n  type: \"ReLU\"\n  bottom: \"fire7/expand1x1\"\n  top: \"fire7/expand1x1\"\n}\nlayer {\n  name: \"fire7/expand3x3\"\n  type: \"Convolution\"\n  bottom: \"fire7/squeeze1x1\"\n  top: \"fire7/expand3x3\"\n  convolution_param {\n    num_output: 256\n    kernel_size: 3\n    pad: 1\n    weight_filler {\n      type: \"xavier\"\n    }\n  }\n}\nlayer {\n  name: \"fire7/relu_expand3x3\"\n  type: \"ReLU\"\n  bottom: \"fire7/expand3x3\"\n  top: \"fire7/expand3x3\"\n}\nlayer {\n  name: \"fire7/concat\"\n  type: \"Concat\"\n  bottom: \"fire7/expand1x1\"\n  bottom: \"fire7/expand3x3\"\n  top: \"fire7/concat\"\n}\nlayer {\n  name: \"fire8/squeeze3x3\"\n  type: \"Convolution\"\n  bottom: \"fire7/concat\"\n  top: \"fire8/squeeze3x3\"\n  convolution_param {\n    num_output: 128\n    kernel_size: 3\n    pad: 1\n    stride: 2\n    weight_filler {\n      type: \"xavier\"\n    }\n  }\n}\nlayer {\n  name: \"fire8/relu_squeeze3x3\"\n  type: \"ReLU\"\n  bottom: \"fire8/squeeze3x3\"\n  top: \"fire8/squeeze3x3\"\n}\nlayer {\n  name: \"fire8/expand1x1\"\n  type: \"Convolution\"\n  bottom: \"fire8/squeeze3x3\"\n  top: \"fire8/expand1x1\"\n  convolution_param {\n    num_output: 512\n    kernel_size: 1\n    weight_filler {\n      type: \"xavier\"\n    }\n  }\n}\nlayer {\n  name: \"fire8/relu_expand1x1\"\n  type: \"ReLU\"\n  bottom: \"fire8/expand1x1\"\n  top: \"fire8/expand1x1\"\n}\nlayer {\n  name: \"fire8/expand3x3\"\n  type: \"Convolution\"\n  bottom: \"fire8/squeeze3x3\"\n  top: \"fire8/expand3x3\"\n  convolution_param {\n    num_output: 512\n    kernel_size: 3\n    pad: 1\n    weight_filler {\n      type: \"xavier\"\n    }\n  }\n}\nlayer {\n  name: \"fire8/relu_expand3x3\"\n  type: \"ReLU\"\n  bottom: \"fire8/expand3x3\"\n  top: \"fire8/expand3x3\"\n}\nlayer {\n  name: \"fire8/concat\"\n  type: \"Concat\"\n  bottom: \"fire8/expand1x1\"\n  bottom: \"fire8/expand3x3\"\n  top: \"fire8/concat\"\n}\nlayer {\n  name: \"fire9/squeeze1x1\"\n  type: \"Convolution\"\n  bottom: \"fire8/concat\"\n  top: \"fire9/squeeze1x1\"\n  convolution_param {\n    num_output: 128\n    kernel_size: 1\n    weight_filler {\n      type: \"xavier\"\n    }\n  }\n}\nlayer {\n  name: \"fire9/relu_squeeze1x1\"\n  type: \"ReLU\"\n  bottom: \"fire9/squeeze1x1\"\n  top: \"fire9/squeeze1x1\"\n}\nlayer {\n  name: \"fire9/expand1x1\"\n  type: \"Convolution\"\n  bottom: \"fire9/squeeze1x1\"\n  top: \"fire9/expand1x1\"\n  convolution_param {\n    num_output: 512\n    kernel_size: 1\n    weight_filler {\n      type: \"xavier\"\n    }\n  }\n}\nlayer {\n  name: \"fire9/relu_expand1x1\"\n  type: \"ReLU\"\n  bottom: \"fire9/expand1x1\"\n  top: \"fire9/expand1x1\"\n}\nlayer {\n  name: \"fire9/expand3x3\"\n  type: \"Convolution\"\n  bottom: \"fire9/squeeze1x1\"\n  top: \"fire9/expand3x3\"\n  convolution_param {\n    num_output: 512\n    kernel_size: 3\n    pad: 1\n    weight_filler {\n      type: \"xavier\"\n    }\n  }\n}\nlayer {\n  name: \"fire9/relu_expand3x3\"\n  type: \"ReLU\"\n  bottom: \"fire9/expand3x3\"\n  top: \"fire9/expand3x3\"\n}\nlayer {\n  name: \"fire9/concat\"\n  type: \"Concat\"\n  bottom: \"fire9/expand1x1\"\n  bottom: \"fire9/expand3x3\"\n  top: \"fire9/concat\"\n}\nlayer {\n  name: \"drop9\"\n  type: \"Dropout\"\n  bottom: \"fire9/concat\"\n  top: \"fire9/concat\"\n  dropout_param {\n    dropout_ratio: 0.5\n  }\n}\nlayer {\n  name: \"conv10\"\n  type: \"Convolution\"\n  bottom: \"fire9/concat\"\n  top: \"conv10\"\n  convolution_param {\n    num_output: 1000\n    kernel_size: 1\n    weight_filler {\n      type: \"gaussian\"\n      mean: 0.0\n      std: 0.01\n    }\n  }\n}\nlayer {\n  name: \"conv10/relu\"\n  type: \"ReLU\"\n  bottom: \"conv10\"\n  top: \"conv10\"\n}\nlayer {\n  name: \"pool10\"\n  type: \"Pooling\"\n  bottom: \"conv10\"\n  top: \"pool10\"\n  pooling_param {\n    pool: AVE\n    global_pooling: true\n  }\n}\nlayer {\n  name: \"loss\"\n  type: \"SoftmaxWithLoss\"\n  bottom: \"pool10\"\n  top: \"loss\"\n  include {\n    phase: TRAIN\n  }\n}"
  },
  {
    "path": "presets/squeezenet.prototxt",
    "content": "name: \"SqueezeNet\"\nlayer {\n  name: \"data\"\n  type: \"Data\"\n  top: \"data\"\n  input_param {\n      shape: {\n          dim: 1\n          dim: 3\n          dim: 227\n          dim: 227\n      }\n  }\n}\nlayer {\n  name: \"conv1\"\n  type: \"Convolution\"\n  bottom: \"data\"\n  top: \"conv1\"\n  convolution_param {\n    num_output: 96\n    kernel_size: 7\n    stride: 2\n    weight_filler {\n      type: \"xavier\"\n    }\n  }\n}\nlayer {\n  name: \"relu_conv1\"\n  type: \"ReLU\"\n  bottom: \"conv1\"\n  top: \"conv1\"\n}\nlayer {\n  name: \"pool1\"\n  type: \"Pooling\"\n  bottom: \"conv1\"\n  top: \"pool1\"\n  pooling_param {\n    pool: MAX\n    kernel_size: 3\n    stride: 2\n  }\n}\nlayer {\n  name: \"fire2/squeeze1x1\"\n  type: \"Convolution\"\n  bottom: \"pool1\"\n  top: \"fire2/squeeze1x1\"\n  convolution_param {\n    num_output: 16\n    kernel_size: 1\n    weight_filler {\n      type: \"xavier\"\n    }\n  }\n}\nlayer {\n  name: \"fire2/relu_squeeze1x1\"\n  type: \"ReLU\"\n  bottom: \"fire2/squeeze1x1\"\n  top: \"fire2/squeeze1x1\"\n}\nlayer {\n  name: \"fire2/expand1x1\"\n  type: \"Convolution\"\n  bottom: \"fire2/squeeze1x1\"\n  top: \"fire2/expand1x1\"\n  convolution_param {\n    num_output: 64\n    kernel_size: 1\n    weight_filler {\n      type: \"xavier\"\n    }\n  }\n}\nlayer {\n  name: \"fire2/relu_expand1x1\"\n  type: \"ReLU\"\n  bottom: \"fire2/expand1x1\"\n  top: \"fire2/expand1x1\"\n}\nlayer {\n  name: \"fire2/expand3x3\"\n  type: \"Convolution\"\n  bottom: \"fire2/squeeze1x1\"\n  top: \"fire2/expand3x3\"\n  convolution_param {\n    num_output: 64\n    pad: 1\n    kernel_size: 3\n    weight_filler {\n      type: \"xavier\"\n    }\n  }\n}\nlayer {\n  name: \"fire2/relu_expand3x3\"\n  type: \"ReLU\"\n  bottom: \"fire2/expand3x3\"\n  top: \"fire2/expand3x3\"\n}\nlayer {\n  name: \"fire2/concat\"\n  type: \"Concat\"\n  bottom: \"fire2/expand1x1\"\n  bottom: \"fire2/expand3x3\"\n  top: \"fire2/concat\"\n}\nlayer {\n  name: \"fire3/squeeze1x1\"\n  type: \"Convolution\"\n  bottom: \"fire2/concat\"\n  top: \"fire3/squeeze1x1\"\n  convolution_param {\n    num_output: 16\n    kernel_size: 1\n    weight_filler {\n      type: \"xavier\"\n    }\n  }\n}\nlayer {\n  name: \"fire3/relu_squeeze1x1\"\n  type: \"ReLU\"\n  bottom: \"fire3/squeeze1x1\"\n  top: \"fire3/squeeze1x1\"\n}\nlayer {\n  name: \"fire3/expand1x1\"\n  type: \"Convolution\"\n  bottom: \"fire3/squeeze1x1\"\n  top: \"fire3/expand1x1\"\n  convolution_param {\n    num_output: 64\n    kernel_size: 1\n    weight_filler {\n      type: \"xavier\"\n    }\n  }\n}\nlayer {\n  name: \"fire3/relu_expand1x1\"\n  type: \"ReLU\"\n  bottom: \"fire3/expand1x1\"\n  top: \"fire3/expand1x1\"\n}\nlayer {\n  name: \"fire3/expand3x3\"\n  type: \"Convolution\"\n  bottom: \"fire3/squeeze1x1\"\n  top: \"fire3/expand3x3\"\n  convolution_param {\n    num_output: 64\n    pad: 1\n    kernel_size: 3\n    weight_filler {\n      type: \"xavier\"\n    }\n  }\n}\nlayer {\n  name: \"fire3/relu_expand3x3\"\n  type: \"ReLU\"\n  bottom: \"fire3/expand3x3\"\n  top: \"fire3/expand3x3\"\n}\nlayer {\n  name: \"fire3/concat\"\n  type: \"Concat\"\n  bottom: \"fire3/expand1x1\"\n  bottom: \"fire3/expand3x3\"\n  top: \"fire3/concat\"\n}\nlayer {\n  name: \"fire4/squeeze1x1\"\n  type: \"Convolution\"\n  bottom: \"fire3/concat\"\n  top: \"fire4/squeeze1x1\"\n  convolution_param {\n    num_output: 32\n    kernel_size: 1\n    weight_filler {\n      type: \"xavier\"\n    }\n  }\n}\nlayer {\n  name: \"fire4/relu_squeeze1x1\"\n  type: \"ReLU\"\n  bottom: \"fire4/squeeze1x1\"\n  top: \"fire4/squeeze1x1\"\n}\nlayer {\n  name: \"fire4/expand1x1\"\n  type: \"Convolution\"\n  bottom: \"fire4/squeeze1x1\"\n  top: \"fire4/expand1x1\"\n  convolution_param {\n    num_output: 128\n    kernel_size: 1\n    weight_filler {\n      type: \"xavier\"\n    }\n  }\n}\nlayer {\n  name: \"fire4/relu_expand1x1\"\n  type: \"ReLU\"\n  bottom: \"fire4/expand1x1\"\n  top: \"fire4/expand1x1\"\n}\nlayer {\n  name: \"fire4/expand3x3\"\n  type: \"Convolution\"\n  bottom: \"fire4/squeeze1x1\"\n  top: \"fire4/expand3x3\"\n  convolution_param {\n    num_output: 128\n    pad: 1\n    kernel_size: 3\n    weight_filler {\n      type: \"xavier\"\n    }\n  }\n}\nlayer {\n  name: \"fire4/relu_expand3x3\"\n  type: \"ReLU\"\n  bottom: \"fire4/expand3x3\"\n  top: \"fire4/expand3x3\"\n}\nlayer {\n  name: \"fire4/concat\"\n  type: \"Concat\"\n  bottom: \"fire4/expand1x1\"\n  bottom: \"fire4/expand3x3\"\n  top: \"fire4/concat\"\n}\nlayer {\n  name: \"pool4\"\n  type: \"Pooling\"\n  bottom: \"fire4/concat\"\n  top: \"pool4\"\n  pooling_param {\n    pool: MAX\n    kernel_size: 3\n    stride: 2\n  }\n}\nlayer {\n  name: \"fire5/squeeze1x1\"\n  type: \"Convolution\"\n  bottom: \"pool4\"\n  top: \"fire5/squeeze1x1\"\n  convolution_param {\n    num_output: 32\n    kernel_size: 1\n    weight_filler {\n      type: \"xavier\"\n    }\n  }\n}\nlayer {\n  name: \"fire5/relu_squeeze1x1\"\n  type: \"ReLU\"\n  bottom: \"fire5/squeeze1x1\"\n  top: \"fire5/squeeze1x1\"\n}\nlayer {\n  name: \"fire5/expand1x1\"\n  type: \"Convolution\"\n  bottom: \"fire5/squeeze1x1\"\n  top: \"fire5/expand1x1\"\n  convolution_param {\n    num_output: 128\n    kernel_size: 1\n    weight_filler {\n      type: \"xavier\"\n    }\n  }\n}\nlayer {\n  name: \"fire5/relu_expand1x1\"\n  type: \"ReLU\"\n  bottom: \"fire5/expand1x1\"\n  top: \"fire5/expand1x1\"\n}\nlayer {\n  name: \"fire5/expand3x3\"\n  type: \"Convolution\"\n  bottom: \"fire5/squeeze1x1\"\n  top: \"fire5/expand3x3\"\n  convolution_param {\n    num_output: 128\n    pad: 1\n    kernel_size: 3\n    weight_filler {\n      type: \"xavier\"\n    }\n  }\n}\nlayer {\n  name: \"fire5/relu_expand3x3\"\n  type: \"ReLU\"\n  bottom: \"fire5/expand3x3\"\n  top: \"fire5/expand3x3\"\n}\nlayer {\n  name: \"fire5/concat\"\n  type: \"Concat\"\n  bottom: \"fire5/expand1x1\"\n  bottom: \"fire5/expand3x3\"\n  top: \"fire5/concat\"\n}\nlayer {\n  name: \"fire6/squeeze1x1\"\n  type: \"Convolution\"\n  bottom: \"fire5/concat\"\n  top: \"fire6/squeeze1x1\"\n  convolution_param {\n    num_output: 48\n    kernel_size: 1\n    weight_filler {\n      type: \"xavier\"\n    }\n  }\n}\nlayer {\n  name: \"fire6/relu_squeeze1x1\"\n  type: \"ReLU\"\n  bottom: \"fire6/squeeze1x1\"\n  top: \"fire6/squeeze1x1\"\n}\nlayer {\n  name: \"fire6/expand1x1\"\n  type: \"Convolution\"\n  bottom: \"fire6/squeeze1x1\"\n  top: \"fire6/expand1x1\"\n  convolution_param {\n    num_output: 192\n    kernel_size: 1\n    weight_filler {\n      type: \"xavier\"\n    }\n  }\n}\nlayer {\n  name: \"fire6/relu_expand1x1\"\n  type: \"ReLU\"\n  bottom: \"fire6/expand1x1\"\n  top: \"fire6/expand1x1\"\n}\nlayer {\n  name: \"fire6/expand3x3\"\n  type: \"Convolution\"\n  bottom: \"fire6/squeeze1x1\"\n  top: \"fire6/expand3x3\"\n  convolution_param {\n    num_output: 192\n    pad: 1\n    kernel_size: 3\n    weight_filler {\n      type: \"xavier\"\n    }\n  }\n}\nlayer {\n  name: \"fire6/relu_expand3x3\"\n  type: \"ReLU\"\n  bottom: \"fire6/expand3x3\"\n  top: \"fire6/expand3x3\"\n}\nlayer {\n  name: \"fire6/concat\"\n  type: \"Concat\"\n  bottom: \"fire6/expand1x1\"\n  bottom: \"fire6/expand3x3\"\n  top: \"fire6/concat\"\n}\nlayer {\n  name: \"fire7/squeeze1x1\"\n  type: \"Convolution\"\n  bottom: \"fire6/concat\"\n  top: \"fire7/squeeze1x1\"\n  convolution_param {\n    num_output: 48\n    kernel_size: 1\n    weight_filler {\n      type: \"xavier\"\n    }\n  }\n}\nlayer {\n  name: \"fire7/relu_squeeze1x1\"\n  type: \"ReLU\"\n  bottom: \"fire7/squeeze1x1\"\n  top: \"fire7/squeeze1x1\"\n}\nlayer {\n  name: \"fire7/expand1x1\"\n  type: \"Convolution\"\n  bottom: \"fire7/squeeze1x1\"\n  top: \"fire7/expand1x1\"\n  convolution_param {\n    num_output: 192\n    kernel_size: 1\n    weight_filler {\n      type: \"xavier\"\n    }\n  }\n}\nlayer {\n  name: \"fire7/relu_expand1x1\"\n  type: \"ReLU\"\n  bottom: \"fire7/expand1x1\"\n  top: \"fire7/expand1x1\"\n}\nlayer {\n  name: \"fire7/expand3x3\"\n  type: \"Convolution\"\n  bottom: \"fire7/squeeze1x1\"\n  top: \"fire7/expand3x3\"\n  convolution_param {\n    num_output: 192\n    pad: 1\n    kernel_size: 3\n    weight_filler {\n      type: \"xavier\"\n    }\n  }\n}\nlayer {\n  name: \"fire7/relu_expand3x3\"\n  type: \"ReLU\"\n  bottom: \"fire7/expand3x3\"\n  top: \"fire7/expand3x3\"\n}\nlayer {\n  name: \"fire7/concat\"\n  type: \"Concat\"\n  bottom: \"fire7/expand1x1\"\n  bottom: \"fire7/expand3x3\"\n  top: \"fire7/concat\"\n}\nlayer {\n  name: \"fire8/squeeze1x1\"\n  type: \"Convolution\"\n  bottom: \"fire7/concat\"\n  top: \"fire8/squeeze1x1\"\n  convolution_param {\n    num_output: 64\n    kernel_size: 1\n    weight_filler {\n      type: \"xavier\"\n    }\n  }\n}\nlayer {\n  name: \"fire8/relu_squeeze1x1\"\n  type: \"ReLU\"\n  bottom: \"fire8/squeeze1x1\"\n  top: \"fire8/squeeze1x1\"\n}\nlayer {\n  name: \"fire8/expand1x1\"\n  type: \"Convolution\"\n  bottom: \"fire8/squeeze1x1\"\n  top: \"fire8/expand1x1\"\n  convolution_param {\n    num_output: 256\n    kernel_size: 1\n    weight_filler {\n      type: \"xavier\"\n    }\n  }\n}\nlayer {\n  name: \"fire8/relu_expand1x1\"\n  type: \"ReLU\"\n  bottom: \"fire8/expand1x1\"\n  top: \"fire8/expand1x1\"\n}\nlayer {\n  name: \"fire8/expand3x3\"\n  type: \"Convolution\"\n  bottom: \"fire8/squeeze1x1\"\n  top: \"fire8/expand3x3\"\n  convolution_param {\n    num_output: 256\n    pad: 1\n    kernel_size: 3\n    weight_filler {\n      type: \"xavier\"\n    }\n  }\n}\nlayer {\n  name: \"fire8/relu_expand3x3\"\n  type: \"ReLU\"\n  bottom: \"fire8/expand3x3\"\n  top: \"fire8/expand3x3\"\n}\nlayer {\n  name: \"fire8/concat\"\n  type: \"Concat\"\n  bottom: \"fire8/expand1x1\"\n  bottom: \"fire8/expand3x3\"\n  top: \"fire8/concat\"\n}\nlayer {\n  name: \"pool8\"\n  type: \"Pooling\"\n  bottom: \"fire8/concat\"\n  top: \"pool8\"\n  pooling_param {\n    pool: MAX\n    kernel_size: 3\n    stride: 2\n  }\n}\nlayer {\n  name: \"fire9/squeeze1x1\"\n  type: \"Convolution\"\n  bottom: \"pool8\"\n  top: \"fire9/squeeze1x1\"\n  convolution_param {\n    num_output: 64\n    kernel_size: 1\n    weight_filler {\n      type: \"xavier\"\n    }\n  }\n}\nlayer {\n  name: \"fire9/relu_squeeze1x1\"\n  type: \"ReLU\"\n  bottom: \"fire9/squeeze1x1\"\n  top: \"fire9/squeeze1x1\"\n}\nlayer {\n  name: \"fire9/expand1x1\"\n  type: \"Convolution\"\n  bottom: \"fire9/squeeze1x1\"\n  top: \"fire9/expand1x1\"\n  convolution_param {\n    num_output: 256\n    kernel_size: 1\n    weight_filler {\n      type: \"xavier\"\n    }\n  }\n}\nlayer {\n  name: \"fire9/relu_expand1x1\"\n  type: \"ReLU\"\n  bottom: \"fire9/expand1x1\"\n  top: \"fire9/expand1x1\"\n}\nlayer {\n  name: \"fire9/expand3x3\"\n  type: \"Convolution\"\n  bottom: \"fire9/squeeze1x1\"\n  top: \"fire9/expand3x3\"\n  convolution_param {\n    num_output: 256\n    pad: 1\n    kernel_size: 3\n    weight_filler {\n      type: \"xavier\"\n    }\n  }\n}\nlayer {\n  name: \"fire9/relu_expand3x3\"\n  type: \"ReLU\"\n  bottom: \"fire9/expand3x3\"\n  top: \"fire9/expand3x3\"\n}\nlayer {\n  name: \"fire9/concat\"\n  type: \"Concat\"\n  bottom: \"fire9/expand1x1\"\n  bottom: \"fire9/expand3x3\"\n  top: \"fire9/concat\"\n}\nlayer {\n  name: \"drop9\"\n  type: \"Dropout\"\n  bottom: \"fire9/concat\"\n  top: \"fire9/concat\"\n  dropout_param {\n    dropout_ratio: 0.5\n  }\n}\nlayer {\n  name: \"conv10\"\n  type: \"Convolution\"\n  bottom: \"fire9/concat\"\n  top: \"conv10\"\n  convolution_param {\n    num_output: 1000\n    pad: 1\n    kernel_size: 1\n    weight_filler {\n      type: \"gaussian\"\n      mean: 0.0\n      std: 0.01\n    }\n  }\n}\nlayer {\n  name: \"relu_conv10\"\n  type: \"ReLU\"\n  bottom: \"conv10\"\n  top: \"conv10\"\n}\nlayer {\n  name: \"pool10\"\n  type: \"Pooling\"\n  bottom: \"conv10\"\n  top: \"pool10\"\n  pooling_param {\n    pool: AVE\n    global_pooling: true\n  }\n}\nlayer {\n  name: \"loss\"\n  type: \"SoftmaxWithLoss\"\n  bottom: \"pool10\"\n  top: \"loss\"\n  include {\n    phase: TRAIN\n  }\n}"
  },
  {
    "path": "presets/squeezenet_v11.prototxt",
    "content": "name: \"SqueezeNet v1.1\"\nlayer {\n  name: \"data\"\n  type: \"Data\"\n  top: \"data\"\n  input_param {\n      shape: {\n          dim: 1\n          dim: 3\n          dim: 227\n          dim: 227\n      }\n  }\n}\nlayer {\n  name: \"conv1\"\n  type: \"Convolution\"\n  bottom: \"data\"\n  top: \"conv1\"\n  convolution_param {\n    num_output: 64\n    kernel_size: 3\n    stride: 2\n    weight_filler {\n      type: \"xavier\"\n    }\n  }\n}\nlayer {\n  name: \"relu_conv1\"\n  type: \"ReLU\"\n  bottom: \"conv1\"\n  top: \"conv1\"\n}\nlayer {\n  name: \"pool1\"\n  type: \"Pooling\"\n  bottom: \"conv1\"\n  top: \"pool1\"\n  pooling_param {\n    pool: MAX\n    kernel_size: 3\n    stride: 2\n  }\n}\nlayer {\n  name: \"fire2/squeeze1x1\"\n  type: \"Convolution\"\n  bottom: \"pool1\"\n  top: \"fire2/squeeze1x1\"\n  convolution_param {\n    num_output: 16\n    kernel_size: 1\n    weight_filler {\n      type: \"xavier\"\n    }\n  }\n}\nlayer {\n  name: \"fire2/relu_squeeze1x1\"\n  type: \"ReLU\"\n  bottom: \"fire2/squeeze1x1\"\n  top: \"fire2/squeeze1x1\"\n}\nlayer {\n  name: \"fire2/expand1x1\"\n  type: \"Convolution\"\n  bottom: \"fire2/squeeze1x1\"\n  top: \"fire2/expand1x1\"\n  convolution_param {\n    num_output: 64\n    kernel_size: 1\n    weight_filler {\n      type: \"xavier\"\n    }\n  }\n}\nlayer {\n  name: \"fire2/relu_expand1x1\"\n  type: \"ReLU\"\n  bottom: \"fire2/expand1x1\"\n  top: \"fire2/expand1x1\"\n}\nlayer {\n  name: \"fire2/expand3x3\"\n  type: \"Convolution\"\n  bottom: \"fire2/squeeze1x1\"\n  top: \"fire2/expand3x3\"\n  convolution_param {\n    num_output: 64\n    pad: 1\n    kernel_size: 3\n    weight_filler {\n      type: \"xavier\"\n    }\n  }\n}\nlayer {\n  name: \"fire2/relu_expand3x3\"\n  type: \"ReLU\"\n  bottom: \"fire2/expand3x3\"\n  top: \"fire2/expand3x3\"\n}\nlayer {\n  name: \"fire2/concat\"\n  type: \"Concat\"\n  bottom: \"fire2/expand1x1\"\n  bottom: \"fire2/expand3x3\"\n  top: \"fire2/concat\"\n}\nlayer {\n  name: \"fire3/squeeze1x1\"\n  type: \"Convolution\"\n  bottom: \"fire2/concat\"\n  top: \"fire3/squeeze1x1\"\n  convolution_param {\n    num_output: 16\n    kernel_size: 1\n    weight_filler {\n      type: \"xavier\"\n    }\n  }\n}\nlayer {\n  name: \"fire3/relu_squeeze1x1\"\n  type: \"ReLU\"\n  bottom: \"fire3/squeeze1x1\"\n  top: \"fire3/squeeze1x1\"\n}\nlayer {\n  name: \"fire3/expand1x1\"\n  type: \"Convolution\"\n  bottom: \"fire3/squeeze1x1\"\n  top: \"fire3/expand1x1\"\n  convolution_param {\n    num_output: 64\n    kernel_size: 1\n    weight_filler {\n      type: \"xavier\"\n    }\n  }\n}\nlayer {\n  name: \"fire3/relu_expand1x1\"\n  type: \"ReLU\"\n  bottom: \"fire3/expand1x1\"\n  top: \"fire3/expand1x1\"\n}\nlayer {\n  name: \"fire3/expand3x3\"\n  type: \"Convolution\"\n  bottom: \"fire3/squeeze1x1\"\n  top: \"fire3/expand3x3\"\n  convolution_param {\n    num_output: 64\n    pad: 1\n    kernel_size: 3\n    weight_filler {\n      type: \"xavier\"\n    }\n  }\n}\nlayer {\n  name: \"fire3/relu_expand3x3\"\n  type: \"ReLU\"\n  bottom: \"fire3/expand3x3\"\n  top: \"fire3/expand3x3\"\n}\nlayer {\n  name: \"fire3/concat\"\n  type: \"Concat\"\n  bottom: \"fire3/expand1x1\"\n  bottom: \"fire3/expand3x3\"\n  top: \"fire3/concat\"\n}\nlayer {\n  name: \"pool3\"\n  type: \"Pooling\"\n  bottom: \"fire3/concat\"\n  top: \"pool3\"\n  pooling_param {\n    pool: MAX\n    kernel_size: 3\n    stride: 2\n  }\n}\nlayer {\n  name: \"fire4/squeeze1x1\"\n  type: \"Convolution\"\n  bottom: \"pool3\"\n  top: \"fire4/squeeze1x1\"\n  convolution_param {\n    num_output: 32\n    kernel_size: 1\n    weight_filler {\n      type: \"xavier\"\n    }\n  }\n}\nlayer {\n  name: \"fire4/relu_squeeze1x1\"\n  type: \"ReLU\"\n  bottom: \"fire4/squeeze1x1\"\n  top: \"fire4/squeeze1x1\"\n}\nlayer {\n  name: \"fire4/expand1x1\"\n  type: \"Convolution\"\n  bottom: \"fire4/squeeze1x1\"\n  top: \"fire4/expand1x1\"\n  convolution_param {\n    num_output: 128\n    kernel_size: 1\n    weight_filler {\n      type: \"xavier\"\n    }\n  }\n}\nlayer {\n  name: \"fire4/relu_expand1x1\"\n  type: \"ReLU\"\n  bottom: \"fire4/expand1x1\"\n  top: \"fire4/expand1x1\"\n}\nlayer {\n  name: \"fire4/expand3x3\"\n  type: \"Convolution\"\n  bottom: \"fire4/squeeze1x1\"\n  top: \"fire4/expand3x3\"\n  convolution_param {\n    num_output: 128\n    pad: 1\n    kernel_size: 3\n    weight_filler {\n      type: \"xavier\"\n    }\n  }\n}\nlayer {\n  name: \"fire4/relu_expand3x3\"\n  type: \"ReLU\"\n  bottom: \"fire4/expand3x3\"\n  top: \"fire4/expand3x3\"\n}\nlayer {\n  name: \"fire4/concat\"\n  type: \"Concat\"\n  bottom: \"fire4/expand1x1\"\n  bottom: \"fire4/expand3x3\"\n  top: \"fire4/concat\"\n}\nlayer {\n  name: \"fire5/squeeze1x1\"\n  type: \"Convolution\"\n  bottom: \"fire4/concat\"\n  top: \"fire5/squeeze1x1\"\n  convolution_param {\n    num_output: 32\n    kernel_size: 1\n    weight_filler {\n      type: \"xavier\"\n    }\n  }\n}\nlayer {\n  name: \"fire5/relu_squeeze1x1\"\n  type: \"ReLU\"\n  bottom: \"fire5/squeeze1x1\"\n  top: \"fire5/squeeze1x1\"\n}\nlayer {\n  name: \"fire5/expand1x1\"\n  type: \"Convolution\"\n  bottom: \"fire5/squeeze1x1\"\n  top: \"fire5/expand1x1\"\n  convolution_param {\n    num_output: 128\n    kernel_size: 1\n    weight_filler {\n      type: \"xavier\"\n    }\n  }\n}\nlayer {\n  name: \"fire5/relu_expand1x1\"\n  type: \"ReLU\"\n  bottom: \"fire5/expand1x1\"\n  top: \"fire5/expand1x1\"\n}\nlayer {\n  name: \"fire5/expand3x3\"\n  type: \"Convolution\"\n  bottom: \"fire5/squeeze1x1\"\n  top: \"fire5/expand3x3\"\n  convolution_param {\n    num_output: 128\n    pad: 1\n    kernel_size: 3\n    weight_filler {\n      type: \"xavier\"\n    }\n  }\n}\nlayer {\n  name: \"fire5/relu_expand3x3\"\n  type: \"ReLU\"\n  bottom: \"fire5/expand3x3\"\n  top: \"fire5/expand3x3\"\n}\nlayer {\n  name: \"fire5/concat\"\n  type: \"Concat\"\n  bottom: \"fire5/expand1x1\"\n  bottom: \"fire5/expand3x3\"\n  top: \"fire5/concat\"\n}\nlayer {\n  name: \"pool5\"\n  type: \"Pooling\"\n  bottom: \"fire5/concat\"\n  top: \"pool5\"\n  pooling_param {\n    pool: MAX\n    kernel_size: 3\n    stride: 2\n  }\n}\nlayer {\n  name: \"fire6/squeeze1x1\"\n  type: \"Convolution\"\n  bottom: \"pool5\"\n  top: \"fire6/squeeze1x1\"\n  convolution_param {\n    num_output: 48\n    kernel_size: 1\n    weight_filler {\n      type: \"xavier\"\n    }\n  }\n}\nlayer {\n  name: \"fire6/relu_squeeze1x1\"\n  type: \"ReLU\"\n  bottom: \"fire6/squeeze1x1\"\n  top: \"fire6/squeeze1x1\"\n}\nlayer {\n  name: \"fire6/expand1x1\"\n  type: \"Convolution\"\n  bottom: \"fire6/squeeze1x1\"\n  top: \"fire6/expand1x1\"\n  convolution_param {\n    num_output: 192\n    kernel_size: 1\n    weight_filler {\n      type: \"xavier\"\n    }\n  }\n}\nlayer {\n  name: \"fire6/relu_expand1x1\"\n  type: \"ReLU\"\n  bottom: \"fire6/expand1x1\"\n  top: \"fire6/expand1x1\"\n}\nlayer {\n  name: \"fire6/expand3x3\"\n  type: \"Convolution\"\n  bottom: \"fire6/squeeze1x1\"\n  top: \"fire6/expand3x3\"\n  convolution_param {\n    num_output: 192\n    pad: 1\n    kernel_size: 3\n    weight_filler {\n      type: \"xavier\"\n    }\n  }\n}\nlayer {\n  name: \"fire6/relu_expand3x3\"\n  type: \"ReLU\"\n  bottom: \"fire6/expand3x3\"\n  top: \"fire6/expand3x3\"\n}\nlayer {\n  name: \"fire6/concat\"\n  type: \"Concat\"\n  bottom: \"fire6/expand1x1\"\n  bottom: \"fire6/expand3x3\"\n  top: \"fire6/concat\"\n}\nlayer {\n  name: \"fire7/squeeze1x1\"\n  type: \"Convolution\"\n  bottom: \"fire6/concat\"\n  top: \"fire7/squeeze1x1\"\n  convolution_param {\n    num_output: 48\n    kernel_size: 1\n    weight_filler {\n      type: \"xavier\"\n    }\n  }\n}\nlayer {\n  name: \"fire7/relu_squeeze1x1\"\n  type: \"ReLU\"\n  bottom: \"fire7/squeeze1x1\"\n  top: \"fire7/squeeze1x1\"\n}\nlayer {\n  name: \"fire7/expand1x1\"\n  type: \"Convolution\"\n  bottom: \"fire7/squeeze1x1\"\n  top: \"fire7/expand1x1\"\n  convolution_param {\n    num_output: 192\n    kernel_size: 1\n    weight_filler {\n      type: \"xavier\"\n    }\n  }\n}\nlayer {\n  name: \"fire7/relu_expand1x1\"\n  type: \"ReLU\"\n  bottom: \"fire7/expand1x1\"\n  top: \"fire7/expand1x1\"\n}\nlayer {\n  name: \"fire7/expand3x3\"\n  type: \"Convolution\"\n  bottom: \"fire7/squeeze1x1\"\n  top: \"fire7/expand3x3\"\n  convolution_param {\n    num_output: 192\n    pad: 1\n    kernel_size: 3\n    weight_filler {\n      type: \"xavier\"\n    }\n  }\n}\nlayer {\n  name: \"fire7/relu_expand3x3\"\n  type: \"ReLU\"\n  bottom: \"fire7/expand3x3\"\n  top: \"fire7/expand3x3\"\n}\nlayer {\n  name: \"fire7/concat\"\n  type: \"Concat\"\n  bottom: \"fire7/expand1x1\"\n  bottom: \"fire7/expand3x3\"\n  top: \"fire7/concat\"\n}\nlayer {\n  name: \"fire8/squeeze1x1\"\n  type: \"Convolution\"\n  bottom: \"fire7/concat\"\n  top: \"fire8/squeeze1x1\"\n  convolution_param {\n    num_output: 64\n    kernel_size: 1\n    weight_filler {\n      type: \"xavier\"\n    }\n  }\n}\nlayer {\n  name: \"fire8/relu_squeeze1x1\"\n  type: \"ReLU\"\n  bottom: \"fire8/squeeze1x1\"\n  top: \"fire8/squeeze1x1\"\n}\nlayer {\n  name: \"fire8/expand1x1\"\n  type: \"Convolution\"\n  bottom: \"fire8/squeeze1x1\"\n  top: \"fire8/expand1x1\"\n  convolution_param {\n    num_output: 256\n    kernel_size: 1\n    weight_filler {\n      type: \"xavier\"\n    }\n  }\n}\nlayer {\n  name: \"fire8/relu_expand1x1\"\n  type: \"ReLU\"\n  bottom: \"fire8/expand1x1\"\n  top: \"fire8/expand1x1\"\n}\nlayer {\n  name: \"fire8/expand3x3\"\n  type: \"Convolution\"\n  bottom: \"fire8/squeeze1x1\"\n  top: \"fire8/expand3x3\"\n  convolution_param {\n    num_output: 256\n    pad: 1\n    kernel_size: 3\n    weight_filler {\n      type: \"xavier\"\n    }\n  }\n}\nlayer {\n  name: \"fire8/relu_expand3x3\"\n  type: \"ReLU\"\n  bottom: \"fire8/expand3x3\"\n  top: \"fire8/expand3x3\"\n}\nlayer {\n  name: \"fire8/concat\"\n  type: \"Concat\"\n  bottom: \"fire8/expand1x1\"\n  bottom: \"fire8/expand3x3\"\n  top: \"fire8/concat\"\n}\nlayer {\n  name: \"fire9/squeeze1x1\"\n  type: \"Convolution\"\n  bottom: \"fire8/concat\"\n  top: \"fire9/squeeze1x1\"\n  convolution_param {\n    num_output: 64\n    kernel_size: 1\n    weight_filler {\n      type: \"xavier\"\n    }\n  }\n}\nlayer {\n  name: \"fire9/relu_squeeze1x1\"\n  type: \"ReLU\"\n  bottom: \"fire9/squeeze1x1\"\n  top: \"fire9/squeeze1x1\"\n}\nlayer {\n  name: \"fire9/expand1x1\"\n  type: \"Convolution\"\n  bottom: \"fire9/squeeze1x1\"\n  top: \"fire9/expand1x1\"\n  convolution_param {\n    num_output: 256\n    kernel_size: 1\n    weight_filler {\n      type: \"xavier\"\n    }\n  }\n}\nlayer {\n  name: \"fire9/relu_expand1x1\"\n  type: \"ReLU\"\n  bottom: \"fire9/expand1x1\"\n  top: \"fire9/expand1x1\"\n}\nlayer {\n  name: \"fire9/expand3x3\"\n  type: \"Convolution\"\n  bottom: \"fire9/squeeze1x1\"\n  top: \"fire9/expand3x3\"\n  convolution_param {\n    num_output: 256\n    pad: 1\n    kernel_size: 3\n    weight_filler {\n      type: \"xavier\"\n    }\n  }\n}\nlayer {\n  name: \"fire9/relu_expand3x3\"\n  type: \"ReLU\"\n  bottom: \"fire9/expand3x3\"\n  top: \"fire9/expand3x3\"\n}\nlayer {\n  name: \"fire9/concat\"\n  type: \"Concat\"\n  bottom: \"fire9/expand1x1\"\n  bottom: \"fire9/expand3x3\"\n  top: \"fire9/concat\"\n}\nlayer {\n  name: \"drop9\"\n  type: \"Dropout\"\n  bottom: \"fire9/concat\"\n  top: \"fire9/concat\"\n  dropout_param {\n    dropout_ratio: 0.5\n  }\n}\nlayer {\n  name: \"conv10\"\n  type: \"Convolution\"\n  bottom: \"fire9/concat\"\n  top: \"conv10\"\n  convolution_param {\n    num_output: 1000\n    kernel_size: 1\n    weight_filler {\n      type: \"gaussian\"\n      mean: 0.0\n      std: 0.01\n    }\n  }\n}\nlayer {\n  name: \"relu_conv10\"\n  type: \"ReLU\"\n  bottom: \"conv10\"\n  top: \"conv10\"\n}\nlayer {\n  name: \"pool10\"\n  type: \"Pooling\"\n  bottom: \"conv10\"\n  top: \"pool10\"\n  pooling_param {\n    pool: AVE\n    global_pooling: true\n  }\n}\nlayer {\n  name: \"loss\"\n  type: \"SoftmaxWithLoss\"\n  bottom: \"pool10\"\n  top: \"loss\"\n  include {\n    phase: TRAIN\n  }\n}"
  },
  {
    "path": "presets/vgg-16.prototxt",
    "content": "name: \"VGG_ILSVRC_16_layers\"\nlayer {\n    type: \"data\"\n    name: \"data\"\n    top: \"data\"\n    input_param: {\n        shape: {\n            dim: 10\n            dim: 3\n            dim: 224\n            dim: 224\n        }\n    }\n\n}\nlayers {\n  bottom: \"data\"\n  top: \"conv1_1\"\n  name: \"conv1_1\"\n  type: CONVOLUTION\n  convolution_param {\n    num_output: 64\n    pad: 1\n    kernel_size: 3\n  }\n}\nlayers {\n  bottom: \"conv1_1\"\n  top: \"conv1_1\"\n  name: \"relu1_1\"\n  type: RELU\n}\nlayers {\n  bottom: \"conv1_1\"\n  top: \"conv1_2\"\n  name: \"conv1_2\"\n  type: CONVOLUTION\n  convolution_param {\n    num_output: 64\n    pad: 1\n    kernel_size: 3\n  }\n}\nlayers {\n  bottom: \"conv1_2\"\n  top: \"conv1_2\"\n  name: \"relu1_2\"\n  type: RELU\n}\nlayers {\n  bottom: \"conv1_2\"\n  top: \"pool1\"\n  name: \"pool1\"\n  type: POOLING\n  pooling_param {\n    pool: MAX\n    kernel_size: 2\n    stride: 2\n  }\n}\nlayers {\n  bottom: \"pool1\"\n  top: \"conv2_1\"\n  name: \"conv2_1\"\n  type: CONVOLUTION\n  convolution_param {\n    num_output: 128\n    pad: 1\n    kernel_size: 3\n  }\n}\nlayers {\n  bottom: \"conv2_1\"\n  top: \"conv2_1\"\n  name: \"relu2_1\"\n  type: RELU\n}\nlayers {\n  bottom: \"conv2_1\"\n  top: \"conv2_2\"\n  name: \"conv2_2\"\n  type: CONVOLUTION\n  convolution_param {\n    num_output: 128\n    pad: 1\n    kernel_size: 3\n  }\n}\nlayers {\n  bottom: \"conv2_2\"\n  top: \"conv2_2\"\n  name: \"relu2_2\"\n  type: RELU\n}\nlayers {\n  bottom: \"conv2_2\"\n  top: \"pool2\"\n  name: \"pool2\"\n  type: POOLING\n  pooling_param {\n    pool: MAX\n    kernel_size: 2\n    stride: 2\n  }\n}\nlayers {\n  bottom: \"pool2\"\n  top: \"conv3_1\"\n  name: \"conv3_1\"\n  type: CONVOLUTION\n  convolution_param {\n    num_output: 256\n    pad: 1\n    kernel_size: 3\n  }\n}\nlayers {\n  bottom: \"conv3_1\"\n  top: \"conv3_1\"\n  name: \"relu3_1\"\n  type: RELU\n}\nlayers {\n  bottom: \"conv3_1\"\n  top: \"conv3_2\"\n  name: \"conv3_2\"\n  type: CONVOLUTION\n  convolution_param {\n    num_output: 256\n    pad: 1\n    kernel_size: 3\n  }\n}\nlayers {\n  bottom: \"conv3_2\"\n  top: \"conv3_2\"\n  name: \"relu3_2\"\n  type: RELU\n}\nlayers {\n  bottom: \"conv3_2\"\n  top: \"conv3_3\"\n  name: \"conv3_3\"\n  type: CONVOLUTION\n  convolution_param {\n    num_output: 256\n    pad: 1\n    kernel_size: 3\n  }\n}\nlayers {\n  bottom: \"conv3_3\"\n  top: \"conv3_3\"\n  name: \"relu3_3\"\n  type: RELU\n}\nlayers {\n  bottom: \"conv3_3\"\n  top: \"pool3\"\n  name: \"pool3\"\n  type: POOLING\n  pooling_param {\n    pool: MAX\n    kernel_size: 2\n    stride: 2\n  }\n}\nlayers {\n  bottom: \"pool3\"\n  top: \"conv4_1\"\n  name: \"conv4_1\"\n  type: CONVOLUTION\n  convolution_param {\n    num_output: 512\n    pad: 1\n    kernel_size: 3\n  }\n}\nlayers {\n  bottom: \"conv4_1\"\n  top: \"conv4_1\"\n  name: \"relu4_1\"\n  type: RELU\n}\nlayers {\n  bottom: \"conv4_1\"\n  top: \"conv4_2\"\n  name: \"conv4_2\"\n  type: CONVOLUTION\n  convolution_param {\n    num_output: 512\n    pad: 1\n    kernel_size: 3\n  }\n}\nlayers {\n  bottom: \"conv4_2\"\n  top: \"conv4_2\"\n  name: \"relu4_2\"\n  type: RELU\n}\nlayers {\n  bottom: \"conv4_2\"\n  top: \"conv4_3\"\n  name: \"conv4_3\"\n  type: CONVOLUTION\n  convolution_param {\n    num_output: 512\n    pad: 1\n    kernel_size: 3\n  }\n}\nlayers {\n  bottom: \"conv4_3\"\n  top: \"conv4_3\"\n  name: \"relu4_3\"\n  type: RELU\n}\nlayers {\n  bottom: \"conv4_3\"\n  top: \"pool4\"\n  name: \"pool4\"\n  type: POOLING\n  pooling_param {\n    pool: MAX\n    kernel_size: 2\n    stride: 2\n  }\n}\nlayers {\n  bottom: \"pool4\"\n  top: \"conv5_1\"\n  name: \"conv5_1\"\n  type: CONVOLUTION\n  convolution_param {\n    num_output: 512\n    pad: 1\n    kernel_size: 3\n  }\n}\nlayers {\n  bottom: \"conv5_1\"\n  top: \"conv5_1\"\n  name: \"relu5_1\"\n  type: RELU\n}\nlayers {\n  bottom: \"conv5_1\"\n  top: \"conv5_2\"\n  name: \"conv5_2\"\n  type: CONVOLUTION\n  convolution_param {\n    num_output: 512\n    pad: 1\n    kernel_size: 3\n  }\n}\nlayers {\n  bottom: \"conv5_2\"\n  top: \"conv5_2\"\n  name: \"relu5_2\"\n  type: RELU\n}\nlayers {\n  bottom: \"conv5_2\"\n  top: \"conv5_3\"\n  name: \"conv5_3\"\n  type: CONVOLUTION\n  convolution_param {\n    num_output: 512\n    pad: 1\n    kernel_size: 3\n  }\n}\nlayers {\n  bottom: \"conv5_3\"\n  top: \"conv5_3\"\n  name: \"relu5_3\"\n  type: RELU\n}\nlayers {\n  bottom: \"conv5_3\"\n  top: \"pool5\"\n  name: \"pool5\"\n  type: POOLING\n  pooling_param {\n    pool: MAX\n    kernel_size: 2\n    stride: 2\n  }\n}\nlayers {\n  bottom: \"pool5\"\n  top: \"fc6\"\n  name: \"fc6\"\n  type: INNER_PRODUCT\n  inner_product_param {\n    num_output: 4096\n  }\n}\nlayers {\n  bottom: \"fc6\"\n  top: \"fc6\"\n  name: \"relu6\"\n  type: RELU\n}\nlayers {\n  bottom: \"fc6\"\n  top: \"fc6\"\n  name: \"drop6\"\n  type: DROPOUT\n  dropout_param {\n    dropout_ratio: 0.5\n  }\n}\nlayers {\n  bottom: \"fc6\"\n  top: \"fc7\"\n  name: \"fc7\"\n  type: INNER_PRODUCT\n  inner_product_param {\n    num_output: 4096\n  }\n}\nlayers {\n  bottom: \"fc7\"\n  top: \"fc7\"\n  name: \"relu7\"\n  type: RELU\n}\nlayers {\n  bottom: \"fc7\"\n  top: \"fc7\"\n  name: \"drop7\"\n  type: DROPOUT\n  dropout_param {\n    dropout_ratio: 0.5\n  }\n}\nlayers {\n  bottom: \"fc7\"\n  top: \"fc8\"\n  name: \"fc8\"\n  type: INNER_PRODUCT\n  inner_product_param {\n    num_output: 1000\n  }\n}\nlayers {\n  bottom: \"fc8\"\n  top: \"prob\"\n  name: \"prob\"\n  type: SOFTMAX\n}\n"
  },
  {
    "path": "presets/zynqnet.prototxt",
    "content": "name: \"ZynqNet\"\nlayer {\n  name: \"data\"\n  type: \"Data\"\n  top: \"data\"\n  input_param {\n      shape: {\n          dim: 1\n          dim: 3\n          dim: 256\n          dim: 256\n      }\n  }\n}\nlayer {\n  name: \"conv1\"\n  type: \"Convolution\"\n  bottom: \"data\"\n  top: \"conv1\"\n  convolution_param {\n    num_output: 64\n    kernel_size: 3\n    stride: 2\n    pad: 1\n    weight_filler {\n      type: \"xavier\"\n    }\n  }\n}\nlayer {\n  name: \"relu_conv1\"\n  type: \"ReLU\"\n  bottom: \"conv1\"\n  top: \"conv1\"\n}\nlayer {\n  name: \"fire2/squeeze3x3\"\n  type: \"Convolution\"\n  bottom: \"conv1\"\n  top: \"fire2/squeeze3x3\"\n  convolution_param {\n    num_output: 16\n    kernel_size: 3\n    stride: 2\n    pad: 1\n    weight_filler {\n      type: \"xavier\"\n    }\n  }\n}\nlayer {\n  name: \"fire2/relu_squeeze3x3\"\n  type: \"ReLU\"\n  bottom: \"fire2/squeeze3x3\"\n  top: \"fire2/squeeze3x3\"\n}\nlayer {\n  name: \"fire2/expand1x1\"\n  type: \"Convolution\"\n  bottom: \"fire2/squeeze3x3\"\n  top: \"fire2/expand1x1\"\n  convolution_param {\n    num_output: 64\n    kernel_size: 1\n    weight_filler {\n      type: \"xavier\"\n    }\n  }\n}\nlayer {\n  name: \"fire2/relu_expand1x1\"\n  type: \"ReLU\"\n  bottom: \"fire2/expand1x1\"\n  top: \"fire2/expand1x1\"\n}\nlayer {\n  name: \"fire2/expand3x3\"\n  type: \"Convolution\"\n  bottom: \"fire2/squeeze3x3\"\n  top: \"fire2/expand3x3\"\n  convolution_param {\n    num_output: 64\n    pad: 1\n    kernel_size: 3\n    weight_filler {\n      type: \"xavier\"\n    }\n  }\n}\nlayer {\n  name: \"fire2/relu_expand3x3\"\n  type: \"ReLU\"\n  bottom: \"fire2/expand3x3\"\n  top: \"fire2/expand3x3\"\n}\nlayer {\n  name: \"fire2/concat\"\n  type: \"Concat\"\n  bottom: \"fire2/expand1x1\"\n  bottom: \"fire2/expand3x3\"\n  top: \"fire2/concat\"\n}\nlayer {\n  name: \"fire3/squeeze1x1\"\n  type: \"Convolution\"\n  bottom: \"fire2/concat\"\n  top: \"fire3/squeeze1x1\"\n  convolution_param {\n    num_output: 16\n    kernel_size: 1\n    weight_filler {\n      type: \"xavier\"\n    }\n  }\n}\nlayer {\n  name: \"fire3/relu_squeeze1x1\"\n  type: \"ReLU\"\n  bottom: \"fire3/squeeze1x1\"\n  top: \"fire3/squeeze1x1\"\n}\nlayer {\n  name: \"fire3/expand1x1\"\n  type: \"Convolution\"\n  bottom: \"fire3/squeeze1x1\"\n  top: \"fire3/expand1x1\"\n  convolution_param {\n    num_output: 64\n    kernel_size: 1\n    weight_filler {\n      type: \"xavier\"\n    }\n  }\n}\nlayer {\n  name: \"fire3/relu_expand1x1\"\n  type: \"ReLU\"\n  bottom: \"fire3/expand1x1\"\n  top: \"fire3/expand1x1\"\n}\nlayer {\n  name: \"fire3/expand3x3\"\n  type: \"Convolution\"\n  bottom: \"fire3/squeeze1x1\"\n  top: \"fire3/expand3x3\"\n  convolution_param {\n    num_output: 64\n    kernel_size: 3\n    pad: 1\n    weight_filler {\n      type: \"xavier\"\n    }\n  }\n}\nlayer {\n  name: \"fire3/relu_expand3x3\"\n  type: \"ReLU\"\n  bottom: \"fire3/expand3x3\"\n  top: \"fire3/expand3x3\"\n}\nlayer {\n  name: \"fire3/concat\"\n  type: \"Concat\"\n  bottom: \"fire3/expand1x1\"\n  bottom: \"fire3/expand3x3\"\n  top: \"fire3/concat\"\n}\nlayer {\n  name: \"fire4/squeeze3x3\"\n  type: \"Convolution\"\n  bottom: \"fire3/concat\"\n  top: \"fire4/squeeze3x3\"\n  convolution_param {\n    num_output: 32\n    kernel_size: 3\n    stride: 2\n    pad: 1\n    weight_filler {\n      type: \"xavier\"\n    }\n  }\n}\nlayer {\n  name: \"fire4/relu_squeeze3x3\"\n  type: \"ReLU\"\n  bottom: \"fire4/squeeze3x3\"\n  top: \"fire4/squeeze3x3\"\n}\nlayer {\n  name: \"fire4/expand1x1\"\n  type: \"Convolution\"\n  bottom: \"fire4/squeeze3x3\"\n  top: \"fire4/expand1x1\"\n  convolution_param {\n    num_output: 128\n    kernel_size: 1\n    weight_filler {\n      type: \"xavier\"\n    }\n  }\n}\nlayer {\n  name: \"fire4/relu_expand1x1\"\n  type: \"ReLU\"\n  bottom: \"fire4/expand1x1\"\n  top: \"fire4/expand1x1\"\n}\nlayer {\n  name: \"fire4/expand3x3\"\n  type: \"Convolution\"\n  bottom: \"fire4/squeeze3x3\"\n  top: \"fire4/expand3x3\"\n  convolution_param {\n    num_output: 128\n    kernel_size: 3\n    pad: 1\n    weight_filler {\n      type: \"xavier\"\n    }\n  }\n}\nlayer {\n  name: \"fire4/relu_expand3x3\"\n  type: \"ReLU\"\n  bottom: \"fire4/expand3x3\"\n  top: \"fire4/expand3x3\"\n}\nlayer {\n  name: \"fire4/concat\"\n  type: \"Concat\"\n  bottom: \"fire4/expand1x1\"\n  bottom: \"fire4/expand3x3\"\n  top: \"fire4/concat\"\n}\nlayer {\n  name: \"fire5/squeeze1x1\"\n  type: \"Convolution\"\n  bottom: \"fire4/concat\"\n  top: \"fire5/squeeze1x1\"\n  convolution_param {\n    num_output: 32\n    kernel_size: 1\n    weight_filler {\n      type: \"xavier\"\n    }\n  }\n}\nlayer {\n  name: \"fire5/relu_squeeze1x1\"\n  type: \"ReLU\"\n  bottom: \"fire5/squeeze1x1\"\n  top: \"fire5/squeeze1x1\"\n}\nlayer {\n  name: \"fire5/expand1x1\"\n  type: \"Convolution\"\n  bottom: \"fire5/squeeze1x1\"\n  top: \"fire5/expand1x1\"\n  convolution_param {\n    num_output: 128\n    kernel_size: 1\n    weight_filler {\n      type: \"xavier\"\n    }\n  }\n}\nlayer {\n  name: \"fire5/relu_expand1x1\"\n  type: \"ReLU\"\n  bottom: \"fire5/expand1x1\"\n  top: \"fire5/expand1x1\"\n}\nlayer {\n  name: \"fire5/expand3x3\"\n  type: \"Convolution\"\n  bottom: \"fire5/squeeze1x1\"\n  top: \"fire5/expand3x3\"\n  convolution_param {\n    num_output: 128\n    kernel_size: 3\n    pad: 1\n    weight_filler {\n      type: \"xavier\"\n    }\n  }\n}\nlayer {\n  name: \"fire5/relu_expand3x3\"\n  type: \"ReLU\"\n  bottom: \"fire5/expand3x3\"\n  top: \"fire5/expand3x3\"\n}\nlayer {\n  name: \"fire5/concat\"\n  type: \"Concat\"\n  bottom: \"fire5/expand1x1\"\n  bottom: \"fire5/expand3x3\"\n  top: \"fire5/concat\"\n}\nlayer {\n  name: \"fire6/squeeze3x3\"\n  type: \"Convolution\"\n  bottom: \"fire5/concat\"\n  top: \"fire6/squeeze3x3\"\n  convolution_param {\n    num_output: 64\n    kernel_size: 3\n    stride: 2\n    pad: 1\n    weight_filler {\n      type: \"xavier\"\n    }\n  }\n}\nlayer {\n  name: \"fire6/relu_squeeze3x3\"\n  type: \"ReLU\"\n  bottom: \"fire6/squeeze3x3\"\n  top: \"fire6/squeeze3x3\"\n}\nlayer {\n  name: \"fire6/expand1x1\"\n  type: \"Convolution\"\n  bottom: \"fire6/squeeze3x3\"\n  top: \"fire6/expand1x1\"\n  convolution_param {\n    num_output: 256\n    kernel_size: 1\n    weight_filler {\n      type: \"xavier\"\n    }\n  }\n}\nlayer {\n  name: \"fire6/relu_expand1x1\"\n  type: \"ReLU\"\n  bottom: \"fire6/expand1x1\"\n  top: \"fire6/expand1x1\"\n}\nlayer {\n  name: \"fire6/expand3x3\"\n  type: \"Convolution\"\n  bottom: \"fire6/squeeze3x3\"\n  top: \"fire6/expand3x3\"\n  convolution_param {\n    num_output: 256\n    kernel_size: 3\n    pad: 1\n    weight_filler {\n      type: \"xavier\"\n    }\n  }\n}\nlayer {\n  name: \"fire6/relu_expand3x3\"\n  type: \"ReLU\"\n  bottom: \"fire6/expand3x3\"\n  top: \"fire6/expand3x3\"\n}\nlayer {\n  name: \"fire6/concat\"\n  type: \"Concat\"\n  bottom: \"fire6/expand1x1\"\n  bottom: \"fire6/expand3x3\"\n  top: \"fire6/concat\"\n}\nlayer {\n  name: \"fire7/squeeze1x1\"\n  type: \"Convolution\"\n  bottom: \"fire6/concat\"\n  top: \"fire7/squeeze1x1\"\n  convolution_param {\n    num_output: 64\n    kernel_size: 1\n    weight_filler {\n      type: \"xavier\"\n    }\n  }\n}\nlayer {\n  name: \"fire7/relu_squeeze1x1\"\n  type: \"ReLU\"\n  bottom: \"fire7/squeeze1x1\"\n  top: \"fire7/squeeze1x1\"\n}\nlayer {\n  name: \"fire7/expand1x1\"\n  type: \"Convolution\"\n  bottom: \"fire7/squeeze1x1\"\n  top: \"fire7/expand1x1\"\n  convolution_param {\n    num_output: 192\n    kernel_size: 1\n    weight_filler {\n      type: \"xavier\"\n    }\n  }\n}\nlayer {\n  name: \"fire7/relu_expand1x1\"\n  type: \"ReLU\"\n  bottom: \"fire7/expand1x1\"\n  top: \"fire7/expand1x1\"\n}\nlayer {\n  name: \"fire7/expand3x3\"\n  type: \"Convolution\"\n  bottom: \"fire7/squeeze1x1\"\n  top: \"fire7/expand3x3\"\n  convolution_param {\n    num_output: 192\n    kernel_size: 3\n    pad: 1\n    weight_filler {\n      type: \"xavier\"\n    }\n  }\n}\nlayer {\n  name: \"fire7/relu_expand3x3\"\n  type: \"ReLU\"\n  bottom: \"fire7/expand3x3\"\n  top: \"fire7/expand3x3\"\n}\nlayer {\n  name: \"fire7/concat\"\n  type: \"Concat\"\n  bottom: \"fire7/expand1x1\"\n  bottom: \"fire7/expand3x3\"\n  top: \"fire7/concat\"\n}\nlayer {\n  name: \"fire8/squeeze3x3\"\n  type: \"Convolution\"\n  bottom: \"fire7/concat\"\n  top: \"fire8/squeeze3x3\"\n  convolution_param {\n    num_output: 112\n    kernel_size: 3\n    pad: 1\n    stride: 2\n    weight_filler {\n      type: \"xavier\"\n    }\n  }\n}\nlayer {\n  name: \"fire8/relu_squeeze3x3\"\n  type: \"ReLU\"\n  bottom: \"fire8/squeeze3x3\"\n  top: \"fire8/squeeze3x3\"\n}\nlayer {\n  name: \"fire8/expand1x1\"\n  type: \"Convolution\"\n  bottom: \"fire8/squeeze3x3\"\n  top: \"fire8/expand1x1\"\n  convolution_param {\n    num_output: 256\n    kernel_size: 1\n    weight_filler {\n      type: \"xavier\"\n    }\n  }\n}\nlayer {\n  name: \"fire8/relu_expand1x1\"\n  type: \"ReLU\"\n  bottom: \"fire8/expand1x1\"\n  top: \"fire8/expand1x1\"\n}\nlayer {\n  name: \"fire8/expand3x3\"\n  type: \"Convolution\"\n  bottom: \"fire8/squeeze3x3\"\n  top: \"fire8/expand3x3\"\n  convolution_param {\n    num_output: 256\n    kernel_size: 3\n    pad: 1\n    weight_filler {\n      type: \"xavier\"\n    }\n  }\n}\nlayer {\n  name: \"fire8/relu_expand3x3\"\n  type: \"ReLU\"\n  bottom: \"fire8/expand3x3\"\n  top: \"fire8/expand3x3\"\n}\nlayer {\n  name: \"fire8/concat\"\n  type: \"Concat\"\n  bottom: \"fire8/expand1x1\"\n  bottom: \"fire8/expand3x3\"\n  top: \"fire8/concat\"\n}\nlayer {\n  name: \"fire9/squeeze1x1\"\n  type: \"Convolution\"\n  bottom: \"fire8/concat\"\n  top: \"fire9/squeeze1x1\"\n  convolution_param {\n    num_output: 112\n    kernel_size: 1\n    weight_filler {\n      type: \"xavier\"\n    }\n  }\n}\nlayer {\n  name: \"fire9/relu_squeeze1x1\"\n  type: \"ReLU\"\n  bottom: \"fire9/squeeze1x1\"\n  top: \"fire9/squeeze1x1\"\n}\nlayer {\n  name: \"fire9/expand1x1\"\n  type: \"Convolution\"\n  bottom: \"fire9/squeeze1x1\"\n  top: \"fire9/expand1x1\"\n  convolution_param {\n    num_output: 368\n    kernel_size: 1\n    weight_filler {\n      type: \"xavier\"\n    }\n  }\n}\nlayer {\n  name: \"fire9/relu_expand1x1\"\n  type: \"ReLU\"\n  bottom: \"fire9/expand1x1\"\n  top: \"fire9/expand1x1\"\n}\nlayer {\n  name: \"fire9/expand3x3\"\n  type: \"Convolution\"\n  bottom: \"fire9/squeeze1x1\"\n  top: \"fire9/expand3x3\"\n  convolution_param {\n    num_output: 368\n    kernel_size: 3\n    pad: 1\n    weight_filler {\n      type: \"xavier\"\n    }\n  }\n}\nlayer {\n  name: \"fire9/relu_expand3x3\"\n  type: \"ReLU\"\n  bottom: \"fire9/expand3x3\"\n  top: \"fire9/expand3x3\"\n}\nlayer {\n  name: \"fire9/concat\"\n  type: \"Concat\"\n  bottom: \"fire9/expand1x1\"\n  bottom: \"fire9/expand3x3\"\n  top: \"fire9/concat\"\n}\nlayer {\n  name: \"drop9\"\n  type: \"Dropout\"\n  bottom: \"fire9/concat\"\n  top: \"fire9/concat\"\n  dropout_param {\n    dropout_ratio: 0.5\n  }\n}\n\nlayer {\n  name: \"conv10/split1\"\n  type: \"Convolution\"\n  bottom: \"fire9/concat\"\n  top: \"conv10/split1\"\n  convolution_param {\n    num_output: 512\n    kernel_size: 1\n    weight_filler {\n      type: \"gaussian\"\n      mean: 0.0\n      std: 0.01\n    }\n  }\n}\nlayer {\n  name: \"conv10/split2\"\n  type: \"Convolution\"\n  bottom: \"fire9/concat\"\n  top: \"conv10/split2\"\n  convolution_param {\n    num_output: 512\n    kernel_size: 1\n    weight_filler {\n      type: \"gaussian\"\n      mean: 0.0\n      std: 0.01\n    }\n  }\n}\nlayer {\n  name: \"conv10\"\n  type: \"Concat\"\n  bottom: \"conv10/split1\"\n  bottom: \"conv10/split2\"\n  top: \"conv10\"\n}\n\nlayer {\n  name: \"pool10\"\n  type: \"Pooling\"\n  bottom: \"conv10\"\n  top: \"pool10\"\n  pooling_param {\n    pool: AVE\n    global_pooling: true\n  }\n}\nlayer {\n  name: \"loss\"\n  type: \"SoftmaxWithLoss\"\n  bottom: \"pool10\"\n  top: \"loss\"\n  include {\n    phase: TRAIN\n  }\n}"
  },
  {
    "path": "quickstart.html",
    "content": "<!DOCTYPE html>\n<html>\n<head>\n    <meta charset=\"utf-8\">\n\t<meta name=\"description\" content=\"Netscope Visualization Tool for Convolutional Neural Networks\">\n\t<meta name=\"keywords\" content=\"netscope, CNN, visualization, tool, neural network, convnet, graph, deep learning\">\n\t<meta name=\"author\" content=\"dgschwend\">\n    <title>Quick Start &mdash; Netscope CNN Analyzer</title>\n    <link href='http://fonts.googleapis.com/css?family=Roboto:400,300' rel='stylesheet' type='text/css'>\n    <link rel=\"stylesheet\" href=\"assets/css/doc.css\">\n</head>\n<body>\n    <div class=\"container\">\n        <h1>Netscope CNN Analyzer</h1>\n        <p>A web-based tool for visualizing and analyzing convolutional neural network architectures (or technically, any directed acyclic graph).\n\t\t   Currently supports <a href=\"http://caffe.berkeleyvision.org/\">Caffe</a>'s prototxt format.</p>\n        <p>Basis by <a href=\"https://github.com/ethereon\">ethereon</a>. Extended for CNN Analysis by <a href=\"https://github.com/dgschwend\">dgschwend</a>.</p>\n    </div>\n    <div class=\"container\">\n        <h2>Gist Support</h2>\n        <p>If your <code>.prototxt</code> file is part of a GitHub Gist, you can visualize it by visiting this URL:</p>\n        <div class=\"code-box\">http://dgschwend.github.io/netscope/#/gist/<span class=\"highlight\">your-gist-id</span></div>\n        <p>The Gist ID is the numeric suffix in the Gist's URL.</p>\n        <a href=\"./#/gist/e65799e70358c6782b1b\" class=\"btn\">View Example</a>\n    </div>\n    <div class=\"container\">\n        <h2>Editor</h2>\n        <p>You can use <a href=\"./#/editor\">the inline editor</a> to enter your network definition (currently limited to valid Caffe's prototext) and visualize the network.</p>\n        <p>Press <code>Shift+Enter</code> in the editor to render your network.</p>\n        <a href=\"./#/editor\" class=\"btn\">Launch Editor</a>\n    </div>\n    <div class=\"container\">\n        <h2>Presets</h2>\n\t<div class=\"preset\">\n            <a href=\"./#/preset/zynqnet\"><img src=\"https://assets-cdn.github.com/images/icons/emoji/unicode/1f195.png\" width=32 height=32/> ZynqNet CNN</a>\n            <div class=\"authors\">David Gschwend (see <a href=\"https://www.github.com/dgschwend/zynqnet\">the master thesis repository</a>)</div>\n        </div>\n        <div class=\"preset\">\n            <a href=\"./#/preset/YOLO\">YOLO</a>\n            <div class=\"authors\">Joseph Redmon, Ali Farhadi</div>\n        </div>\n        <div class=\"preset\">\n            <a href=\"./#/preset/squeezenet\">SqueezeNet</a>\n            <div class=\"authors\">Forrest Iandola, Matthew Moskewicz, Khalid Ashraf, Song Han, William Dally, Kurt Keutzer</div>\n        </div>\n        <div class=\"preset\">\n            <a href=\"./#/preset/squeezenet_v11\">SqueezeNet v1.1</a>\n            <div class=\"authors\">Forrest Iandola, Matthew Moskewicz, Khalid Ashraf, Song Han, William Dally, Kurt Keutzer</div>\n        </div>\n        <div class=\"preset\">\n            <a href=\"./#/preset/inceptionv4\">Inception v4</a>\n            <div class=\"authors\">Christian Szegedy, Vincent Vanhoucke, Sergey Ioffe, Jonathon Shlens, Zbigniew Wojna</div>\n\t\t</div>\n        <div class=\"preset\">\n            <a href=\"./#/preset/inceptionv4_resnet\">Inception-ResNet-v2</a>\n            <div class=\"authors\">Christian Szegedy, Vincent Vanhoucke, Sergey Ioffe, Jonathon Shlens, Zbigniew Wojna</div>\n\t\t</div>\n        <div class=\"preset\">\n            <a href=\"./#/preset/inceptionv3\">Inception v3</a>\n            <div class=\"authors\">Christian Szegedy, Vincent Vanhoucke, Sergey Ioffe, Jonathon Shlens, Zbigniew Wojna</div>\n        </div>\n        <div class=\"preset\">\n        <div class=\"preset\">\n            <a href=\"./#/preset/resnet-50\">ResNet-50</a>\n            <div class=\"authors\">Kaiming He, Xiangyu Zhang, Shaoqing Ren, Jian Sun</div>\n\t\t</div>\n        <div class=\"preset\">\n            <a href=\"./#/preset/resnet-50\">ResNet-152</a>\n            <div class=\"authors\">Kaiming He, Xiangyu Zhang, Shaoqing Ren, Jian Sun</div>\n\t\t</div>\n        <div class=\"preset\">\n            <a href=\"./#/preset/alexnet\">AlexNet</a>\n            <div class=\"authors\">Alex Krizhevsky, Ilya Sutskever, Geoffry Hinton</div>\n        </div>\n        <div class=\"preset\">\n            <a href=\"./#/preset/caffenet\">CaffeNet</a>\n            <div class=\"authors\">Yangqing Jia, Evan Shelhamer, et. al.</div>\n        </div>\n        <div class=\"preset\">\n            <a href=\"./#/preset/fcn-16s\">FCN-16s: Fully Convolutional Network &mdash; Two Stream</a>\n            <div class=\"authors\">Jonathan Long, et. al</div>\n        </div>\n        <div class=\"preset\">\n<!--            <a href=\"./#/preset/fcn-8s-pascal\">FCN-8s: Fully Convolutional Network &mdash; Three Stream</a>\n            <div class=\"authors\">Jonathan Long, Evan Shelhamer, Trevor Darrell</div>\n        </div> -->\n        <div class=\"preset\">\n            <a href=\"./#/preset/googlenet\">GoogLeNet</a>\n            <div class=\"authors\">Christian Szegedy, et. al.</div>\n        </div>\n        <div class=\"preset\">\n            <a href=\"./#/preset/nin\">Network in Network</a>\n            <div class=\"authors\">Min Lin, Qiang Chen, Shuicheng Yan</div>\n        </div>\n        <div class=\"preset\">\n            <a href=\"./#/preset/vgg-16\">VGG 16 Layers</a>\n            <div class=\"authors\">Karen Simonyan, Andrew Zisserman</div>\n        </div>\n    </div>\n</body>\n</html>\n"
  },
  {
    "path": "required_nodejs_modules.txt",
    "content": "This project requires node.js and the following modules to be installed for successful compilation\r\ninstall with npm install <package>[@<version>]\r\n\r\ntablesorter@2.26\r\ncoffeeify\r\nwatchify\r\n"
  },
  {
    "path": "scripts/watch.sh",
    "content": "#!/bin/sh\nwatchify -v -t coffeeify src/netscope.coffee -o assets/js/netscope.js\n"
  },
  {
    "path": "src/analyzer.coffee",
    "content": "module.exports =\n  class Analyzer\n    constructor: ->\n\n    analyze: (net) ->\n        ## Add Input/Output Dimensions + Channels to each Node / Layer\n        # shape.dim: (    N   x   K   x   W   x   H   )\n        #              batch   channel  width   height\n        #               chIn    chOut   wIn     wOut\n\n        for n in net.sortTopologically()\n\n            layertype = n.type.toLowerCase()\n            # Setup Default Values for Analysis\n            d = n.analysis\n            d.wIn = d.hIn = d.wOut = d.hOut = d.chIn = d.chOut = 0\n            d.comp = {macc: 0, comp: 0, add: 0, div: 0, exp: 0}\n            d.mem  = {activation: 0, param: 0}\n            d.variants = [];\n\n            # Setup connection to parent layer\n            parent = n.parents[0]?.analysis\n\n            # Setup default channels + dimensions: inherited from parent\n            d.batchOut = d.batchIn = parent?.batchOut\n            d.wIn  = parent?.wOut\n            d.hIn  = parent?.hOut\n            d.chIn = parent?.chOut\n            switch layertype\n                when \"data\", \"input\"\n                    #dimensions\n                    if n.attribs.input_param?.shape?\n                        shape     = n.attribs.input_param.shape\n                        d.batchIn = shape.dim[0]\n                        d.chIn    = shape.dim[1]\n                        d.hIn     = shape.dim[2]\n                        d.wIn     = shape.dim[3]\n                    else if n.attribs.transform_param?.crop_size?\n                        d.wIn = d.hIn = n.attribs.transform_param.crop_size\n                        d.chIn = 3  # assume RGB\n                        d.batchOut = 1\n                    else\n                        onerror('Unknown Input Dimensions')\n                        debugger;\n                    # update output sizes\n                    d.wOut  = d.wIn\n                    d.hOut  = d.hIn\n                    d.chOut = d.chIn\n                    d.batchOut = d.batchIn\n                    #computation\n                    #-- none\n                    #memory\n                    #-- none\n                    d.mem.activation = d.wOut*d.hOut*d.chOut*d.batchOut\n\n                when \"convolution\"\n                    #dimensions\n                    params   = n.attribs.convolution_param\n                    kernel_w = params.kernel_w ? params.kernel_size\n                    kernel_h = params.kernel_h ? params.kernel_size\n                    stride_w = params.stride_w ? (params.stride ? 1)\n                    stride_h = params.stride_h ? (params.stride ? 1)\n                    pad_w    = params.pad_w ? (params.pad ? 0)\n                    pad_h    = params.pad_h ? (params.pad ? 0)\n                    numout   = params.num_output\n                    group    = params.group ? 1\n                    dilation = params.dilation ? 1\n                    has_bias = if (params.bias_term ? \"true\") == \"false\" then 0 else 1\n\n                    # according to http://caffe.berkeleyvision.org/tutorial/layers.html and https://github.com/BVLC/caffe/issues/3656\n                    kernel = dilation*(kernel_w-1)+1\n                    d.wOut = Math.floor((d.wIn + 2*pad_w - kernel) / stride_w) + 1\n                    kernel = dilation*(kernel_h-1)+1\n                    d.hOut = Math.floor((d.hIn + 2*pad_h - kernel) / stride_h) + 1\n\n                    d.chOut = numout\n                    #computation\n                    d.comp.macc = (kernel_w*kernel_h)*(d.wOut*d.hOut)*d.chIn*d.chOut*d.batchOut/group\n                    #memory\n                    d.mem.param = (kernel_w*kernel_h)*d.chIn*d.chOut/group + has_bias*d.chOut\n                    d.mem.activation = (d.wOut*d.hOut)*d.chOut*d.batchOut\n\n                    # CACHE AND BANDWIDTH for Implementation Variants\n                    if (do_variants_analysis)\n                        d.variants.push({\n                          name  : \"complete outputs, input cache\"\n                          cache : d.chIn*kernel_h*d.wIn +          # line buffers\n                                  d.chIn*kernel_h*kernel_w         # param cache\n                          readBW  : d.chOut*d.chIn*(d.wIn*d.hIn)\n                          writeBW : d.chOut*(d.wOut*d.hOut)          # ideal\n                          confBW  : d.chOut*d.chIn*kernel_w*kernel_h # ideal\n                        })\n                        d.variants.push({\n                          name  : \"complete inputs, input cache\"\n                          cache : kernel_h*d.wIn +         # line buffers\n                                  d.chIn*kernel_h*kernel_w # param cache\n                          readBW  : d.chIn*((d.chOut+1)*(d.wIn*d.hIn))\n                          writeBW : d.chIn*((d.chOut)*(d.wOut*d.hOut))\n                          confBW  : d.chOut*d.chIn*kernel_w*kernel_h # ideal\n                        })\n                        d.variants.push({\n                          name  : \"complete inputs, input + output cache\"\n                          cache : kernel_h*d.wIn +           # line buffers\n                                  d.chIn*kernel_h*kernel_w + # param cache\n                                  d.wIn*d.hIn*d.chOut        # output cache\n                          readBW  : d.chIn*(d.wIn*d.hIn)  # ideal\n                          writeBW : d.chOut*(d.wOut*d.hOut) # ideal\n                          confBW  : d.chOut*d.chIn*kernel_w*kernel_h # ideal\n                        })\n                        d.variants.push({\n                          name  : \"streaming, input cache\"\n                          cache : d.chIn*kernel_h*d.wIn\n                          readBW  : d.chIn*(d.wIn*d.hIn)\n                          writeBW : d.chOut*(d.wOut*d.hOut)\n                          confBW  : d.hIn*(d.chIn*d.chOut*(kernel_w*kernel_h))\n                        })\n                        d.variants.push({\n                          name  : \"streaming, input + config cache\"\n                          cache : d.chIn*kernel_h*d.wIn +\n                                  d.chIn*d.chOut*(kernel_h*kernel_w)\n                          readBW  : d.chIn*(d.wIn*d.hIn)\n                          writeBW : d.chOut*(d.wOut*d.hOut)\n                          confBW  : d.chOut*d.chIn*kernel_w*kernel_h # ideal\n                        })\n                        d.variants.push({\n                          name  : \"streaming, temp.\"\n                          img_cache : if kernel_h > 1 then d.chIn*kernel_h*d.wIn else d.chIn\n                          img_dim   : d.chIn+\"ch ∙ \"+d.wIn+\" × \"+kernel_h+\" × 32b\"\n                          flt_cache : d.chIn*d.chOut*(kernel_h*kernel_w)\n                          squeeze_cache : if n.name.indexOf(\"squeeze\") > -1 then d.chOut*d.wOut*d.hOut else \"\"\n                        })\n\n\n                when \"innerproduct\", \"inner_product\"\n                    #dimensions\n                    numout = n.attribs.inner_product_param.num_output\n                    has_bias = if (n.attribs.inner_product_param.bias_term ? \"true\") == \"false\" then 0 else 1\n                    d.wOut = 1\n                    d.hOut = 1\n                    d.chOut = numout\n                    #computation\n                    d.comp.macc = (d.wIn*d.hIn)*d.chIn*d.chOut*d.batchOut\n                    #memory\n                    d.mem.param = d.wIn*d.hIn*d.chIn*d.chOut + has_bias*d.chOut\n                    d.mem.activation = d.wOut*d.hOut*d.chOut*d.batchOut\n\n                when \"pooling\"\n                    #dimensions\n                    params = n.attribs.pooling_param\n                    kernel_w = params.kernel_w ? params.kernel_size\n                    kernel_h = params.kernel_h ? params.kernel_size\n                    stride_w = params.stride_w ? (params.stride ? 1)\n                    stride_h = params.stride_h ? (params.stride ? 1)\n                    pad_w    = params.pad_w ? (params.pad ? 0)\n                    pad_h    = params.pad_h ? (params.pad ? 0)\n                    isglobal = params.global_pooling ? 0\n                    pooltype = (params.pool ? 'MAX').toUpperCase()\n                    d.chOut = d.chIn\n                    # according to http://caffe.berkeleyvision.org/tutorial/layers.html and https://github.com/BVLC/caffe/issues/3656\n                    d.wOut = Math.ceil((d.wIn + 2*pad_w - kernel_w) / stride_w) + 1\n                    d.hOut = Math.ceil((d.hIn + 2*pad_h - kernel_h) / stride_h) + 1\n                    if isglobal\n                        d.wOut = d.hOut = 1\n                    #computation\n                    num_ops = if isglobal then ((d.wIn*d.hIn)*d.chIn*d.batchOut) else ((d.wOut*d.hOut)*kernel_h*kernel_w*d.chOut*d.batchOut)\n                    if pooltype == 'MAX'\n                        d.comp.comp = num_ops\n                    else if pooltype == 'AVE'\n                        d.comp.add = num_ops\n                        #d.comp.div = (d.wOut*d.hOut*d.chOut) #divide by const.\n                    else\n                        onerror \"Unknown pooling type #{pooltype}\"\n                    #memory\n                    d.mem.activation = d.wOut*d.hOut*d.chOut*d.batchOut\n\n                when \"batchnorm\", \"bn\"\n                    #dimensions\n                    d.wOut  = d.wIn\n                    d.hOut  = d.hIn\n                    d.chOut = d.chIn\n                    #computation\n                    # BN: subtract mean, divide by variance for each channel\n                    # averages during training: over spatial dims + batch\n                    d.comp.add = d.wIn*d.hIn*d.chIn*d.batchOut\n                    d.comp.div = d.wIn*d.hIn*d.chIn*d.batchOut\n                    #memory\n                    d.mem.param = d.chIn*2\n                    d.mem.activation = d.wOut*d.hOut*d.chOut*d.batchOut\n\n                when \"lrn\", \"normalize\"\n                    #dimensions\n                    #default mode: ACROSS_CHANNELS\n                    mode   = n.attribs.lrn_param?.norm_region ? 'ACROSS_CHANNELS'\n                    size   = n.attribs.lrn_param?.local_size ? 1\n                    d.wOut = d.wIn\n                    d.hOut = d.hIn\n                    d.chOut = d.chIn\n                    #computation\n                    #  Each input value is divided by (1+(α/n)∑xi^2)^β\n                    num_inputs = d.wIn*d.hIn*d.chIn*d.batchOut\n                    d.comp.macc = num_inputs*size   # (∑xi^2)\n                    d.comp.add = num_inputs         # (1+...)\n                    d.comp.exp = num_inputs         # (...)^β\n                    d.comp.div = num_inputs*2       # (α/n)*... + divide by sum\n                    #memory\n                    d.mem.param = 2  # alpha, beta\n                    d.mem.activation = d.wOut*d.hOut*d.chOut*d.batchOut\n\n                when \"concat\"\n                    #dimensions\n                    d.wOut = d.wIn\n                    d.hOut = d.hIn\n                    # sum up channels from inputs\n                    d.chIn = 0\n                    d.chIn += p.analysis.chOut for p in n.parents\n                    d.chOut = d.chIn\n                    # check input dimensions\n                    failed = failed || (p.analysis.wOut != d.wIn || p.analysis.hOut != d.hIn) for p in n.parents\n                    window.onerror('CONCAT: input dimensions dont agree!') if failed\n                    #computation\n                    # --none\n                    #memory\n                    d.mem.activation = d.wOut*d.hOut*d.chOut*d.batchOut\n\n                #relu/dropout use some memory, do some comparisons\n                when \"relu\", \"relu6\", \"elu\", \"prelu\", \"dropout\"\n                    #dimensions\n                    d.wIn = parent.wOut\n                    d.hIn = parent.hOut\n                    d.wOut = d.wIn\n                    d.hOut = d.hIn\n                    d.chOut = d.chIn = parent.chOut\n                    #computation\n                    d.comp.comp = d.wIn*d.hIn*d.chIn*d.batchOut\n                    #memory\n                    d.mem.activation = d.wOut*d.hOut*d.chOut*d.batchOut\n\n                when \"softmax\", \"softmaxwithloss\", \"softmax_loss\"\n                    #dimensions\n                    d.wOut = d.wIn\n                    d.hOut = d.hIn\n                    d.chOut = d.chIn\n                    #computation\n                    d.comp.exp = d.wIn*d.hIn*d.chIn*d.batchOut\n                    d.comp.add = d.wIn*d.hIn*d.chIn*d.batchOut\n                    d.comp.div = d.wIn*d.hIn*d.chIn*d.batchOut\n                    #memory\n                    d.mem.activation = d.wOut*d.hOut*d.chOut*d.batchOut\n\n                when \"flatten\"\n                    #dimensions\n                    d.wOut = d.hOut = 1\n                    d.chOut = d.chIn * d.wIn * d.hIn\n                    #computation\n                    # --none\n                    #memory\n                    d.mem.activation = d.wOut*d.hOut*d.chOut*d.batchOut\n\n                when \"eltwise\"\n                    #dimensions\n                    d.wOut = d.wIn\n                    d.hOut = d.hIn\n                    d.chOut = d.chIn\n                    # check input dimensions\n                    failed = false\n                    for p in n.parents\n                        failed = failed or (d.wIn != p.analysis.wOut) or (d.hIn != p.analysis.hOut)\n                    onerror 'ELTWISE: input dimensions dont agree in '+n.name if failed\n                    #computation\n                    op = n.eltwise_param?.operation?.toUpperCase() ? 'SUM'\n                    if op == 'SUM'\n                        d.comp.add = d.wIn*d.hIn*d.chIn*d.batchOut\n                    else if op == 'MAX'\n                        d.comp.comp = d.wIn*d.hIn*d.chIn*d.batchOut\n                    else if op == 'PROD'\n                        d.comp.macc = d.wIn*d.hIn*d.chIn*d.batchOut\n                    else\n                        onerror 'ELTWISE: unknown operation '+op\n                    #memory\n                    d.mem.activation = d.wOut*d.hOut*d.chOut*d.batchOut\n\n                when \"deconvolution\"\n                    #dimensions\n                    params   = n.attribs.convolution_param\n                    kernel_w = params.kernel_w ? params.kernel_size\n                    kernel_h = params.kernel_h ? params.kernel_size\n                    stride_w = params.stride_w ? (params.stride ? 1)\n                    stride_h = params.stride_h ? (params.stride ? 1)\n                    pad_w    = params.pad_w ? (params.pad ? 0)\n                    pad_h    = params.pad_h ? (params.pad ? 0)\n                    numout   = params.num_output\n                    d.wOut = (stride_w*(d.wIn-1)+kernel_w-2*pad_w)\n                    d.hOut = (stride_h*(d.hIn-1)+kernel_h-2*pad_h)\n                    d.chOut = numout\n                    #computation\n                    d.comp.macc = d.chIn*d.chOut*d.wOut*d.hOut*(kernel_w/stride_w)*(kernel_h/stride_h)*d.batchOut\n                    #memory\n                    d.mem.param = kernel_w*kernel_h*d.chIn*d.chOut\n                    d.mem.activation = d.wOut*d.hOut*d.chOut*d.batchOut\n\n                when \"crop\"\n                    #dimensions\n                    ## crop to dims of 2nd parent\n                    parent2 = n.parents[1].analysis\n                    d.wOut = parent2.wOut\n                    d.hOut = parent2.hOut\n                    d.chOut = d.chIn\n                    #computation\n                    # --none\n                    #memory\n                    d.mem.activation = d.wOut*d.hOut*d.chOut*d.batchOut\n\n                #scale layer use activation memory and does multiplies\n                when \"scale\"\n                    #dimensions\n                    ## assume pass-through\n                    d.wOut = d.wIn\n                    d.hOut = d.hIn\n                    d.chOut = d.chIn\n                    #computation: scale = multiplication\n                    d.comp.macc = d.wOut*d.hOut*d.chOut*d.batchOut\n                    #memory\n                    d.mem.activation = d.wOut*d.hOut*d.chOut*d.batchOut\n\n                #implicit layers use activation memory, but no computation\n                when \"implicit\"\n                    #dimensions\n                    #fix potentially undefined inputs\n                    d.wIn = d.wIn ? \"?\"\n                    d.hIn = d.hIn ? \"?\"\n                    d.chIn = d.chIn ? \"?\"\n                    d.batchIn = d.batchIn ? \"?\"\n                    ## assume pass-through\n                    d.wOut = d.wIn\n                    d.hOut = d.hIn\n                    d.chOut = d.chIn\n                    d.batchOut = d.batchIn\n                    #computation\n                    # --none\n                    #memory\n                    d.mem.activation = d.wOut*d.hOut*d.chOut*d.batchOut\n                    d.mem.activation = 0 if isNaN(d.mem.activation)\n\n                # accuracy layers just pass through\n                when \"accuracy\"\n                    #dimensions\n                    ## assume pass-through\n                    d.wOut = d.wIn\n                    d.hOut = d.hIn\n                    d.chOut = d.chIn\n                    #computation\n                    # --none\n                    #memory\n                    # --none\n\n                # power layers: computes outputs y = (shift + scale * x) ^ power\n                when \"power\"\n                    params = n.attribs.power_param\n                    power = params.power ? 1\n                    scale = params.scale ? 1\n                    shift = params.shift ? 0\n                    #dimensions: pass-through\n                    d.wOut = d.wIn\n                    d.hOut = d.hIn\n                    d.chOut = d.chIn\n                    #computation\n                    n_elements = d.wOut * d.hOut * d.chOut\n                    d.comp.macc = if scale != 1 then n_elements else 0\n                    d.comp.add = if shift != 0 then n_elements else 0\n                    d.comp.exp = if power != 1 then n_elements else 0\n                    #memory\n                    d.mem.activation = n_elements\n\n                # permute layers reorder the channels / dimensions\n                when \"permute\"\n                    permutation = n.attribs.permute_param.order.slice(0) #copy array\n                    #dimension order: [batch, channels, height, width] according to http://caffe.berkeleyvision.org/tutorial/layers.html\n                    dim_in = [d.batchIn, d.chIn, d.hIn, d.wIn]\n                    d.batchOut = dim_in[permutation[0]];\n                    d.chOut    = dim_in[permutation[1]];\n                    d.hOut     = dim_in[permutation[2]];\n                    d.wOut     = dim_in[permutation[3]];\n                    #computation\n                    # --none\n                    #memory\n                    # --none\n\n                # generates prior boxes for SSD networks\n                when \"priorbox\"\n                    settings = n.attribs.prior_box_param\n                    aspect_ratios = settings.aspect_ratio\n                    num_priors = settings.min_size * settings.aspect_ratio\n                    if settings.flip then num_priors *= 2\n\n                    d.batchOut = d.batchIn\n                    d.chOut    = 2\n                    d.hOut     = 4\n                    d.wOut     = num_priors\n                    #computation\n                    # -- neglectable\n                    #memory\n                    # --neglectable\n\n                # reshape layers just permute dimensions, assume on-the-fly operation\n                when \"reshape\"\n                    #get reshape parameters\n                    newshape = n.attribs.reshape_param.shape.dim.slice(0) # copy array\n                    #debugger\n                    console.log(newshape);\n                    # 0 as dimension = inherit from input\n                    if (not newshape[0]) or (newshape[0] == 0) then newshape[0] = d.batchIn\n                    if (not newshape[1]) or (newshape[1] == 0) then newshape[1] = d.chIn\n                    if (not newshape[2]) or (newshape[2] == 0) then newshape[2] = d.hIn\n                    if (not newshape[3]) or (newshape[3] == 0) then newshape[3] = d.wIn\n                    # -1 as dimension = infer from other dimensions, allowed for at most 1 dimension\n                    prod_in_dims = d.batchIn * d.wIn * d.hIn * d.chIn\n                    prod_out_dims = newshape[0] * newshape[1] * newshape[2] * newshape[3] * (-1)# -1 compensates \"-1\" in newshape\n                    infered_dim = prod_in_dims / prod_out_dims\n                    if newshape[0] == -1 then newshape[0] = infered_dim\n                    if newshape[1] == -1 then newshape[1] = infered_dim\n                    if newshape[2] == -1 then newshape[2] = infered_dim\n                    if newshape[3] == -1 then newshape[3] = infered_dim\n                    # assign output dimensions\n                    d.batchOut = newshape[0]\n                    d.chOut    = newshape[1]\n                    d.hOut     = newshape[2]\n                    d.wOut     = newshape[3]\n                    #computation\n                    # --none (some shifting-around only)\n                    #memory\n\n                when \"python\"\n                    module = n.attribs.python_param.module\n\n                    if module == \"rpn.proposal_layer\"\n                        # ASSUME TEST.RPN_POST_NMS_TOP_N = 300\n                        num_region_proposals = 300 # see RPN_POST_NMS_TOP_N in lib/fast_rcnn/config.py\n\n                        #output dimensions:\n                        d.wOut = d.hOut = 1\n                        d.chOut = 5 # rectangle (x1, y1, x2, y2) (and image batch index n)\n                        d.batchOut = num_region_proposals\n\n                        #computation\n                        d.comp.div  = (num_region_proposals*(num_region_proposals-1))/2\n                        d.comp.macc = d.batchIn * (4+4) * 9*(d.wIn*d.hIn) + 2*(d.comp.div)\n                        d.comp.add  = d.batchIn * (8+2) * 9*(d.wIn*d.hIn) + 6*(d.comp.div)\n                        d.comp.comp = d.batchIn * (4+2) * 9*(d.wIn*d.hIn) + (9*(d.wIn*d.hIn))**2 + 7*(d.comp.div)\n                        d.comp.exp  = d.batchIn * (2) * 9*(d.wIn*d.hIn)\n                        #memory\n                        d.mem.activation = d.wOut*d.hOut*d.chOut*d.batchOut\n\n                    else\n                        onerror('Unknown Python Layer: '+module)\n                        console.log(n)\n                        debugger;\n\n                  when \"roipooling\"\n                      # 2 parent layers: region proposals, feature vectors\n                      roi_proposals = if (n.parents[0].analysis.batchOut > 1) then n.parents[0].analysis else n.parents[1].analysis # parent with batchOut > 1 = region proposals\n                      feature_map   = if (n.parents[0].analysis.batchOut > 1) then n.parents[1].analysis else n.parents[0].analysis # features = the other one\n                      # Input / Output dimensions\n                      d.chIn = d.chOut = feature_map.chIn\n                      d.hIn = feature_map.hIn\n                      d.wIn = feature_map.wIn\n                      d.hOut  = n.attribs.roi_pooling_param.pooled_h\n                      d.wOut  = n.attribs.roi_pooling_param.pooled_w\n                      d.batchIn = d.batchOut = roi_proposals.batchOut\n                      #spatial_scale = n.attribs.roi_pooling_param.spatial_scale\n                      #computation\n                      d.comp.add = d.batchOut\n                      d.comp.div = d.batchOut\n                      d.comp.macc = d.batchOut\n                      d.comp.comp = d.batchOut * d.chIn * d.wIn * d.hIn\n                      #memory\n                      d.mem.activation = d.wOut*d.hOut*d.chOut*d.batchOut\n\n                else # unknown layer;  print error message;\n                    onerror('Unknown Layer: '+layertype)\n                    console.log(n)\n                    debugger;\n\n            # add dimensions to node attributes so they show in graph tooltips\n            trivial_layers = [\"softmax\", \"softmaxwithloss\", \"softmax_loss\", \"dropout\", \"concat\", \"accuracy\"]\n            if not ($.inArray(layertype, trivial_layers) >= 0)\n                summary = {\n                    in: \"#{d.chIn}ch ⋅ #{d.wIn}×#{d.hIn} (×#{d.batchIn})\",\n                    out: \"#{d.chOut}ch ⋅ #{d.wOut}×#{d.hOut} (×#{d.batchOut})\" }\n                # concat number of required operations into string\n                ops = (val+'⋅'+key for key,val of d.comp when val isnt 0).join(', ')\n                #debugger\n                summary.ops = ops if ops != \"\"\n                # concat memory requirements into string\n                mem = (val+'⋅'+key for key,val of d.mem when val isnt 0).join(', ')\n                summary.mem = mem if mem != \"\"\n                # attach\n                _.extend(n.attribs, {analysis: summary});\n\n        return net\n"
  },
  {
    "path": "src/app.coffee",
    "content": "Renderer    = require './renderer.coffee'\nEditor      = require './editor.coffee'\n\nmodule.exports =\nclass AppController\n    constructor: ->\n        @inProgress = false\n        @$spinner   = $('#net-spinner')\n        @$netBox    = $('#net-container')\n        @$netError  = $('#net-error')\n        @svg        = '#net-svg'\n        @$tableBox  = $('#table-container')\n        @table      = '#table-content'\n        @setupErrorHandler()\n\n    startLoading: (loaderFunc, loader, args...) ->\n        if @inProgress\n            return\n        @$netError.hide()\n        @$netBox.hide()\n        @$tableBox.hide()\n        @$spinner.show()\n        loaderFunc args..., (net) => @completeLoading(net, loader)\n\n    completeLoading: (net, loader) ->\n        @$spinner.hide()\n\n        $('#net-title').html(net.name.replace(/_/g, ' '))\n\n        $('title').text(net.name.replace(/_/g, ' ')+' — Netscope CNN Analyzer')\n        editlink = $(\"<a>(edit)</a>\").addClass(\"editlink\")\n        editlink.appendTo $('#net-title')\n        editlink.click( => @showEditor(loader))\n\n        @$netBox.show()\n        @$tableBox.show()\n        $(@svg).empty()\n        $('.qtip').remove()\n        @renderer = new Renderer net, @svg, @table\n\n        if not window.do_variants_analysis\n            $(\"<br>\").appendTo @table \n            extendlink = $('<a>Excel-compatible Analysis Results (experimental)</a>')\n            extendlink.click( => \n                window.do_variants_analysis = true\n                @renderer.renderTable()\n            )\n            extendlink.appendTo @table \n\n        @inProgress = false\n\n    makeLoader: (loaderFunc, loader) ->\n        (args...) =>\n            @startLoading loaderFunc, loader, args...\n\n    showEditor: (loader) ->\n        # Display the editor by lazily loading CodeMirror.\n        # loader is an instance of a Loader.\n        if(_.isUndefined(window.CodeMirror))\n            $.getScript 'assets/js/lib/codemirror.min.js', =>\n                @netEditor = new Editor(@makeLoader(loader.load, loader), loader)\n        else\n            @netEditor.reload(loader.load, loader)\n\n    setupErrorHandler: ->\n        window.onerror = (message, filename, lineno, colno, e) =>\n            msg = message\n            if not (_.isUndefined(e) || _.isUndefined(e.line) || _.isUndefined(e.column))\n                msg = _.template('Line ${line}, Column ${column}: ${message}')(e)\n            @$spinner.hide()\n            $('.msg', @$netError).html(msg);\n            @$netError.show()\n            @inProgress = false\n\n"
  },
  {
    "path": "src/caffe/caffe.coffee",
    "content": "Parser   = require './parser'\nNetwork  = require '../network.coffee'\nAnalyzer = require '../analyzer.coffee'\n\ngenerateLayers = (descriptors, phase) ->\n    phase ?= 'train'\n    layers = []\n    for entry in descriptors\n        # Support the deprecated Caffe 'layers' key as well.\n        layerDesc = entry.layer or entry.layers\n        if layerDesc?\n            layer = {}\n            headerKeys = ['name', 'type', 'top', 'bottom']\n            _.extend layer, _.pick(layerDesc, headerKeys)\n            layer.attribs = _.omit layerDesc, headerKeys\n            layers.push layer\n        else\n            console.log 'Unidentified entry ignored: ', entry\n    layers = _.filter layers, (layer) ->\n        layerPhase = layer.attribs.include?.phase\n        not (layerPhase? and layerPhase!=phase)\n    return layers\n\ngenerateNetwork = (layers, header) ->\n    nodeTable = {}\n    implicitLayers = []\n    net = new Network header.name\n    getSingleNode = (name) =>\n        node = nodeTable[name]\n        # Caffe allows top to be a layer which isn't explicitly\n        # defined. Create an implicit layer if this is detected.\n        if not node?\n            debugger\n            node = net.createNode name, 'implicit'\n            nodeTable[name] = node\n        return node\n    getNodes = (names, exclude) =>\n        names = [].concat names\n        if exclude?\n            _.pullAll names, exclude\n        _.map names, getSingleNode\n    # Build the node LUT.\n    for layer in layers\n        nodeTable[layer.name] = net.createNode layer.name, layer.type, layer.attribs, {}\n    # Connect layers.\n    inplaceTable = {}\n    for layer in layers\n        node = nodeTable[layer.name]\n        if layer.top?\n            if layer.top==layer.bottom\n                # This is an inplace node. We will treat this specially.\n                # Note that this would have otherwise introduced a cycle,\n                # violating the requirements of a DAG.\n                if not inplaceTable[layer.top]?\n                    inplaceTable[layer.top] = []\n                inplaceTable[layer.top].push node\n                continue\n            else\n                node.addChildren getNodes(layer.top, [layer.name])\n        if layer.bottom?\n            node.addParents getNodes(layer.bottom, [].concat layer.top)\n    # Splice in the inplace nodes.\n    for own k, inplaceOps of inplaceTable\n        curNode = nodeTable[k]\n        curNode.coalesce = inplaceOps\n        children = curNode.detachChildren()\n        for inplaceChild in inplaceOps\n            inplaceChild.annotation = 'InPlace'\n            curNode.addChild inplaceChild\n            curNode = inplaceChild\n        curNode.addChildren children\n    # Patch in data layer parameters.\n    if header?.input? and (header?.input_dim? or header?.input_shape?.dim?)\n        inputs = [].concat header.input\n        dims = header.input_dim or header.input_shape.dim\n        if inputs.length==(dims.length*0.25)\n            for input, i in inputs\n                dataNode = nodeTable[input]\n                dataNode.type = 'data'\n                dataNode.attribs.input_param = {\n                    shape: {\n                        dim: dims.slice i*4, (i+1)*4\n                    }\n                }\n        else\n            console.log 'Inconsistent input dimensions.'\n    return net\n\nmodule.exports =\nclass CaffeParser\n    @parse : (txt, phase) ->\n        [header, layerDesc] = Parser.parse txt\n        # if header is already a layer instead of a 'global header' with network name etc...:\n        if header.layer\n            layerDesc.unshift header\n            header = {name: 'Unnamed Network'}\n        # extract input_shape field from layerDesc to header\n        if layerDesc[0].input_dim? or layerDesc[0].input_shape?\n            _.extend(header,layerDesc[0])\n        layers = generateLayers layerDesc, phase\n        network = generateNetwork layers, header\n        NetworkAnalyzer = new Analyzer()\n        network = NetworkAnalyzer.analyze network\n        return network\n"
  },
  {
    "path": "src/caffe/grammar/proto.pegjs",
    "content": "Proto_text\n  = wsc doc:doc wsc { return doc; }\n\nws \"whitespace\"\n  = [ \\t\\n\\r]*\n\nwsc \"whitespace or comment\"\n  = ws (comment)* ws\n\ndoc\n  = first:value\n    rest:(wsc v:value { return v; })*\n\nvalue\n  = object\n  / pairs\n\ncomment \"comment\"\n  = ws \"#\" (!LineTerminator .)*\n\npairs\n  = first:pair\n    rest:(wsc m:pair { return m; })*\n    {\n      var result = {};\n      var kvPairs = [first].concat(rest);\n      for (var i = 0; i < kvPairs.length; i++)\n      {\n        var k = kvPairs[i].key;\n        var v = kvPairs[i].value;\n        if(k in result)\n        {\n          result[k] = [].concat(result[k]);\n          result[k].push(v);\n      }\n        else\n        {\n          result[k] = v;\n        }\n      }\n      return result;\n  }\n\npair\n  = key:key ws \":\" ws value:(string / number / key / list )\n  {\n    return {key: key, value: value};\n  }\n\nlist\n  = \"[\"\n    entries:(ws v:(string / number) ws \",\"? { return v; })*\n    ws \"]\"\n    {\n      return entries;\n    }\n\nobject\n  = key:key ws \":\"? ws \"{\" wsc\n    first:(member)?\n    rest:(wsc m:member { return m; })*\n    wsc \"}\" wsc\n    {\n      var elems = [first].concat(rest);\n      var merged = {};\n      for (var i = 0; i < elems.length; ++i)\n      {\n          for(var k in elems[i])\n          {\n              merged[k] = elems[i][k];\n          }\n      }\n      var result = {};\n      result[key] = merged;\n      return result;\n    }\n\nmember\n  = (comment / pairs / object )\n\nnumber \"number\"\n  = minus? int frac? exp? { return parseFloat(text()); }\n\nexp\n  = [eE] (minus / plus)? Digit+\n\nfrac\n  = \".\" Digit+\n\nint\n  = \"0\" / ([1-9] Digit*)\n\nminus\n  = \"-\"\n\nplus\n  = \"+\"\n\nstring\n  = sstring\n  / dstring\n\nsstring\n  = \"'\" chars:schar* \"'\" { return chars.join(\"\"); }\n\ndstring\n  = '\"' chars:dchar* '\"' { return chars.join(\"\"); }\n\nkey \"key\"\n  = chars:[a-zA-Z0-9_-]+ { return chars.join(\"\").toLowerCase(); }\n\ndchar \"double-quoted string character\"\n  = [\\x20-\\x21\\x23-\\x5B\\x5D-\\u10FFFF]\n  / echar\n\nschar \"single-quoted string character\"\n  = [\\x20-\\x26\\x28-\\x5B\\x5D-\\u10FFFF]\n  / echar\n\nechar \"escaped character sequence\"\n  = \"\\\\\"\n    sequence:(\n    '\"'\n    / \"'\"\n    / \"\\\\\"\n    / \"/\"\n    / \"b\" { return \"\\b\"; }\n    / \"f\" { return \"\\f\"; }\n    / \"n\" { return \"\\n\"; }\n    / \"r\" { return \"\\r\"; }\n    / \"t\" { return \"\\t\"; }\n    / \"u\" digits:$(HexDigit HexDigit HexDigit HexDigit)\n      {\n        return String.fromCharCode(parseInt(digits, 16));\n      }\n    )\n  {\n    return sequence;\n  }\n\nDigit\n  = [0-9]\n\nHexDigit\n  = [0-9a-f]i\n\nLineTerminator\n  = [\\n\\r\\u2028\\u2029]"
  },
  {
    "path": "src/caffe/parser.js",
    "content": "module.exports = (function() {\n  \"use strict\";\n\n  function peg$subclass(child, parent) {\n    function ctor() { this.constructor = child; }\n    ctor.prototype = parent.prototype;\n    child.prototype = new ctor();\n  }\n\n  function peg$SyntaxError(message, expected, found, location) {\n    this.message  = message;\n    this.expected = expected;\n    this.found    = found;\n    this.location = location;\n    this.name     = \"SyntaxError\";\n\n    if (typeof Error.captureStackTrace === \"function\") {\n      Error.captureStackTrace(this, peg$SyntaxError);\n    }\n  }\n\n  peg$subclass(peg$SyntaxError, Error);\n\n  function peg$parse(input) {\n    var options = arguments.length > 1 ? arguments[1] : {},\n        parser  = this,\n\n        peg$FAILED = {},\n\n        peg$startRuleFunctions = { Proto_text: peg$parseProto_text },\n        peg$startRuleFunction  = peg$parseProto_text,\n\n        peg$c0 = function(doc) { return doc; },\n        peg$c1 = { type: \"other\", description: \"whitespace\" },\n        peg$c2 = /^[ \\t\\n\\r]/,\n        peg$c3 = { type: \"class\", value: \"[ \\\\t\\\\n\\\\r]\", description: \"[ \\\\t\\\\n\\\\r]\" },\n        peg$c4 = { type: \"other\", description: \"whitespace or comment\" },\n        peg$c5 = function(first, v) { return v; },\n        peg$c6 = { type: \"other\", description: \"comment\" },\n        peg$c7 = \"#\",\n        peg$c8 = { type: \"literal\", value: \"#\", description: \"\\\"#\\\"\" },\n        peg$c9 = { type: \"any\", description: \"any character\" },\n        peg$c10 = function(first, m) { return m; },\n        peg$c11 = function(first, rest) {\n              var result = {};\n              var kvPairs = [first].concat(rest);\n              for (var i = 0; i < kvPairs.length; i++)\n              {\n                var k = kvPairs[i].key;\n                var v = kvPairs[i].value;\n                if(k in result)\n                {\n                  result[k] = [].concat(result[k]);\n                  result[k].push(v);\n              }\n                else\n                {\n                  result[k] = v;\n                }\n              }\n              return result;\n          },\n        peg$c12 = \":\",\n        peg$c13 = { type: \"literal\", value: \":\", description: \"\\\":\\\"\" },\n        peg$c14 = function(key, value) {\n            return {key: key, value: value};\n          },\n        peg$c15 = \"[\",\n        peg$c16 = { type: \"literal\", value: \"[\", description: \"\\\"[\\\"\" },\n        peg$c17 = \",\",\n        peg$c18 = { type: \"literal\", value: \",\", description: \"\\\",\\\"\" },\n        peg$c19 = function(v) { return v; },\n        peg$c20 = \"]\",\n        peg$c21 = { type: \"literal\", value: \"]\", description: \"\\\"]\\\"\" },\n        peg$c22 = function(entries) {\n              return entries;\n            },\n        peg$c23 = \"{\",\n        peg$c24 = { type: \"literal\", value: \"{\", description: \"\\\"{\\\"\" },\n        peg$c25 = function(key, first, m) { return m; },\n        peg$c26 = \"}\",\n        peg$c27 = { type: \"literal\", value: \"}\", description: \"\\\"}\\\"\" },\n        peg$c28 = function(key, first, rest) {\n              var elems = [first].concat(rest);\n              var merged = {};\n              for (var i = 0; i < elems.length; ++i)\n              {\n                  for(var k in elems[i])\n                  {\n                      merged[k] = elems[i][k];\n                  }\n              }\n              var result = {};\n              result[key] = merged;\n              return result;\n            },\n        peg$c29 = { type: \"other\", description: \"number\" },\n        peg$c30 = function() { return parseFloat(text()); },\n        peg$c31 = /^[eE]/,\n        peg$c32 = { type: \"class\", value: \"[eE]\", description: \"[eE]\" },\n        peg$c33 = \".\",\n        peg$c34 = { type: \"literal\", value: \".\", description: \"\\\".\\\"\" },\n        peg$c35 = \"0\",\n        peg$c36 = { type: \"literal\", value: \"0\", description: \"\\\"0\\\"\" },\n        peg$c37 = /^[1-9]/,\n        peg$c38 = { type: \"class\", value: \"[1-9]\", description: \"[1-9]\" },\n        peg$c39 = \"-\",\n        peg$c40 = { type: \"literal\", value: \"-\", description: \"\\\"-\\\"\" },\n        peg$c41 = \"+\",\n        peg$c42 = { type: \"literal\", value: \"+\", description: \"\\\"+\\\"\" },\n        peg$c43 = \"'\",\n        peg$c44 = { type: \"literal\", value: \"'\", description: \"\\\"'\\\"\" },\n        peg$c45 = function(chars) { return chars.join(\"\"); },\n        peg$c46 = \"\\\"\",\n        peg$c47 = { type: \"literal\", value: \"\\\"\", description: \"\\\"\\\\\\\"\\\"\" },\n        peg$c48 = { type: \"other\", description: \"key\" },\n        peg$c49 = /^[a-zA-Z0-9_\\-]/,\n        peg$c50 = { type: \"class\", value: \"[a-zA-Z0-9_-]\", description: \"[a-zA-Z0-9_-]\" },\n        peg$c51 = function(chars) { return chars.join(\"\").toLowerCase(); },\n        peg$c52 = { type: \"other\", description: \"double-quoted string character\" },\n        peg$c53 = /^[ -!#-[\\]-\\u10FFFF]/,\n        peg$c54 = { type: \"class\", value: \"[\\\\x20-\\\\x21\\\\x23-\\\\x5B\\\\x5D-\\\\u10FFFF]\", description: \"[\\\\x20-\\\\x21\\\\x23-\\\\x5B\\\\x5D-\\\\u10FFFF]\" },\n        peg$c55 = { type: \"other\", description: \"single-quoted string character\" },\n        peg$c56 = /^[ -&(-[\\]-\\u10FFFF]/,\n        peg$c57 = { type: \"class\", value: \"[\\\\x20-\\\\x26\\\\x28-\\\\x5B\\\\x5D-\\\\u10FFFF]\", description: \"[\\\\x20-\\\\x26\\\\x28-\\\\x5B\\\\x5D-\\\\u10FFFF]\" },\n        peg$c58 = { type: \"other\", description: \"escaped character sequence\" },\n        peg$c59 = \"\\\\\",\n        peg$c60 = { type: \"literal\", value: \"\\\\\", description: \"\\\"\\\\\\\\\\\"\" },\n        peg$c61 = \"/\",\n        peg$c62 = { type: \"literal\", value: \"/\", description: \"\\\"/\\\"\" },\n        peg$c63 = \"b\",\n        peg$c64 = { type: \"literal\", value: \"b\", description: \"\\\"b\\\"\" },\n        peg$c65 = function() { return \"\\b\"; },\n        peg$c66 = \"f\",\n        peg$c67 = { type: \"literal\", value: \"f\", description: \"\\\"f\\\"\" },\n        peg$c68 = function() { return \"\\f\"; },\n        peg$c69 = \"n\",\n        peg$c70 = { type: \"literal\", value: \"n\", description: \"\\\"n\\\"\" },\n        peg$c71 = function() { return \"\\n\"; },\n        peg$c72 = \"r\",\n        peg$c73 = { type: \"literal\", value: \"r\", description: \"\\\"r\\\"\" },\n        peg$c74 = function() { return \"\\r\"; },\n        peg$c75 = \"t\",\n        peg$c76 = { type: \"literal\", value: \"t\", description: \"\\\"t\\\"\" },\n        peg$c77 = function() { return \"\\t\"; },\n        peg$c78 = \"u\",\n        peg$c79 = { type: \"literal\", value: \"u\", description: \"\\\"u\\\"\" },\n        peg$c80 = function(digits) {\n                return String.fromCharCode(parseInt(digits, 16));\n              },\n        peg$c81 = function(sequence) {\n            return sequence;\n          },\n        peg$c82 = /^[0-9]/,\n        peg$c83 = { type: \"class\", value: \"[0-9]\", description: \"[0-9]\" },\n        peg$c84 = /^[0-9a-f]/i,\n        peg$c85 = { type: \"class\", value: \"[0-9a-f]i\", description: \"[0-9a-f]i\" },\n        peg$c86 = /^[\\n\\r\\u2028\\u2029]/,\n        peg$c87 = { type: \"class\", value: \"[\\\\n\\\\r\\\\u2028\\\\u2029]\", description: \"[\\\\n\\\\r\\\\u2028\\\\u2029]\" },\n\n        peg$currPos          = 0,\n        peg$savedPos         = 0,\n        peg$posDetailsCache  = [{ line: 1, column: 1, seenCR: false }],\n        peg$maxFailPos       = 0,\n        peg$maxFailExpected  = [],\n        peg$silentFails      = 0,\n\n        peg$result;\n\n    if (\"startRule\" in options) {\n      if (!(options.startRule in peg$startRuleFunctions)) {\n        throw new Error(\"Can't start parsing from rule \\\"\" + options.startRule + \"\\\".\");\n      }\n\n      peg$startRuleFunction = peg$startRuleFunctions[options.startRule];\n    }\n\n    function text() {\n      return input.substring(peg$savedPos, peg$currPos);\n    }\n\n    function location() {\n      return peg$computeLocation(peg$savedPos, peg$currPos);\n    }\n\n    function expected(description) {\n      throw peg$buildException(\n        null,\n        [{ type: \"other\", description: description }],\n        input.substring(peg$savedPos, peg$currPos),\n        peg$computeLocation(peg$savedPos, peg$currPos)\n      );\n    }\n\n    function error(message) {\n      throw peg$buildException(\n        message,\n        null,\n        input.substring(peg$savedPos, peg$currPos),\n        peg$computeLocation(peg$savedPos, peg$currPos)\n      );\n    }\n\n    function peg$computePosDetails(pos) {\n      var details = peg$posDetailsCache[pos],\n          p, ch;\n\n      if (details) {\n        return details;\n      } else {\n        p = pos - 1;\n        while (!peg$posDetailsCache[p]) {\n          p--;\n        }\n\n        details = peg$posDetailsCache[p];\n        details = {\n          line:   details.line,\n          column: details.column,\n          seenCR: details.seenCR\n        };\n\n        while (p < pos) {\n          ch = input.charAt(p);\n          if (ch === \"\\n\") {\n            if (!details.seenCR) { details.line++; }\n            details.column = 1;\n            details.seenCR = false;\n          } else if (ch === \"\\r\" || ch === \"\\u2028\" || ch === \"\\u2029\") {\n            details.line++;\n            details.column = 1;\n            details.seenCR = true;\n          } else {\n            details.column++;\n            details.seenCR = false;\n          }\n\n          p++;\n        }\n\n        peg$posDetailsCache[pos] = details;\n        return details;\n      }\n    }\n\n    function peg$computeLocation(startPos, endPos) {\n      var startPosDetails = peg$computePosDetails(startPos),\n          endPosDetails   = peg$computePosDetails(endPos);\n\n      return {\n        start: {\n          offset: startPos,\n          line:   startPosDetails.line,\n          column: startPosDetails.column\n        },\n        end: {\n          offset: endPos,\n          line:   endPosDetails.line,\n          column: endPosDetails.column\n        }\n      };\n    }\n\n    function peg$fail(expected) {\n      if (peg$currPos < peg$maxFailPos) { return; }\n\n      if (peg$currPos > peg$maxFailPos) {\n        peg$maxFailPos = peg$currPos;\n        peg$maxFailExpected = [];\n      }\n\n      peg$maxFailExpected.push(expected);\n    }\n\n    function peg$buildException(message, expected, found, location) {\n      function cleanupExpected(expected) {\n        var i = 1;\n\n        expected.sort(function(a, b) {\n          if (a.description < b.description) {\n            return -1;\n          } else if (a.description > b.description) {\n            return 1;\n          } else {\n            return 0;\n          }\n        });\n\n        while (i < expected.length) {\n          if (expected[i - 1] === expected[i]) {\n            expected.splice(i, 1);\n          } else {\n            i++;\n          }\n        }\n      }\n\n      function buildMessage(expected, found) {\n        function stringEscape(s) {\n          function hex(ch) { return ch.charCodeAt(0).toString(16).toUpperCase(); }\n\n          return s\n            .replace(/\\\\/g,   '\\\\\\\\')\n            .replace(/\"/g,    '\\\\\"')\n            .replace(/\\x08/g, '\\\\b')\n            .replace(/\\t/g,   '\\\\t')\n            .replace(/\\n/g,   '\\\\n')\n            .replace(/\\f/g,   '\\\\f')\n            .replace(/\\r/g,   '\\\\r')\n            .replace(/[\\x00-\\x07\\x0B\\x0E\\x0F]/g, function(ch) { return '\\\\x0' + hex(ch); })\n            .replace(/[\\x10-\\x1F\\x80-\\xFF]/g,    function(ch) { return '\\\\x'  + hex(ch); })\n            .replace(/[\\u0100-\\u0FFF]/g,         function(ch) { return '\\\\u0' + hex(ch); })\n            .replace(/[\\u1000-\\uFFFF]/g,         function(ch) { return '\\\\u'  + hex(ch); });\n        }\n\n        var expectedDescs = new Array(expected.length),\n            expectedDesc, foundDesc, i;\n\n        for (i = 0; i < expected.length; i++) {\n          expectedDescs[i] = expected[i].description;\n        }\n\n        expectedDesc = expected.length > 1\n          ? expectedDescs.slice(0, -1).join(\", \")\n              + \" or \"\n              + expectedDescs[expected.length - 1]\n          : expectedDescs[0];\n\n        foundDesc = found ? \"\\\"\" + stringEscape(found) + \"\\\"\" : \"end of input\";\n\n        return \"Expected \" + expectedDesc + \" but \" + foundDesc + \" found.\";\n      }\n\n      if (expected !== null) {\n        cleanupExpected(expected);\n      }\n\n      return new peg$SyntaxError(\n        message !== null ? message : buildMessage(expected, found),\n        expected,\n        found,\n        location\n      );\n    }\n\n    function peg$parseProto_text() {\n      var s0, s1, s2, s3;\n\n      s0 = peg$currPos;\n      s1 = peg$parsewsc();\n      if (s1 !== peg$FAILED) {\n        s2 = peg$parsedoc();\n        if (s2 !== peg$FAILED) {\n          s3 = peg$parsewsc();\n          if (s3 !== peg$FAILED) {\n            peg$savedPos = s0;\n            s1 = peg$c0(s2);\n            s0 = s1;\n          } else {\n            peg$currPos = s0;\n            s0 = peg$FAILED;\n          }\n        } else {\n          peg$currPos = s0;\n          s0 = peg$FAILED;\n        }\n      } else {\n        peg$currPos = s0;\n        s0 = peg$FAILED;\n      }\n\n      return s0;\n    }\n\n    function peg$parsews() {\n      var s0, s1;\n\n      peg$silentFails++;\n      s0 = [];\n      if (peg$c2.test(input.charAt(peg$currPos))) {\n        s1 = input.charAt(peg$currPos);\n        peg$currPos++;\n      } else {\n        s1 = peg$FAILED;\n        if (peg$silentFails === 0) { peg$fail(peg$c3); }\n      }\n      while (s1 !== peg$FAILED) {\n        s0.push(s1);\n        if (peg$c2.test(input.charAt(peg$currPos))) {\n          s1 = input.charAt(peg$currPos);\n          peg$currPos++;\n        } else {\n          s1 = peg$FAILED;\n          if (peg$silentFails === 0) { peg$fail(peg$c3); }\n        }\n      }\n      peg$silentFails--;\n      if (s0 === peg$FAILED) {\n        s1 = peg$FAILED;\n        if (peg$silentFails === 0) { peg$fail(peg$c1); }\n      }\n\n      return s0;\n    }\n\n    function peg$parsewsc() {\n      var s0, s1, s2, s3;\n\n      peg$silentFails++;\n      s0 = peg$currPos;\n      s1 = peg$parsews();\n      if (s1 !== peg$FAILED) {\n        s2 = [];\n        s3 = peg$parsecomment();\n        while (s3 !== peg$FAILED) {\n          s2.push(s3);\n          s3 = peg$parsecomment();\n        }\n        if (s2 !== peg$FAILED) {\n          s3 = peg$parsews();\n          if (s3 !== peg$FAILED) {\n            s1 = [s1, s2, s3];\n            s0 = s1;\n          } else {\n            peg$currPos = s0;\n            s0 = peg$FAILED;\n          }\n        } else {\n          peg$currPos = s0;\n          s0 = peg$FAILED;\n        }\n      } else {\n        peg$currPos = s0;\n        s0 = peg$FAILED;\n      }\n      peg$silentFails--;\n      if (s0 === peg$FAILED) {\n        s1 = peg$FAILED;\n        if (peg$silentFails === 0) { peg$fail(peg$c4); }\n      }\n\n      return s0;\n    }\n\n    function peg$parsedoc() {\n      var s0, s1, s2, s3, s4, s5;\n\n      s0 = peg$currPos;\n      s1 = peg$parsevalue();\n      if (s1 !== peg$FAILED) {\n        s2 = [];\n        s3 = peg$currPos;\n        s4 = peg$parsewsc();\n        if (s4 !== peg$FAILED) {\n          s5 = peg$parsevalue();\n          if (s5 !== peg$FAILED) {\n            peg$savedPos = s3;\n            s4 = peg$c5(s1, s5);\n            s3 = s4;\n          } else {\n            peg$currPos = s3;\n            s3 = peg$FAILED;\n          }\n        } else {\n          peg$currPos = s3;\n          s3 = peg$FAILED;\n        }\n        while (s3 !== peg$FAILED) {\n          s2.push(s3);\n          s3 = peg$currPos;\n          s4 = peg$parsewsc();\n          if (s4 !== peg$FAILED) {\n            s5 = peg$parsevalue();\n            if (s5 !== peg$FAILED) {\n              peg$savedPos = s3;\n              s4 = peg$c5(s1, s5);\n              s3 = s4;\n            } else {\n              peg$currPos = s3;\n              s3 = peg$FAILED;\n            }\n          } else {\n            peg$currPos = s3;\n            s3 = peg$FAILED;\n          }\n        }\n        if (s2 !== peg$FAILED) {\n          s1 = [s1, s2];\n          s0 = s1;\n        } else {\n          peg$currPos = s0;\n          s0 = peg$FAILED;\n        }\n      } else {\n        peg$currPos = s0;\n        s0 = peg$FAILED;\n      }\n\n      return s0;\n    }\n\n    function peg$parsevalue() {\n      var s0;\n\n      s0 = peg$parseobject();\n      if (s0 === peg$FAILED) {\n        s0 = peg$parsepairs();\n      }\n\n      return s0;\n    }\n\n    function peg$parsecomment() {\n      var s0, s1, s2, s3, s4, s5, s6;\n\n      peg$silentFails++;\n      s0 = peg$currPos;\n      s1 = peg$parsews();\n      if (s1 !== peg$FAILED) {\n        if (input.charCodeAt(peg$currPos) === 35) {\n          s2 = peg$c7;\n          peg$currPos++;\n        } else {\n          s2 = peg$FAILED;\n          if (peg$silentFails === 0) { peg$fail(peg$c8); }\n        }\n        if (s2 !== peg$FAILED) {\n          s3 = [];\n          s4 = peg$currPos;\n          s5 = peg$currPos;\n          peg$silentFails++;\n          s6 = peg$parseLineTerminator();\n          peg$silentFails--;\n          if (s6 === peg$FAILED) {\n            s5 = void 0;\n          } else {\n            peg$currPos = s5;\n            s5 = peg$FAILED;\n          }\n          if (s5 !== peg$FAILED) {\n            if (input.length > peg$currPos) {\n              s6 = input.charAt(peg$currPos);\n              peg$currPos++;\n            } else {\n              s6 = peg$FAILED;\n              if (peg$silentFails === 0) { peg$fail(peg$c9); }\n            }\n            if (s6 !== peg$FAILED) {\n              s5 = [s5, s6];\n              s4 = s5;\n            } else {\n              peg$currPos = s4;\n              s4 = peg$FAILED;\n            }\n          } else {\n            peg$currPos = s4;\n            s4 = peg$FAILED;\n          }\n          while (s4 !== peg$FAILED) {\n            s3.push(s4);\n            s4 = peg$currPos;\n            s5 = peg$currPos;\n            peg$silentFails++;\n            s6 = peg$parseLineTerminator();\n            peg$silentFails--;\n            if (s6 === peg$FAILED) {\n              s5 = void 0;\n            } else {\n              peg$currPos = s5;\n              s5 = peg$FAILED;\n            }\n            if (s5 !== peg$FAILED) {\n              if (input.length > peg$currPos) {\n                s6 = input.charAt(peg$currPos);\n                peg$currPos++;\n              } else {\n                s6 = peg$FAILED;\n                if (peg$silentFails === 0) { peg$fail(peg$c9); }\n              }\n              if (s6 !== peg$FAILED) {\n                s5 = [s5, s6];\n                s4 = s5;\n              } else {\n                peg$currPos = s4;\n                s4 = peg$FAILED;\n              }\n            } else {\n              peg$currPos = s4;\n              s4 = peg$FAILED;\n            }\n          }\n          if (s3 !== peg$FAILED) {\n            s1 = [s1, s2, s3];\n            s0 = s1;\n          } else {\n            peg$currPos = s0;\n            s0 = peg$FAILED;\n          }\n        } else {\n          peg$currPos = s0;\n          s0 = peg$FAILED;\n        }\n      } else {\n        peg$currPos = s0;\n        s0 = peg$FAILED;\n      }\n      peg$silentFails--;\n      if (s0 === peg$FAILED) {\n        s1 = peg$FAILED;\n        if (peg$silentFails === 0) { peg$fail(peg$c6); }\n      }\n\n      return s0;\n    }\n\n    function peg$parsepairs() {\n      var s0, s1, s2, s3, s4, s5;\n\n      s0 = peg$currPos;\n      s1 = peg$parsepair();\n      if (s1 !== peg$FAILED) {\n        s2 = [];\n        s3 = peg$currPos;\n        s4 = peg$parsewsc();\n        if (s4 !== peg$FAILED) {\n          s5 = peg$parsepair();\n          if (s5 !== peg$FAILED) {\n            peg$savedPos = s3;\n            s4 = peg$c10(s1, s5);\n            s3 = s4;\n          } else {\n            peg$currPos = s3;\n            s3 = peg$FAILED;\n          }\n        } else {\n          peg$currPos = s3;\n          s3 = peg$FAILED;\n        }\n        while (s3 !== peg$FAILED) {\n          s2.push(s3);\n          s3 = peg$currPos;\n          s4 = peg$parsewsc();\n          if (s4 !== peg$FAILED) {\n            s5 = peg$parsepair();\n            if (s5 !== peg$FAILED) {\n              peg$savedPos = s3;\n              s4 = peg$c10(s1, s5);\n              s3 = s4;\n            } else {\n              peg$currPos = s3;\n              s3 = peg$FAILED;\n            }\n          } else {\n            peg$currPos = s3;\n            s3 = peg$FAILED;\n          }\n        }\n        if (s2 !== peg$FAILED) {\n          peg$savedPos = s0;\n          s1 = peg$c11(s1, s2);\n          s0 = s1;\n        } else {\n          peg$currPos = s0;\n          s0 = peg$FAILED;\n        }\n      } else {\n        peg$currPos = s0;\n        s0 = peg$FAILED;\n      }\n\n      return s0;\n    }\n\n    function peg$parsepair() {\n      var s0, s1, s2, s3, s4, s5;\n\n      s0 = peg$currPos;\n      s1 = peg$parsekey();\n      if (s1 !== peg$FAILED) {\n        s2 = peg$parsews();\n        if (s2 !== peg$FAILED) {\n          if (input.charCodeAt(peg$currPos) === 58) {\n            s3 = peg$c12;\n            peg$currPos++;\n          } else {\n            s3 = peg$FAILED;\n            if (peg$silentFails === 0) { peg$fail(peg$c13); }\n          }\n          if (s3 !== peg$FAILED) {\n            s4 = peg$parsews();\n            if (s4 !== peg$FAILED) {\n              s5 = peg$parsestring();\n              if (s5 === peg$FAILED) {\n                s5 = peg$parsenumber();\n                if (s5 === peg$FAILED) {\n                  s5 = peg$parsekey();\n                  if (s5 === peg$FAILED) {\n                    s5 = peg$parselist();\n                  }\n                }\n              }\n              if (s5 !== peg$FAILED) {\n                peg$savedPos = s0;\n                s1 = peg$c14(s1, s5);\n                s0 = s1;\n              } else {\n                peg$currPos = s0;\n                s0 = peg$FAILED;\n              }\n            } else {\n              peg$currPos = s0;\n              s0 = peg$FAILED;\n            }\n          } else {\n            peg$currPos = s0;\n            s0 = peg$FAILED;\n          }\n        } else {\n          peg$currPos = s0;\n          s0 = peg$FAILED;\n        }\n      } else {\n        peg$currPos = s0;\n        s0 = peg$FAILED;\n      }\n\n      return s0;\n    }\n\n    function peg$parselist() {\n      var s0, s1, s2, s3, s4, s5, s6, s7;\n\n      s0 = peg$currPos;\n      if (input.charCodeAt(peg$currPos) === 91) {\n        s1 = peg$c15;\n        peg$currPos++;\n      } else {\n        s1 = peg$FAILED;\n        if (peg$silentFails === 0) { peg$fail(peg$c16); }\n      }\n      if (s1 !== peg$FAILED) {\n        s2 = [];\n        s3 = peg$currPos;\n        s4 = peg$parsews();\n        if (s4 !== peg$FAILED) {\n          s5 = peg$parsestring();\n          if (s5 === peg$FAILED) {\n            s5 = peg$parsenumber();\n          }\n          if (s5 !== peg$FAILED) {\n            s6 = peg$parsews();\n            if (s6 !== peg$FAILED) {\n              if (input.charCodeAt(peg$currPos) === 44) {\n                s7 = peg$c17;\n                peg$currPos++;\n              } else {\n                s7 = peg$FAILED;\n                if (peg$silentFails === 0) { peg$fail(peg$c18); }\n              }\n              if (s7 === peg$FAILED) {\n                s7 = null;\n              }\n              if (s7 !== peg$FAILED) {\n                peg$savedPos = s3;\n                s4 = peg$c19(s5);\n                s3 = s4;\n              } else {\n                peg$currPos = s3;\n                s3 = peg$FAILED;\n              }\n            } else {\n              peg$currPos = s3;\n              s3 = peg$FAILED;\n            }\n          } else {\n            peg$currPos = s3;\n            s3 = peg$FAILED;\n          }\n        } else {\n          peg$currPos = s3;\n          s3 = peg$FAILED;\n        }\n        while (s3 !== peg$FAILED) {\n          s2.push(s3);\n          s3 = peg$currPos;\n          s4 = peg$parsews();\n          if (s4 !== peg$FAILED) {\n            s5 = peg$parsestring();\n            if (s5 === peg$FAILED) {\n              s5 = peg$parsenumber();\n            }\n            if (s5 !== peg$FAILED) {\n              s6 = peg$parsews();\n              if (s6 !== peg$FAILED) {\n                if (input.charCodeAt(peg$currPos) === 44) {\n                  s7 = peg$c17;\n                  peg$currPos++;\n                } else {\n                  s7 = peg$FAILED;\n                  if (peg$silentFails === 0) { peg$fail(peg$c18); }\n                }\n                if (s7 === peg$FAILED) {\n                  s7 = null;\n                }\n                if (s7 !== peg$FAILED) {\n                  peg$savedPos = s3;\n                  s4 = peg$c19(s5);\n                  s3 = s4;\n                } else {\n                  peg$currPos = s3;\n                  s3 = peg$FAILED;\n                }\n              } else {\n                peg$currPos = s3;\n                s3 = peg$FAILED;\n              }\n            } else {\n              peg$currPos = s3;\n              s3 = peg$FAILED;\n            }\n          } else {\n            peg$currPos = s3;\n            s3 = peg$FAILED;\n          }\n        }\n        if (s2 !== peg$FAILED) {\n          s3 = peg$parsews();\n          if (s3 !== peg$FAILED) {\n            if (input.charCodeAt(peg$currPos) === 93) {\n              s4 = peg$c20;\n              peg$currPos++;\n            } else {\n              s4 = peg$FAILED;\n              if (peg$silentFails === 0) { peg$fail(peg$c21); }\n            }\n            if (s4 !== peg$FAILED) {\n              peg$savedPos = s0;\n              s1 = peg$c22(s2);\n              s0 = s1;\n            } else {\n              peg$currPos = s0;\n              s0 = peg$FAILED;\n            }\n          } else {\n            peg$currPos = s0;\n            s0 = peg$FAILED;\n          }\n        } else {\n          peg$currPos = s0;\n          s0 = peg$FAILED;\n        }\n      } else {\n        peg$currPos = s0;\n        s0 = peg$FAILED;\n      }\n\n      return s0;\n    }\n\n    function peg$parseobject() {\n      var s0, s1, s2, s3, s4, s5, s6, s7, s8, s9, s10, s11;\n\n      s0 = peg$currPos;\n      s1 = peg$parsekey();\n      if (s1 !== peg$FAILED) {\n        s2 = peg$parsews();\n        if (s2 !== peg$FAILED) {\n          if (input.charCodeAt(peg$currPos) === 58) {\n            s3 = peg$c12;\n            peg$currPos++;\n          } else {\n            s3 = peg$FAILED;\n            if (peg$silentFails === 0) { peg$fail(peg$c13); }\n          }\n          if (s3 === peg$FAILED) {\n            s3 = null;\n          }\n          if (s3 !== peg$FAILED) {\n            s4 = peg$parsews();\n            if (s4 !== peg$FAILED) {\n              if (input.charCodeAt(peg$currPos) === 123) {\n                s5 = peg$c23;\n                peg$currPos++;\n              } else {\n                s5 = peg$FAILED;\n                if (peg$silentFails === 0) { peg$fail(peg$c24); }\n              }\n              if (s5 !== peg$FAILED) {\n                s6 = peg$parsewsc();\n                if (s6 !== peg$FAILED) {\n                  s7 = peg$parsemember();\n                  if (s7 === peg$FAILED) {\n                    s7 = null;\n                  }\n                  if (s7 !== peg$FAILED) {\n                    s8 = [];\n                    s9 = peg$currPos;\n                    s10 = peg$parsewsc();\n                    if (s10 !== peg$FAILED) {\n                      s11 = peg$parsemember();\n                      if (s11 !== peg$FAILED) {\n                        peg$savedPos = s9;\n                        s10 = peg$c25(s1, s7, s11);\n                        s9 = s10;\n                      } else {\n                        peg$currPos = s9;\n                        s9 = peg$FAILED;\n                      }\n                    } else {\n                      peg$currPos = s9;\n                      s9 = peg$FAILED;\n                    }\n                    while (s9 !== peg$FAILED) {\n                      s8.push(s9);\n                      s9 = peg$currPos;\n                      s10 = peg$parsewsc();\n                      if (s10 !== peg$FAILED) {\n                        s11 = peg$parsemember();\n                        if (s11 !== peg$FAILED) {\n                          peg$savedPos = s9;\n                          s10 = peg$c25(s1, s7, s11);\n                          s9 = s10;\n                        } else {\n                          peg$currPos = s9;\n                          s9 = peg$FAILED;\n                        }\n                      } else {\n                        peg$currPos = s9;\n                        s9 = peg$FAILED;\n                      }\n                    }\n                    if (s8 !== peg$FAILED) {\n                      s9 = peg$parsewsc();\n                      if (s9 !== peg$FAILED) {\n                        if (input.charCodeAt(peg$currPos) === 125) {\n                          s10 = peg$c26;\n                          peg$currPos++;\n                        } else {\n                          s10 = peg$FAILED;\n                          if (peg$silentFails === 0) { peg$fail(peg$c27); }\n                        }\n                        if (s10 !== peg$FAILED) {\n                          s11 = peg$parsewsc();\n                          if (s11 !== peg$FAILED) {\n                            peg$savedPos = s0;\n                            s1 = peg$c28(s1, s7, s8);\n                            s0 = s1;\n                          } else {\n                            peg$currPos = s0;\n                            s0 = peg$FAILED;\n                          }\n                        } else {\n                          peg$currPos = s0;\n                          s0 = peg$FAILED;\n                        }\n                      } else {\n                        peg$currPos = s0;\n                        s0 = peg$FAILED;\n                      }\n                    } else {\n                      peg$currPos = s0;\n                      s0 = peg$FAILED;\n                    }\n                  } else {\n                    peg$currPos = s0;\n                    s0 = peg$FAILED;\n                  }\n                } else {\n                  peg$currPos = s0;\n                  s0 = peg$FAILED;\n                }\n              } else {\n                peg$currPos = s0;\n                s0 = peg$FAILED;\n              }\n            } else {\n              peg$currPos = s0;\n              s0 = peg$FAILED;\n            }\n          } else {\n            peg$currPos = s0;\n            s0 = peg$FAILED;\n          }\n        } else {\n          peg$currPos = s0;\n          s0 = peg$FAILED;\n        }\n      } else {\n        peg$currPos = s0;\n        s0 = peg$FAILED;\n      }\n\n      return s0;\n    }\n\n    function peg$parsemember() {\n      var s0;\n\n      s0 = peg$parsecomment();\n      if (s0 === peg$FAILED) {\n        s0 = peg$parsepairs();\n        if (s0 === peg$FAILED) {\n          s0 = peg$parseobject();\n        }\n      }\n\n      return s0;\n    }\n\n    function peg$parsenumber() {\n      var s0, s1, s2, s3, s4;\n\n      peg$silentFails++;\n      s0 = peg$currPos;\n      s1 = peg$parseminus();\n      if (s1 === peg$FAILED) {\n        s1 = null;\n      }\n      if (s1 !== peg$FAILED) {\n        s2 = peg$parseint();\n        if (s2 !== peg$FAILED) {\n          s3 = peg$parsefrac();\n          if (s3 === peg$FAILED) {\n            s3 = null;\n          }\n          if (s3 !== peg$FAILED) {\n            s4 = peg$parseexp();\n            if (s4 === peg$FAILED) {\n              s4 = null;\n            }\n            if (s4 !== peg$FAILED) {\n              peg$savedPos = s0;\n              s1 = peg$c30();\n              s0 = s1;\n            } else {\n              peg$currPos = s0;\n              s0 = peg$FAILED;\n            }\n          } else {\n            peg$currPos = s0;\n            s0 = peg$FAILED;\n          }\n        } else {\n          peg$currPos = s0;\n          s0 = peg$FAILED;\n        }\n      } else {\n        peg$currPos = s0;\n        s0 = peg$FAILED;\n      }\n      peg$silentFails--;\n      if (s0 === peg$FAILED) {\n        s1 = peg$FAILED;\n        if (peg$silentFails === 0) { peg$fail(peg$c29); }\n      }\n\n      return s0;\n    }\n\n    function peg$parseexp() {\n      var s0, s1, s2, s3, s4;\n\n      s0 = peg$currPos;\n      if (peg$c31.test(input.charAt(peg$currPos))) {\n        s1 = input.charAt(peg$currPos);\n        peg$currPos++;\n      } else {\n        s1 = peg$FAILED;\n        if (peg$silentFails === 0) { peg$fail(peg$c32); }\n      }\n      if (s1 !== peg$FAILED) {\n        s2 = peg$parseminus();\n        if (s2 === peg$FAILED) {\n          s2 = peg$parseplus();\n        }\n        if (s2 === peg$FAILED) {\n          s2 = null;\n        }\n        if (s2 !== peg$FAILED) {\n          s3 = [];\n          s4 = peg$parseDigit();\n          if (s4 !== peg$FAILED) {\n            while (s4 !== peg$FAILED) {\n              s3.push(s4);\n              s4 = peg$parseDigit();\n            }\n          } else {\n            s3 = peg$FAILED;\n          }\n          if (s3 !== peg$FAILED) {\n            s1 = [s1, s2, s3];\n            s0 = s1;\n          } else {\n            peg$currPos = s0;\n            s0 = peg$FAILED;\n          }\n        } else {\n          peg$currPos = s0;\n          s0 = peg$FAILED;\n        }\n      } else {\n        peg$currPos = s0;\n        s0 = peg$FAILED;\n      }\n\n      return s0;\n    }\n\n    function peg$parsefrac() {\n      var s0, s1, s2, s3;\n\n      s0 = peg$currPos;\n      if (input.charCodeAt(peg$currPos) === 46) {\n        s1 = peg$c33;\n        peg$currPos++;\n      } else {\n        s1 = peg$FAILED;\n        if (peg$silentFails === 0) { peg$fail(peg$c34); }\n      }\n      if (s1 !== peg$FAILED) {\n        s2 = [];\n        s3 = peg$parseDigit();\n        if (s3 !== peg$FAILED) {\n          while (s3 !== peg$FAILED) {\n            s2.push(s3);\n            s3 = peg$parseDigit();\n          }\n        } else {\n          s2 = peg$FAILED;\n        }\n        if (s2 !== peg$FAILED) {\n          s1 = [s1, s2];\n          s0 = s1;\n        } else {\n          peg$currPos = s0;\n          s0 = peg$FAILED;\n        }\n      } else {\n        peg$currPos = s0;\n        s0 = peg$FAILED;\n      }\n\n      return s0;\n    }\n\n    function peg$parseint() {\n      var s0, s1, s2, s3;\n\n      if (input.charCodeAt(peg$currPos) === 48) {\n        s0 = peg$c35;\n        peg$currPos++;\n      } else {\n        s0 = peg$FAILED;\n        if (peg$silentFails === 0) { peg$fail(peg$c36); }\n      }\n      if (s0 === peg$FAILED) {\n        s0 = peg$currPos;\n        if (peg$c37.test(input.charAt(peg$currPos))) {\n          s1 = input.charAt(peg$currPos);\n          peg$currPos++;\n        } else {\n          s1 = peg$FAILED;\n          if (peg$silentFails === 0) { peg$fail(peg$c38); }\n        }\n        if (s1 !== peg$FAILED) {\n          s2 = [];\n          s3 = peg$parseDigit();\n          while (s3 !== peg$FAILED) {\n            s2.push(s3);\n            s3 = peg$parseDigit();\n          }\n          if (s2 !== peg$FAILED) {\n            s1 = [s1, s2];\n            s0 = s1;\n          } else {\n            peg$currPos = s0;\n            s0 = peg$FAILED;\n          }\n        } else {\n          peg$currPos = s0;\n          s0 = peg$FAILED;\n        }\n      }\n\n      return s0;\n    }\n\n    function peg$parseminus() {\n      var s0;\n\n      if (input.charCodeAt(peg$currPos) === 45) {\n        s0 = peg$c39;\n        peg$currPos++;\n      } else {\n        s0 = peg$FAILED;\n        if (peg$silentFails === 0) { peg$fail(peg$c40); }\n      }\n\n      return s0;\n    }\n\n    function peg$parseplus() {\n      var s0;\n\n      if (input.charCodeAt(peg$currPos) === 43) {\n        s0 = peg$c41;\n        peg$currPos++;\n      } else {\n        s0 = peg$FAILED;\n        if (peg$silentFails === 0) { peg$fail(peg$c42); }\n      }\n\n      return s0;\n    }\n\n    function peg$parsestring() {\n      var s0;\n\n      s0 = peg$parsesstring();\n      if (s0 === peg$FAILED) {\n        s0 = peg$parsedstring();\n      }\n\n      return s0;\n    }\n\n    function peg$parsesstring() {\n      var s0, s1, s2, s3;\n\n      s0 = peg$currPos;\n      if (input.charCodeAt(peg$currPos) === 39) {\n        s1 = peg$c43;\n        peg$currPos++;\n      } else {\n        s1 = peg$FAILED;\n        if (peg$silentFails === 0) { peg$fail(peg$c44); }\n      }\n      if (s1 !== peg$FAILED) {\n        s2 = [];\n        s3 = peg$parseschar();\n        while (s3 !== peg$FAILED) {\n          s2.push(s3);\n          s3 = peg$parseschar();\n        }\n        if (s2 !== peg$FAILED) {\n          if (input.charCodeAt(peg$currPos) === 39) {\n            s3 = peg$c43;\n            peg$currPos++;\n          } else {\n            s3 = peg$FAILED;\n            if (peg$silentFails === 0) { peg$fail(peg$c44); }\n          }\n          if (s3 !== peg$FAILED) {\n            peg$savedPos = s0;\n            s1 = peg$c45(s2);\n            s0 = s1;\n          } else {\n            peg$currPos = s0;\n            s0 = peg$FAILED;\n          }\n        } else {\n          peg$currPos = s0;\n          s0 = peg$FAILED;\n        }\n      } else {\n        peg$currPos = s0;\n        s0 = peg$FAILED;\n      }\n\n      return s0;\n    }\n\n    function peg$parsedstring() {\n      var s0, s1, s2, s3;\n\n      s0 = peg$currPos;\n      if (input.charCodeAt(peg$currPos) === 34) {\n        s1 = peg$c46;\n        peg$currPos++;\n      } else {\n        s1 = peg$FAILED;\n        if (peg$silentFails === 0) { peg$fail(peg$c47); }\n      }\n      if (s1 !== peg$FAILED) {\n        s2 = [];\n        s3 = peg$parsedchar();\n        while (s3 !== peg$FAILED) {\n          s2.push(s3);\n          s3 = peg$parsedchar();\n        }\n        if (s2 !== peg$FAILED) {\n          if (input.charCodeAt(peg$currPos) === 34) {\n            s3 = peg$c46;\n            peg$currPos++;\n          } else {\n            s3 = peg$FAILED;\n            if (peg$silentFails === 0) { peg$fail(peg$c47); }\n          }\n          if (s3 !== peg$FAILED) {\n            peg$savedPos = s0;\n            s1 = peg$c45(s2);\n            s0 = s1;\n          } else {\n            peg$currPos = s0;\n            s0 = peg$FAILED;\n          }\n        } else {\n          peg$currPos = s0;\n          s0 = peg$FAILED;\n        }\n      } else {\n        peg$currPos = s0;\n        s0 = peg$FAILED;\n      }\n\n      return s0;\n    }\n\n    function peg$parsekey() {\n      var s0, s1, s2;\n\n      peg$silentFails++;\n      s0 = peg$currPos;\n      s1 = [];\n      if (peg$c49.test(input.charAt(peg$currPos))) {\n        s2 = input.charAt(peg$currPos);\n        peg$currPos++;\n      } else {\n        s2 = peg$FAILED;\n        if (peg$silentFails === 0) { peg$fail(peg$c50); }\n      }\n      if (s2 !== peg$FAILED) {\n        while (s2 !== peg$FAILED) {\n          s1.push(s2);\n          if (peg$c49.test(input.charAt(peg$currPos))) {\n            s2 = input.charAt(peg$currPos);\n            peg$currPos++;\n          } else {\n            s2 = peg$FAILED;\n            if (peg$silentFails === 0) { peg$fail(peg$c50); }\n          }\n        }\n      } else {\n        s1 = peg$FAILED;\n      }\n      if (s1 !== peg$FAILED) {\n        peg$savedPos = s0;\n        s1 = peg$c51(s1);\n      }\n      s0 = s1;\n      peg$silentFails--;\n      if (s0 === peg$FAILED) {\n        s1 = peg$FAILED;\n        if (peg$silentFails === 0) { peg$fail(peg$c48); }\n      }\n\n      return s0;\n    }\n\n    function peg$parsedchar() {\n      var s0, s1;\n\n      peg$silentFails++;\n      if (peg$c53.test(input.charAt(peg$currPos))) {\n        s0 = input.charAt(peg$currPos);\n        peg$currPos++;\n      } else {\n        s0 = peg$FAILED;\n        if (peg$silentFails === 0) { peg$fail(peg$c54); }\n      }\n      if (s0 === peg$FAILED) {\n        s0 = peg$parseechar();\n      }\n      peg$silentFails--;\n      if (s0 === peg$FAILED) {\n        s1 = peg$FAILED;\n        if (peg$silentFails === 0) { peg$fail(peg$c52); }\n      }\n\n      return s0;\n    }\n\n    function peg$parseschar() {\n      var s0, s1;\n\n      peg$silentFails++;\n      if (peg$c56.test(input.charAt(peg$currPos))) {\n        s0 = input.charAt(peg$currPos);\n        peg$currPos++;\n      } else {\n        s0 = peg$FAILED;\n        if (peg$silentFails === 0) { peg$fail(peg$c57); }\n      }\n      if (s0 === peg$FAILED) {\n        s0 = peg$parseechar();\n      }\n      peg$silentFails--;\n      if (s0 === peg$FAILED) {\n        s1 = peg$FAILED;\n        if (peg$silentFails === 0) { peg$fail(peg$c55); }\n      }\n\n      return s0;\n    }\n\n    function peg$parseechar() {\n      var s0, s1, s2, s3, s4, s5, s6, s7, s8, s9;\n\n      peg$silentFails++;\n      s0 = peg$currPos;\n      if (input.charCodeAt(peg$currPos) === 92) {\n        s1 = peg$c59;\n        peg$currPos++;\n      } else {\n        s1 = peg$FAILED;\n        if (peg$silentFails === 0) { peg$fail(peg$c60); }\n      }\n      if (s1 !== peg$FAILED) {\n        if (input.charCodeAt(peg$currPos) === 34) {\n          s2 = peg$c46;\n          peg$currPos++;\n        } else {\n          s2 = peg$FAILED;\n          if (peg$silentFails === 0) { peg$fail(peg$c47); }\n        }\n        if (s2 === peg$FAILED) {\n          if (input.charCodeAt(peg$currPos) === 39) {\n            s2 = peg$c43;\n            peg$currPos++;\n          } else {\n            s2 = peg$FAILED;\n            if (peg$silentFails === 0) { peg$fail(peg$c44); }\n          }\n          if (s2 === peg$FAILED) {\n            if (input.charCodeAt(peg$currPos) === 92) {\n              s2 = peg$c59;\n              peg$currPos++;\n            } else {\n              s2 = peg$FAILED;\n              if (peg$silentFails === 0) { peg$fail(peg$c60); }\n            }\n            if (s2 === peg$FAILED) {\n              if (input.charCodeAt(peg$currPos) === 47) {\n                s2 = peg$c61;\n                peg$currPos++;\n              } else {\n                s2 = peg$FAILED;\n                if (peg$silentFails === 0) { peg$fail(peg$c62); }\n              }\n              if (s2 === peg$FAILED) {\n                s2 = peg$currPos;\n                if (input.charCodeAt(peg$currPos) === 98) {\n                  s3 = peg$c63;\n                  peg$currPos++;\n                } else {\n                  s3 = peg$FAILED;\n                  if (peg$silentFails === 0) { peg$fail(peg$c64); }\n                }\n                if (s3 !== peg$FAILED) {\n                  peg$savedPos = s2;\n                  s3 = peg$c65();\n                }\n                s2 = s3;\n                if (s2 === peg$FAILED) {\n                  s2 = peg$currPos;\n                  if (input.charCodeAt(peg$currPos) === 102) {\n                    s3 = peg$c66;\n                    peg$currPos++;\n                  } else {\n                    s3 = peg$FAILED;\n                    if (peg$silentFails === 0) { peg$fail(peg$c67); }\n                  }\n                  if (s3 !== peg$FAILED) {\n                    peg$savedPos = s2;\n                    s3 = peg$c68();\n                  }\n                  s2 = s3;\n                  if (s2 === peg$FAILED) {\n                    s2 = peg$currPos;\n                    if (input.charCodeAt(peg$currPos) === 110) {\n                      s3 = peg$c69;\n                      peg$currPos++;\n                    } else {\n                      s3 = peg$FAILED;\n                      if (peg$silentFails === 0) { peg$fail(peg$c70); }\n                    }\n                    if (s3 !== peg$FAILED) {\n                      peg$savedPos = s2;\n                      s3 = peg$c71();\n                    }\n                    s2 = s3;\n                    if (s2 === peg$FAILED) {\n                      s2 = peg$currPos;\n                      if (input.charCodeAt(peg$currPos) === 114) {\n                        s3 = peg$c72;\n                        peg$currPos++;\n                      } else {\n                        s3 = peg$FAILED;\n                        if (peg$silentFails === 0) { peg$fail(peg$c73); }\n                      }\n                      if (s3 !== peg$FAILED) {\n                        peg$savedPos = s2;\n                        s3 = peg$c74();\n                      }\n                      s2 = s3;\n                      if (s2 === peg$FAILED) {\n                        s2 = peg$currPos;\n                        if (input.charCodeAt(peg$currPos) === 116) {\n                          s3 = peg$c75;\n                          peg$currPos++;\n                        } else {\n                          s3 = peg$FAILED;\n                          if (peg$silentFails === 0) { peg$fail(peg$c76); }\n                        }\n                        if (s3 !== peg$FAILED) {\n                          peg$savedPos = s2;\n                          s3 = peg$c77();\n                        }\n                        s2 = s3;\n                        if (s2 === peg$FAILED) {\n                          s2 = peg$currPos;\n                          if (input.charCodeAt(peg$currPos) === 117) {\n                            s3 = peg$c78;\n                            peg$currPos++;\n                          } else {\n                            s3 = peg$FAILED;\n                            if (peg$silentFails === 0) { peg$fail(peg$c79); }\n                          }\n                          if (s3 !== peg$FAILED) {\n                            s4 = peg$currPos;\n                            s5 = peg$currPos;\n                            s6 = peg$parseHexDigit();\n                            if (s6 !== peg$FAILED) {\n                              s7 = peg$parseHexDigit();\n                              if (s7 !== peg$FAILED) {\n                                s8 = peg$parseHexDigit();\n                                if (s8 !== peg$FAILED) {\n                                  s9 = peg$parseHexDigit();\n                                  if (s9 !== peg$FAILED) {\n                                    s6 = [s6, s7, s8, s9];\n                                    s5 = s6;\n                                  } else {\n                                    peg$currPos = s5;\n                                    s5 = peg$FAILED;\n                                  }\n                                } else {\n                                  peg$currPos = s5;\n                                  s5 = peg$FAILED;\n                                }\n                              } else {\n                                peg$currPos = s5;\n                                s5 = peg$FAILED;\n                              }\n                            } else {\n                              peg$currPos = s5;\n                              s5 = peg$FAILED;\n                            }\n                            if (s5 !== peg$FAILED) {\n                              s4 = input.substring(s4, peg$currPos);\n                            } else {\n                              s4 = s5;\n                            }\n                            if (s4 !== peg$FAILED) {\n                              peg$savedPos = s2;\n                              s3 = peg$c80(s4);\n                              s2 = s3;\n                            } else {\n                              peg$currPos = s2;\n                              s2 = peg$FAILED;\n                            }\n                          } else {\n                            peg$currPos = s2;\n                            s2 = peg$FAILED;\n                          }\n                        }\n                      }\n                    }\n                  }\n                }\n              }\n            }\n          }\n        }\n        if (s2 !== peg$FAILED) {\n          peg$savedPos = s0;\n          s1 = peg$c81(s2);\n          s0 = s1;\n        } else {\n          peg$currPos = s0;\n          s0 = peg$FAILED;\n        }\n      } else {\n        peg$currPos = s0;\n        s0 = peg$FAILED;\n      }\n      peg$silentFails--;\n      if (s0 === peg$FAILED) {\n        s1 = peg$FAILED;\n        if (peg$silentFails === 0) { peg$fail(peg$c58); }\n      }\n\n      return s0;\n    }\n\n    function peg$parseDigit() {\n      var s0;\n\n      if (peg$c82.test(input.charAt(peg$currPos))) {\n        s0 = input.charAt(peg$currPos);\n        peg$currPos++;\n      } else {\n        s0 = peg$FAILED;\n        if (peg$silentFails === 0) { peg$fail(peg$c83); }\n      }\n\n      return s0;\n    }\n\n    function peg$parseHexDigit() {\n      var s0;\n\n      if (peg$c84.test(input.charAt(peg$currPos))) {\n        s0 = input.charAt(peg$currPos);\n        peg$currPos++;\n      } else {\n        s0 = peg$FAILED;\n        if (peg$silentFails === 0) { peg$fail(peg$c85); }\n      }\n\n      return s0;\n    }\n\n    function peg$parseLineTerminator() {\n      var s0;\n\n      if (peg$c86.test(input.charAt(peg$currPos))) {\n        s0 = input.charAt(peg$currPos);\n        peg$currPos++;\n      } else {\n        s0 = peg$FAILED;\n        if (peg$silentFails === 0) { peg$fail(peg$c87); }\n      }\n\n      return s0;\n    }\n\n    peg$result = peg$startRuleFunction();\n\n    if (peg$result !== peg$FAILED && peg$currPos === input.length) {\n      return peg$result;\n    } else {\n      if (peg$result !== peg$FAILED && peg$currPos < input.length) {\n        peg$fail({ type: \"end\", description: \"end of input\" });\n      }\n\n      throw peg$buildException(\n        null,\n        peg$maxFailExpected,\n        peg$maxFailPos < input.length ? input.charAt(peg$maxFailPos) : null,\n        peg$maxFailPos < input.length\n          ? peg$computeLocation(peg$maxFailPos, peg$maxFailPos + 1)\n          : peg$computeLocation(peg$maxFailPos, peg$maxFailPos)\n      );\n    }\n  }\n\n  return {\n    SyntaxError: peg$SyntaxError,\n    parse:       peg$parse\n  };\n})();\n"
  },
  {
    "path": "src/editor.coffee",
    "content": "module.exports =\nclass Editor\n    constructor: (@loaderFunc, loader) ->\n        editorWidthPercentage = 30;\n        $editorBox = $($.parseHTML '<div class=\"column\"></div>')\n        $editorBox.width(editorWidthPercentage+'%')\n        $('#net-column').width((100-editorWidthPercentage)+'%')\n        $('#master-container').prepend $editorBox\n        preset = loader.dataLoaded ? '# Enter your network definition here.\\n# Use Shift+Enter to update the visualization.'\n        @editor = CodeMirror $editorBox[0],\n            value: preset\n            lineNumbers : true\n            lineWrapping : true\n        @editor.on 'keydown', (cm, e) => @onKeyDown(e)\n\n    reload: (@loaderFunc, loader) ->\n        preset = loader.dataLoaded ? '# Enter your network definition here.\\n# Use Shift+Enter to update the visualization.'\n        @editor.setValue(preset)\n        #alert(preset)\n\n    onKeyDown: (e) ->\n        if (e.shiftKey && e.keyCode==13)\n            # Using onKeyDown lets us prevent the default action,\n            # even if an error is encountered (say, due to parsing).\n            # This would not be possible with keymaps.\n            e.preventDefault()\n            @loaderFunc @editor.getValue()\n"
  },
  {
    "path": "src/loader.coffee",
    "content": "module.exports =\nclass Loader\n    constructor: (@parser) ->\n        # The parser is a unary function that accepts the network source\n        # and outputs a Network instance.\n        @dataLoaded = null;\n\n    fromGist: (gistID, callback) =>\n        # Load the model with the given Gist ID.\n        url = 'https://api.github.com/gists/'+gistID\n        $.getJSON url, (data) =>\n            fileSet = data['files']\n            isSolitaryFile = Object.keys(fileSet).length==1\n            for fileKey of fileSet\n                fileInfo = fileSet[fileKey]\n                filename = fileInfo['filename'].toLowerCase()\n                isProto = _.endsWith filename, '.prototxt'\n                isSolver = _.startsWith filename, 'solver'\n                if (isProto and not isSolver) or isSolitaryFile\n                    @load fileInfo['content'], callback\n                    return\n            console.log 'No prototxt found in the given GIST.'\n\n    fromURL: (url, callback) =>\n        # Load the model from the given URL.\n        # This may fail due to same-origin policy.\n        $.ajax\n            url: url\n            success: => @load data, callback\n\n    fromPreset: (name, callback) =>\n        # Load a preset model. Caffe Only.\n        $.get './presets/'+name+'.prototxt', (data) =>\n            @load data, callback\n\n    load: (data, callback) =>\n        @dataLoaded = data\n        net = @parser.parse data\n        if not _.isUndefined(callback)\n            callback net\n        return net\n"
  },
  {
    "path": "src/netscope.coffee",
    "content": "AppController   = require './app.coffee'\nCaffeNetwork    = require './caffe/caffe.coffee'\nLoader          = require './loader.coffee'\n\nwindow.do_variants_analysis = false\n\nshowDocumentation = ->\n    window.location.href = 'quickstart.html'\n\n$(document).ready ->\n    app = new AppController()\n    # Setup Caffe model loader.\n    # This can be replaced with any arbitrary parser to support\n    # formats other than Caffe.\n    loader = new Loader(CaffeNetwork)\n    # Helper function for wrapping the load calls.\n    makeLoader = (loadingFunc, loader) ->\n        (args...) ->\n            app.startLoading loadingFunc, loader, args...\n\n    # Register routes\n    routes =\n       '/gist/:gistID' : makeLoader loader.fromGist, loader\n       '/url/(.+)'     : makeLoader loader.fromURL, loader\n       '/preset/:name' : makeLoader loader.fromPreset, loader\n       '/editor(/?)'   : => app.showEditor loader\n       '/doc'          : => showDocumentation()\n    router = Router(routes)\n    router.init '/doc'"
  },
  {
    "path": "src/network.coffee",
    "content": "class Node\n    constructor: (@name, @type, @attribs={}, @analysis={}) ->\n        @parents = []\n        @children = []\n        # Nodes to be coalesced (by the renderer) with the current one.\n        # For instance, this can be used for grouping in-place operations.\n        # Note that this assumes the nodes to be coalesced and the current\n        # node form a simple chain structure.\n        @coalesce = []\n\n    addChild: (child) =>\n        if child not in @children\n            @children.push child\n            if @ not in child.parents\n                child.parents.push @\n\n    addChildren: (children) =>\n        _.forEach children, (c) => @addChild c\n\n    addParent: (parent) =>\n        parent.addChild @\n\n    addParents: (parents) =>\n        _.forEach parents, (p) => @addParent p\n\n    detachChild: (child) =>\n        _.pull @children, child\n        _.pull child.parents, @\n\n    detachChildren: =>\n        children = _.clone @children\n        _.forEach children, (c) => @detachChild c\n        return children\n\nmodule.exports =\nclass Network\n    constructor: (@name='Untitled Network') ->\n        @nodes = []\n\n    createNode: (label, type, attribs, analysis) ->\n        node = new Node label, type, attribs, analysis\n        @nodes.push node\n        return node\n\n    sortTopologically: =>\n        sortedNodes = []\n        unsortedNodes = _.clone @nodes\n        for node in unsortedNodes\n            node.sort_ = {temp:false, perm: false}\n        visit = (node) ->\n            if node.sort_.temp==true\n                throw \"Graph is not a DAG.\"\n            if node.sort_.perm\n                return\n            node.sort_.temp = true\n            for child in node.children\n                visit child\n            node.sort_.perm = true\n            node.sort_.temp = false\n            sortedNodes.unshift node\n        while unsortedNodes.length!=0\n            visit unsortedNodes.pop()\n        for node in sortedNodes\n            delete node.sort_\n        return sortedNodes\n"
  },
  {
    "path": "src/renderer.coffee",
    "content": "Tableify = require('tableify')\nrequire('tablesorter')\n\nmodule.exports =\nclass Renderer\n    constructor: (@net, @parent, @table) ->\n        @iconify = false\n        @layoutDirection = 'tb'\n        @generateGraph()\n        @renderTable()\n\n    setupGraph: ->\n        @graph = new dagreD3.graphlib.Graph()\n        @graph.setDefaultEdgeLabel ( -> {} )\n        @graph.setGraph\n            rankdir: @layoutDirection\n            ranksep: 10, # Vertical node separation\n            nodesep: 5, # Horizontal node separation\n            edgesep: 10, # Horizontal edge separation\n            marginx:  0, # Horizontal graph margin\n            marginy:  0  # Vertical graph margin\n\n    generateGraph: ->\n        @setupGraph()\n        nodes = @net.sortTopologically()\n        for node in nodes\n            if node.isInGraph\n                continue\n            layers = [node].concat node.coalesce\n            if layers.length>1\n                # Rewire the node following the last coalesced node to this one\n                lastCoalesed = layers[layers.length-1]\n                for child in lastCoalesed.children\n                    uberParents = _.clone child.parents\n                    uberParents[uberParents.indexOf lastCoalesed] = node\n                    child.parents = uberParents\n            @insertNode layers\n\n            for parent in node.parents\n                @insertLink parent, node\n        for source in @graph.sources()\n            (@graph.node source).class = 'node-type-source'\n        for sink in @graph.sinks()\n            (@graph.node sink).class = 'node-type-sink'\n        @render()\n\n    generateTable: ->\n        entry = {name: 'start'}\n        tbl = []\n        id = 0\n        worstcasepervariant = null\n\n        # Build up Layer Table\n        for n in @net.sortTopologically()\n\n            # summarize Values in Variant Implementations\n            if (do_variants_analysis)\n                if (n.analysis.variants.length > 0)\n                    if not worstcasepervariant # initial copy\n                        worstcasepervariant = _.cloneDeep(n.analysis.variants)\n                    variantcopy = _.extend([],n.analysis.variants)\n                    for variant,idx in variantcopy\n                        worstcasepervariant[idx][key] = val for key,val of variant when worstcasepervariant[idx][key] < val\n                        variant[key] = @toSuffixForm(val) for key,val of variant when val > 0\n\n            id++\n            entry = {\n                ID: id\n                name: n.name\n                type: n.type\n                batch: n.analysis.batchIn\n                ch_in: n.analysis.chIn\n                dim_in: n.analysis.wIn+'x'+n.analysis.hIn\n                ch_out: n.analysis.chOut\n                dim_out: n.analysis.wOut+'x'+n.analysis.hOut\n                ops_raw: n.analysis.comp\n                mem_raw: n.analysis.mem\n            }\n            if (do_variants_analysis) then entry.implementations = n.analysis.variants;\n            tbl.push(entry)\n\n        if (do_variants_analysis and worstcasepervariant)\n            # worst case variant summary\n            for variant in worstcasepervariant\n                variant[key] = @toSuffixForm(val) for key,val of variant when val > 0\n            entry = {\n                ID: 999\n                name: \"Worst-Case Requirements\"\n                implementations: worstcasepervariant\n            }\n            tbl.push(entry)\n        return tbl\n\n    toSuffixForm: (num, decimals = 2) ->\n        exponents = [12,  9,  6,  3]\n        suffices  = [\"T\",\"G\",\"M\",\"k\"]\n        decimals = Math.pow(10, decimals)\n        #debugger\n        for exponent,i in exponents\n            suffix = suffices[i]\n            factor = Math.pow(10, exponent)\n            if (num > factor)\n                return Math.round(num/factor*decimals)/decimals+suffix\n        # too small, no suffix\n        return num\n\n    summarizeTable: (tbl) ->\n        entry = {name: 'start'}\n        summary = []\n        num_subs = 0\n        for n in tbl\n            slashindex = n.name.indexOf('/')\n            if (slashindex>0 and entry.name.substring(0,slashindex) == n.name.substring(0,slashindex)) # layer has same prefix as current summary item\n                num_subs++\n                entry.name = n.name.substring(0,slashindex)\n                entry.type = 'submodule('+num_subs+')'\n                entry.ch_out = n.ch_out\n                entry.dim_out = n.dim_out\n                entry.ops_raw[key] += n.ops_raw[key] for key of entry.ops_raw\n                entry.mem_raw[key] += n.mem_raw[key] for key of entry.mem_raw\n                entry.ops[key] = @toSuffixForm(val) for key,val of entry.ops_raw when val > 0\n                entry.mem[key] = @toSuffixForm(val) for key,val of entry.mem_raw when val > 0\n                #debugger\n                summary.pop()\n                summary.push(entry)\n             else\n                num_subs = 0\n                entry = {\n                    ID: n.ID\n                    name: n.name\n                    type: n.type\n                    batch: n.batchIn\n                    ch_in: n.ch_in\n                    dim_in: n.dim_in\n                    ch_out: n.ch_out\n                    dim_out: n.dim_out\n                    ops_raw: _.extend({}, n.ops_raw)\n                    mem_raw: _.extend({}, n.mem_raw)\n                    ops: {}\n                    mem: {}\n                }\n                entry.ops[key] = @toSuffixForm(val) for key,val of entry.ops_raw when val > 0\n                entry.mem[key] = @toSuffixForm(val) for key,val of entry.mem_raw when val > 0\n                summary.push(entry)\n\n        # initialize TOTAL row\n        total = {name: 'TOTAL', ops_raw: {}, mem_raw: {}, ops: {}, mem: {}}\n        _.extend(total.ops_raw, summary[0].ops_raw) # copy zeros from data layer\n        _.extend(total.mem_raw, summary[0].mem_raw) # idem\n        total.mem_raw.activation = 0 # data layer already uses activation --> set to zero\n        for entry in summary\n            #debugger\n            total.ops_raw[key] += entry.ops_raw[key] for key of entry.ops_raw\n            total.mem_raw[key] += entry.mem_raw[key] for key of entry.mem_raw\n        total.ops[key] = @toSuffixForm(val) for key,val of total.ops_raw\n        total.mem[key] = @toSuffixForm(val) for key,val of total.mem_raw\n        summary.push(total)\n        summary_without_raw = (_.omit(entry, ['ops_raw','mem_raw']) for entry in summary)\n        return summary_without_raw\n\n    renderTable: ->\n        # Generate Detail Table and Summary\n        detail = @generateTable()\n        summary = @summarizeTable(detail)\n        $(@table).html('<h3>Summary:</h3><a id=\"summary\"></a>'+Tableify(summary)+\n                       '<h3>Details:</h3><a id=\"details\"></a>'+Tableify(detail));\n\n        # Add Sorting Headers\n        $(@table+' table').tablesorter()\n\n        # Add Click-to-Scroll Handlers\n        # Closure Function that executes scroll:\n        scroll_to = (el) ->\n            return () ->\n                top_coord = $(el).offset().top-200;\n                $(\"body,html\").animate({ scrollTop: top_coord }, 200);\n                $(el).addClass 'node-highlight'\n                removeHighlight = (node) ->\n                    return () -> $(node).removeClass 'node-highlight'\n                window.setTimeout removeHighlight(el), 4000\n\n        # Add Click-to-Scroll to all summary rows, except last\n        summary_table = $(@table+' table')[0]\n        summary_body = summary_table.children[1]\n        row_array = Array.prototype.slice.call(summary_body.children)\n        for row in row_array.slice(0,-1)\n            # Add Link between Node and Table Element -> both directions work\n            $table_elem = $(row.children[1])\n            $node_elem  = $('div[id^=\"node-'+$table_elem.text()+'\"]')\n            $table_elem.click( scroll_to $node_elem )\n            $node_elem.click( scroll_to $table_elem )\n\n        if do_variants_analysis\n            # Calculate Per-Layer Statistics\n            areatbl = []\n            for entry in detail when (entry.type == \"Convolution\" or entry.type == \"Concat\" or entry.type == \"SoftmaxWithLoss\" or entry.type == \"innerproduct\")\n                # extract input dimension:\n                dim_in = entry.dim_in?.split(\"x\").pop()\n                # add entry\n                suffix = \" \" + @net.name\n                line = {}\n                line[\"layer\"] = entry.name;\n                line[\"capacity\"+suffix] = if entry.mem_raw?.activation > 0 then entry.mem_raw.activation else \"\"\n                line[\"macc \"+suffix] = if entry.ops_raw?.macc > 0 then entry.ops_raw.macc else \"\"\n                line[\"param \"+suffix] = if entry.mem_raw?.param > 0 then entry.mem_raw.param else \"\"\n                line[\"ch_out \"+suffix] = entry.ch_out\n                line[\"width \"+suffix] = dim_in\n                areatbl.push(line)\n            $(Tableify(areatbl)).appendTo(@table)\n        return null\n\n    insertNode: (layers) ->\n        baseNode = layers[0]\n        nodeClass = 'node-type-'+baseNode.type.replace(/_/g, '-').toLowerCase()\n        nodeLabel = ''\n        for layer in layers\n            layer.isInGraph = true\n            nodeLabel += @generateLabel layer\n            nodeDesc =\n                labelType   : 'html'\n                label       : nodeLabel\n                class       : nodeClass\n                layers      : layers\n                rx          : 5\n                ry          : 5\n        if @iconify\n            _.extend nodeDesc,\n                shape: 'circle'\n        @graph.setNode baseNode.name, nodeDesc\n\n    generateLabel: (layer) ->\n        if not @iconify\n            '<div class=\"node-label\" id=\"node-'+layer.name+'\">'+layer.name+'</div>'\n        else\n            ''\n\n    insertLink: (src, dst) ->\n        if not @iconify\n            ch = src.analysis.chOut ? \"?\"\n            w = src.analysis.wOut ? \"?\"\n            h = src.analysis.hOut ? \"?\"\n            b = src.analysis.batchOut ? \"?\"\n            lbl = ch+'ch ⋅ '+w+'×'+h\n            lbl += ' (×'+b+')' if b > 1\n        else\n            lbl = ''\n        @graph.setEdge(src.name, dst.name, { arrowhead: 'vee', label: lbl } );\n\n    renderKey:(key) ->\n        key.replace(/_/g, ' ')\n\n    renderValue: (value) ->\n        if Array.isArray value\n            return value.join(', ')\n        return value\n\n    renderSection: (section) ->\n        s = ''\n        for own key of section\n            val = section[key]\n            isSection = (typeof val is 'object') and not Array.isArray(val)\n            if isSection\n                s += '<div class=\"node-param-section-title node-param-key\">'+@renderKey(key)+'</div>'\n                s += '<div class=\"node-param-section\">'\n                s+= @renderSection val\n            else\n                s += '<div class=\"node-param-row\">'\n                s += '<span class=\"node-param-key\">'+@renderKey(key)+': </span>'\n                s += '<span class=\"node-param-value\">'+@renderValue(val)+'</span>'\n            s += '</div>'\n        return s\n\n    tipForNode: (nodeKey) ->\n        node = @graph.node nodeKey\n        s = ''\n        for layer in node.layers\n            s += '<div class=\"node-info-group\">'\n            s += '<div class=\"node-info-header\">'\n            s += '<span class=\"node-info-title\">'+layer.name+'</span>'\n            s += ' &middot; '\n            s += '<span class=\"node-info-type\">'+@renderKey(layer.type)+'</span>'\n            if layer.annotation?\n                s += ' &middot; <span class=\"node-info-annotation\">'+layer.annotation+'</span>'\n            s += '</div>'\n            s += @renderSection layer.attribs\n        return s\n\n    render: ->\n        svg = d3.select(@parent)\n        svgGroup = svg.append('g')\n        graphRender = new dagreD3.render()\n        graphRender svgGroup, @graph\n\n        # Size to fit.\n        # getBBox appears to do the right thing on Chrome,\n        # but not on Firefox. getBoundingClientRect works on both.\n        bbox = svgGroup.node().getBoundingClientRect()\n        svg.attr('width', bbox.width)\n        svg.attr('height', bbox.height)\n\n        # Configure Tooltips.\n        tipPositions =\n            tb:\n                my: 'left center'\n                at: 'right center'\n            lr:\n                my: 'top center'\n                at: 'bottom center'\n        that = @\n        svgGroup.selectAll(\"g.node\").each (nodeKey) ->\n            position = tipPositions[that.layoutDirection]\n            position.viewport = $(window)\n            $(this).qtip\n                content:\n                    text: that.tipForNode nodeKey\n                position: position\n                show:\n                    delay: 0\n                    effect: false\n                hide:\n                    effect: false\n"
  }
]