Full Code of angular/angular.js for AI

master d8f77817eb5c cached
1516 files
20.9 MB
4.0M tokens
451 symbols
1 requests
Copy disabled (too large) Download .txt
Showing preview only (16,031K chars total). Download the full file to get everything.
Repository: angular/angular.js
Branch: master
Commit: d8f77817eb5c
Files: 1516
Total size: 20.9 MB

Directory structure:
gitextract_frd3dhqe/

├── .circleci/
│   ├── config.yml
│   ├── env-helpers.inc.sh
│   └── env.sh
├── .editorconfig
├── .eslintignore
├── .eslintrc-base.json
├── .eslintrc-browser.json
├── .eslintrc-node.json
├── .eslintrc-todo.json
├── .eslintrc.json
├── .gitattributes
├── .github/
│   ├── ISSUE_TEMPLATE.md
│   └── PULL_REQUEST_TEMPLATE.md
├── .gitignore
├── .mailmap
├── .nvmrc
├── CHANGELOG.md
├── CODE_OF_CONDUCT.md
├── CONTRIBUTING.md
├── DEVELOPERS.md
├── Gruntfile.js
├── LICENSE
├── README.closure.md
├── README.md
├── RELEASE.md
├── SECURITY.md
├── TRIAGING.md
├── angularFiles.js
├── benchmarks/
│   ├── .eslintrc.json
│   ├── README.md
│   ├── animation-bp/
│   │   ├── app.js
│   │   ├── bp.conf.js
│   │   ├── jquery-noop.js
│   │   └── main.html
│   ├── bootstrap-compile-bp/
│   │   ├── app.js
│   │   ├── bootstrap-carousel.tpl.html
│   │   ├── bootstrap-theme.tpl.html
│   │   ├── bp.conf.js
│   │   └── main.html
│   ├── event-delegation-bp/
│   │   ├── app.js
│   │   ├── bp.conf.js
│   │   └── main.html
│   ├── largetable-bp/
│   │   ├── app.js
│   │   ├── bp.conf.js
│   │   ├── jquery-noop.js
│   │   └── main.html
│   ├── ng-class-bp/
│   │   ├── app.js
│   │   ├── bp.conf.js
│   │   └── main.html
│   ├── ng-options-bp/
│   │   ├── app.js
│   │   ├── bp.conf.js
│   │   └── main.html
│   ├── orderby-bp/
│   │   ├── app.js
│   │   ├── bp.conf.js
│   │   ├── jquery-noop.js
│   │   └── main.html
│   ├── parsed-expressions-bp/
│   │   ├── app.js
│   │   ├── bp.conf.js
│   │   └── main.html
│   ├── repeat-animate-bp/
│   │   ├── app-classfilter.js
│   │   ├── app-noanimate.js
│   │   ├── app.js
│   │   ├── bp.conf.js
│   │   ├── common.js
│   │   └── main.html
│   └── select-ng-value-bp/
│       ├── app.js
│       ├── bp.conf.js
│       └── main.html
├── css/
│   ├── angular-scenario.css
│   └── angular.css
├── docs/
│   ├── app/
│   │   ├── assets/
│   │   │   ├── Error404.html
│   │   │   ├── css/
│   │   │   │   ├── angular-topnav.css
│   │   │   │   ├── animations.css
│   │   │   │   ├── doc_widgets.css
│   │   │   │   ├── docs.css
│   │   │   │   ├── prettify-theme.css
│   │   │   │   └── prettify.css
│   │   │   ├── js/
│   │   │   │   ├── angular-bootstrap/
│   │   │   │   │   └── dropdown-toggle.js
│   │   │   │   └── search-worker.js
│   │   │   └── robots.txt
│   │   ├── e2e/
│   │   │   ├── .eslintrc.json
│   │   │   ├── api-docs/
│   │   │   │   ├── api-pages.scenario.js
│   │   │   │   ├── directive-pages.scenario.js
│   │   │   │   ├── provider-pages.scenario.js
│   │   │   │   └── service-pages.scenario.js
│   │   │   ├── app.scenario.js
│   │   │   └── table-of-contents.scenario.js
│   │   ├── src/
│   │   │   ├── .eslintrc.json
│   │   │   ├── app.js
│   │   │   ├── directives.js
│   │   │   ├── docs.js
│   │   │   ├── errors.js
│   │   │   ├── examples.js
│   │   │   ├── search.js
│   │   │   ├── tutorials.js
│   │   │   └── versions.js
│   │   └── test/
│   │       ├── .eslintrc.json
│   │       ├── directivesSpec.js
│   │       ├── docsSpec.js
│   │       └── errorsSpec.js
│   ├── config/
│   │   ├── ignore.words
│   │   ├── index.js
│   │   ├── inline-tag-defs/
│   │   │   └── type.js
│   │   ├── processors/
│   │   │   ├── error-docs.js
│   │   │   ├── index-page.js
│   │   │   ├── keywords.js
│   │   │   ├── pages-data.js
│   │   │   ├── sitemap.js
│   │   │   └── versions-data.js
│   │   ├── services/
│   │   │   ├── deployments/
│   │   │   │   ├── debug.js
│   │   │   │   ├── default.js
│   │   │   │   ├── jquery.js
│   │   │   │   ├── production.js
│   │   │   │   └── test.js
│   │   │   ├── errorNamespaceMap.js
│   │   │   ├── getMinerrInfo.js
│   │   │   └── getVersion.js
│   │   ├── tag-defs/
│   │   │   ├── deprecated.js
│   │   │   ├── deprecated.spec.js
│   │   │   ├── installation.js
│   │   │   ├── sortOrder.js
│   │   │   ├── this.js
│   │   │   └── tutorial-step.js
│   │   └── templates/
│   │       ├── app/
│   │       │   ├── angular-service.template.js
│   │       │   ├── error.template.html
│   │       │   ├── errorNamespace.template.html
│   │       │   ├── indexPage.template.html
│   │       │   ├── json-doc.template.json
│   │       │   ├── nav-data.template.js
│   │       │   ├── pages-data.template.js
│   │       │   ├── sitemap.template.xml
│   │       │   └── tutorial.template.html
│   │       ├── examples/
│   │       │   ├── index.template.html
│   │       │   ├── manifest.template.json
│   │       │   ├── protractorTests.template.js
│   │       │   ├── runnableExample.template.html
│   │       │   ├── template.css
│   │       │   ├── template.html
│   │       │   ├── template.js
│   │       │   ├── template.json
│   │       │   ├── template.protractor
│   │       │   ├── template.scenario
│   │       │   └── template.spec
│   │       └── ngdoc/
│   │           ├── api/
│   │           │   ├── api.template.html
│   │           │   ├── componentGroup.template.html
│   │           │   ├── directive.template.html
│   │           │   ├── filter.template.html
│   │           │   ├── function.template.html
│   │           │   ├── input.template.html
│   │           │   ├── module.template.html
│   │           │   ├── object.template.html
│   │           │   ├── provider.template.html
│   │           │   ├── service.template.html
│   │           │   └── type.template.html
│   │           ├── base.template.html
│   │           ├── lib/
│   │           │   ├── deprecated.html
│   │           │   ├── events.template.html
│   │           │   ├── macros.html
│   │           │   ├── methods.template.html
│   │           │   ├── params.template.html
│   │           │   ├── properties.template.html
│   │           │   ├── returns.template.html
│   │           │   └── this.template.html
│   │           └── overview.template.html
│   ├── content/
│   │   ├── api/
│   │   │   └── index.ngdoc
│   │   ├── error/
│   │   │   ├── $animate/
│   │   │   │   ├── nongcls.ngdoc
│   │   │   │   └── notcsel.ngdoc
│   │   │   ├── $cacheFactory/
│   │   │   │   └── iid.ngdoc
│   │   │   ├── $compile/
│   │   │   │   ├── baddir.ngdoc
│   │   │   │   ├── badrestrict.ngdoc
│   │   │   │   ├── ctreq.ngdoc
│   │   │   │   ├── ctxoverride.ngdoc
│   │   │   │   ├── infchng.ngdoc
│   │   │   │   ├── iscp.ngdoc
│   │   │   │   ├── missingattr.ngdoc
│   │   │   │   ├── multidir.ngdoc
│   │   │   │   ├── multilink.ngdoc
│   │   │   │   ├── noctrl.ngdoc
│   │   │   │   ├── nodomevents.ngdoc
│   │   │   │   ├── nonassign.ngdoc
│   │   │   │   ├── noslot.ngdoc
│   │   │   │   ├── reqslot.ngdoc
│   │   │   │   ├── selmulti.ngdoc
│   │   │   │   ├── srcset.ngdoc
│   │   │   │   ├── tplrt.ngdoc
│   │   │   │   └── uterdir.ngdoc
│   │   │   ├── $controller/
│   │   │   │   ├── ctrlfmt.ngdoc
│   │   │   │   ├── ctrlreg.ngdoc
│   │   │   │   └── noscp.ngdoc
│   │   │   ├── $http/
│   │   │   │   ├── baddata.ngdoc
│   │   │   │   ├── badjsonp.ngdoc
│   │   │   │   └── badreq.ngdoc
│   │   │   ├── $injector/
│   │   │   │   ├── cdep.ngdoc
│   │   │   │   ├── itkn.ngdoc
│   │   │   │   ├── modulerr.ngdoc
│   │   │   │   ├── nomod.ngdoc
│   │   │   │   ├── pget.ngdoc
│   │   │   │   ├── strictdi.ngdoc
│   │   │   │   ├── undef.ngdoc
│   │   │   │   └── unpr.ngdoc
│   │   │   ├── $interpolate/
│   │   │   │   ├── badexpr.ngdoc
│   │   │   │   ├── dupvalue.ngdoc
│   │   │   │   ├── interr.ngdoc
│   │   │   │   ├── logicbug.ngdoc
│   │   │   │   ├── nochgmustache.ngdoc
│   │   │   │   ├── noconcat.ngdoc
│   │   │   │   ├── reqarg.ngdoc
│   │   │   │   ├── reqcomma.ngdoc
│   │   │   │   ├── reqendbrace.ngdoc
│   │   │   │   ├── reqendinterp.ngdoc
│   │   │   │   ├── reqopenbrace.ngdoc
│   │   │   │   ├── reqother.ngdoc
│   │   │   │   ├── unknarg.ngdoc
│   │   │   │   ├── unsafe.ngdoc
│   │   │   │   ├── untermstr.ngdoc
│   │   │   │   └── wantstring.ngdoc
│   │   │   ├── $interval/
│   │   │   │   └── badprom.ngdoc
│   │   │   ├── $location/
│   │   │   │   ├── badpath.ngdoc
│   │   │   │   ├── ipthprfx.ngdoc
│   │   │   │   ├── isrcharg.ngdoc
│   │   │   │   ├── nobase.ngdoc
│   │   │   │   └── nostate.ngdoc
│   │   │   ├── $parse/
│   │   │   │   ├── esc.ngdoc
│   │   │   │   ├── lexerr.ngdoc
│   │   │   │   ├── lval.ngdoc
│   │   │   │   ├── syntax.ngdoc
│   │   │   │   └── ueoe.ngdoc
│   │   │   ├── $q/
│   │   │   │   ├── norslvr.ngdoc
│   │   │   │   └── qcycle.ngdoc
│   │   │   ├── $resource/
│   │   │   │   ├── badargs.ngdoc
│   │   │   │   ├── badcfg.ngdoc
│   │   │   │   ├── badmember.ngdoc
│   │   │   │   └── badname.ngdoc
│   │   │   ├── $rootScope/
│   │   │   │   ├── infdig.ngdoc
│   │   │   │   └── inprog.ngdoc
│   │   │   ├── $route/
│   │   │   │   └── norout.ngdoc
│   │   │   ├── $sanitize/
│   │   │   │   ├── elclob.ngdoc
│   │   │   │   ├── noinert.ngdoc
│   │   │   │   └── uinput.ngdoc
│   │   │   ├── $sce/
│   │   │   │   ├── icontext.ngdoc
│   │   │   │   ├── iequirks.ngdoc
│   │   │   │   ├── imatcher.ngdoc
│   │   │   │   ├── insecurl.ngdoc
│   │   │   │   ├── itype.ngdoc
│   │   │   │   ├── iwcard.ngdoc
│   │   │   │   └── unsafe.ngdoc
│   │   │   ├── $templateRequest/
│   │   │   │   └── tpload.ngdoc
│   │   │   ├── $timeout/
│   │   │   │   └── badprom.ngdoc
│   │   │   ├── filter/
│   │   │   │   └── notarray.ngdoc
│   │   │   ├── index.ngdoc
│   │   │   ├── jqLite/
│   │   │   │   ├── nosel.ngdoc
│   │   │   │   ├── offargs.ngdoc
│   │   │   │   └── onargs.ngdoc
│   │   │   ├── linky/
│   │   │   │   └── notstring.ngdoc
│   │   │   ├── ng/
│   │   │   │   ├── aobj.ngdoc
│   │   │   │   ├── areq.ngdoc
│   │   │   │   ├── badname.ngdoc
│   │   │   │   ├── btstrpd.ngdoc
│   │   │   │   ├── cpi.ngdoc
│   │   │   │   ├── cpta.ngdoc
│   │   │   │   ├── cpws.ngdoc
│   │   │   │   └── test.ngdoc
│   │   │   ├── ngModel/
│   │   │   │   ├── constexpr.ngdoc
│   │   │   │   ├── datefmt.ngdoc
│   │   │   │   ├── nonassign.ngdoc
│   │   │   │   ├── nopromise.ngdoc
│   │   │   │   └── numfmt.ngdoc
│   │   │   ├── ngOptions/
│   │   │   │   └── iexp.ngdoc
│   │   │   ├── ngPattern/
│   │   │   │   └── noregexp.ngdoc
│   │   │   ├── ngRef/
│   │   │   │   ├── noctrl.ngdoc
│   │   │   │   └── nonassign.ngdoc
│   │   │   ├── ngRepeat/
│   │   │   │   ├── badident.ngdoc
│   │   │   │   ├── dupes.ngdoc
│   │   │   │   ├── iexp.ngdoc
│   │   │   │   └── iidexp.ngdoc
│   │   │   ├── ngTransclude/
│   │   │   │   └── orphan.ngdoc
│   │   │   └── orderBy/
│   │   │       └── notarray.ngdoc
│   │   ├── guide/
│   │   │   ├── $location.ngdoc
│   │   │   ├── accessibility.ngdoc
│   │   │   ├── animations.ngdoc
│   │   │   ├── bootstrap.ngdoc
│   │   │   ├── compiler.ngdoc
│   │   │   ├── component-router.ngdoc
│   │   │   ├── component.ngdoc
│   │   │   ├── concepts.ngdoc
│   │   │   ├── controller.ngdoc
│   │   │   ├── css-styling.ngdoc
│   │   │   ├── databinding.ngdoc
│   │   │   ├── decorators.ngdoc
│   │   │   ├── di.ngdoc
│   │   │   ├── directive.ngdoc
│   │   │   ├── e2e-testing.ngdoc
│   │   │   ├── expression.ngdoc
│   │   │   ├── external-resources.ngdoc
│   │   │   ├── filter.ngdoc
│   │   │   ├── forms.ngdoc
│   │   │   ├── i18n.ngdoc
│   │   │   ├── ie.ngdoc
│   │   │   ├── index.ngdoc
│   │   │   ├── interpolation.ngdoc
│   │   │   ├── introduction.ngdoc
│   │   │   ├── migration.ngdoc
│   │   │   ├── module.ngdoc
│   │   │   ├── production.ngdoc
│   │   │   ├── providers.ngdoc
│   │   │   ├── scope.ngdoc
│   │   │   ├── security.ngdoc
│   │   │   ├── services.ngdoc
│   │   │   ├── templates.ngdoc
│   │   │   └── unit-testing.ngdoc
│   │   ├── misc/
│   │   │   ├── contribute.ngdoc
│   │   │   ├── downloading.ngdoc
│   │   │   ├── faq.ngdoc
│   │   │   ├── index.ngdoc
│   │   │   ├── started.ngdoc
│   │   │   └── version-support-status.ngdoc
│   │   ├── notes/
│   │   │   └── empty.tmp
│   │   └── tutorial/
│   │       ├── index.ngdoc
│   │       ├── step_00.ngdoc
│   │       ├── step_01.ngdoc
│   │       ├── step_02.ngdoc
│   │       ├── step_03.ngdoc
│   │       ├── step_04.ngdoc
│   │       ├── step_05.ngdoc
│   │       ├── step_06.ngdoc
│   │       ├── step_07.ngdoc
│   │       ├── step_08.ngdoc
│   │       ├── step_09.ngdoc
│   │       ├── step_10.ngdoc
│   │       ├── step_11.ngdoc
│   │       ├── step_12.ngdoc
│   │       ├── step_13.ngdoc
│   │       ├── step_14.ngdoc
│   │       └── the_end.ngdoc
│   ├── gulpfile.js
│   └── protractor-conf.js
├── i18n/
│   ├── README.md
│   ├── closure/
│   │   ├── currencySymbols.js
│   │   ├── datetimeSymbols.js
│   │   ├── datetimeSymbolsExt.js
│   │   ├── numberSymbols.js
│   │   ├── numberSymbolsExt.js
│   │   └── pluralRules.js
│   ├── e2e/
│   │   ├── .eslintrc.json
│   │   ├── i18n-e2e.js
│   │   ├── localeTest_cs.html
│   │   ├── localeTest_de.html
│   │   ├── localeTest_en.html
│   │   ├── localeTest_es.html
│   │   ├── localeTest_sk.html
│   │   ├── localeTest_zh.html
│   │   └── runner.html
│   ├── generate.sh
│   ├── spec/
│   │   ├── .eslintrc.json
│   │   ├── closureI18nExtractorSpec.js
│   │   ├── converterSpec.js
│   │   └── parserSpec.js
│   ├── src/
│   │   ├── .eslintrc.json
│   │   ├── closureI18nExtractor.js
│   │   ├── closureSlurper.js
│   │   ├── converter.js
│   │   └── parser.js
│   ├── ucd/
│   │   ├── .eslintrc.json
│   │   ├── spec/
│   │   │   ├── .eslintrc.json
│   │   │   ├── extactValuesSpec.js
│   │   │   └── generateCodeSpec.js
│   │   └── src/
│   │       ├── extract.js
│   │       ├── extractValues.js
│   │       └── generateCode.js
│   └── update-closure.sh
├── images/
│   ├── docs/
│   │   ├── Diagrams.graffle/
│   │   │   └── data.plist
│   │   ├── Diagrams.vdx
│   │   ├── guide/
│   │   │   ├── about_controller.graffle
│   │   │   ├── about_controller.vdx
│   │   │   ├── about_model.graffle
│   │   │   ├── about_model.vdx
│   │   │   ├── concepts.graffle/
│   │   │   │   └── data.plist
│   │   │   ├── concepts.vdx
│   │   │   ├── di_sequence.graffle
│   │   │   ├── di_sequence.vdx
│   │   │   ├── dom_scope.graffle
│   │   │   ├── dom_scope.vdx
│   │   │   ├── form_data_flow.graffle
│   │   │   ├── form_data_flow.vdx
│   │   │   ├── hashbang_vs_regular_url.graffle
│   │   │   ├── hashbang_vs_regular_url.vdx
│   │   │   ├── simple_scope.graffle/
│   │   │   │   ├── QuickLook/
│   │   │   │   │   └── Thumbnail.tiff
│   │   │   │   └── data.plist
│   │   │   └── simple_scope.vdx
│   │   └── tutorial/
│   │       ├── di_sequence.graffle
│   │       ├── di_sequence.vdx
│   │       ├── simple_scope.graffle/
│   │       │   ├── QuickLook/
│   │       │   │   └── Thumbnail.tiff
│   │       │   └── data.plist
│   │       ├── simple_scope.vdx
│   │       ├── tutorial_00.graffle
│   │       ├── tutorial_00.vdx
│   │       ├── tutorial_02.graffle/
│   │       │   ├── QuickLook/
│   │       │   │   └── Thumbnail.tiff
│   │       │   └── data.plist
│   │       ├── tutorial_02.vdx
│   │       ├── tutorial_03.vdx
│   │       ├── tutorial_04.vdx
│   │       ├── tutorial_05.graffle/
│   │       │   ├── QuickLook/
│   │       │   │   └── Thumbnail.tiff
│   │       │   └── data.plist
│   │       ├── tutorial_06.graffle/
│   │       │   ├── QuickLook/
│   │       │   │   └── Thumbnail.tiff
│   │       │   └── data.plist
│   │       ├── tutorial_07.vdx
│   │       ├── tutorial_08-09.vdx
│   │       ├── tutorial_09.graffle/
│   │       │   ├── QuickLook/
│   │       │   │   └── Thumbnail.tiff
│   │       │   └── data.plist
│   │       ├── tutorial_10-11.vdx
│   │       ├── tutorial_10.graffle/
│   │       │   ├── QuickLook/
│   │       │   │   └── Thumbnail.tiff
│   │       │   └── data.plist
│   │       ├── tutorial_12.graffle/
│   │       │   ├── QuickLook/
│   │       │   │   └── Thumbnail.tiff
│   │       │   └── data.plist
│   │       ├── tutorial_proto.graffle/
│   │       │   ├── QuickLook/
│   │       │   │   └── Thumbnail.tiff
│   │       │   └── data.plist
│   │       ├── tutorial_proto.vdx
│   │       ├── xhr_service.graffle
│   │       └── xhr_service.vdx
│   └── logo/
│       ├── AngularJS-Shield.exports/
│       │   └── AngularJS-Shield.eps
│       ├── AngularJS-Shield.graffle
│       ├── AngularJS.exports/
│       │   └── AngularJS.eps
│       └── AngularJS.graffle/
│           └── data.plist
├── karma-docs.conf.js
├── karma-jqlite.conf.js
├── karma-jquery-2.1.conf.js
├── karma-jquery-2.2.conf.js
├── karma-jquery.conf-factory.js
├── karma-jquery.conf.js
├── karma-modules-ngAnimate.conf.js
├── karma-modules-ngMock.conf.js
├── karma-modules.conf.js
├── karma-shared.conf.js
├── lib/
│   ├── grunt/
│   │   ├── plugins.js
│   │   ├── utils.js
│   │   └── validate-angular-files.js
│   ├── promises-aplus/
│   │   └── promises-aplus-test-adapter.js
│   ├── saucelabs/
│   │   └── sauce-service.sh
│   └── versions/
│       └── version-info.js
├── logs/
│   └── .gitignore
├── package.json
├── protractor-circleci-conf.js
├── protractor-conf.js
├── protractor-shared-conf.js
├── scripts/
│   ├── angular.js/
│   │   ├── tag-release.sh
│   │   └── untag-release.sh
│   ├── bower/
│   │   ├── publish.sh
│   │   ├── repos.inc
│   │   └── unpublish.sh
│   ├── check-size.sh
│   ├── code.angularjs.org/
│   │   ├── publish.sh
│   │   └── unpublish.sh
│   ├── code.angularjs.org-firebase/
│   │   ├── .eslintrc.json
│   │   ├── .firebaserc
│   │   ├── firebase.json
│   │   ├── functions/
│   │   │   ├── index.js
│   │   │   └── package.json
│   │   ├── public/
│   │   │   ├── googleb96cceae5888d79f.html
│   │   │   └── robots.txt
│   │   ├── readme.firebase.code.md
│   │   └── storage.rules
│   ├── compare-master-to-stable.js
│   ├── docs.angularjs.org-firebase/
│   │   ├── .firebaserc
│   │   ├── firebase.json
│   │   ├── functions/
│   │   │   ├── index.js
│   │   │   └── package.json
│   │   └── readme.firebase.docs.md
│   ├── errors.angularjs.org-firebase/
│   │   ├── .firebaserc
│   │   ├── firebase.json
│   │   └── public/
│   │       └── 404.html
│   ├── release/
│   │   ├── release.sh
│   │   └── undo-release.sh
│   └── utils.inc
├── src/
│   ├── .eslintrc.json
│   ├── Angular.js
│   ├── AngularPublic.js
│   ├── angular.bind.js
│   ├── angular.prefix
│   ├── angular.suffix
│   ├── apis.js
│   ├── auto/
│   │   └── injector.js
│   ├── jqLite.js
│   ├── loader.js
│   ├── loader.prefix
│   ├── loader.suffix
│   ├── minErr.js
│   ├── module.prefix
│   ├── module.suffix
│   ├── ng/
│   │   ├── anchorScroll.js
│   │   ├── animate.js
│   │   ├── animateCss.js
│   │   ├── animateRunner.js
│   │   ├── browser.js
│   │   ├── cacheFactory.js
│   │   ├── compile.js
│   │   ├── controller.js
│   │   ├── cookieReader.js
│   │   ├── directive/
│   │   │   ├── a.js
│   │   │   ├── attrs.js
│   │   │   ├── directives.js
│   │   │   ├── form.js
│   │   │   ├── input.js
│   │   │   ├── ngBind.js
│   │   │   ├── ngChange.js
│   │   │   ├── ngClass.js
│   │   │   ├── ngCloak.js
│   │   │   ├── ngController.js
│   │   │   ├── ngCsp.js
│   │   │   ├── ngEventDirs.js
│   │   │   ├── ngIf.js
│   │   │   ├── ngInclude.js
│   │   │   ├── ngInit.js
│   │   │   ├── ngList.js
│   │   │   ├── ngModel.js
│   │   │   ├── ngModelOptions.js
│   │   │   ├── ngNonBindable.js
│   │   │   ├── ngOptions.js
│   │   │   ├── ngPluralize.js
│   │   │   ├── ngRef.js
│   │   │   ├── ngRepeat.js
│   │   │   ├── ngShowHide.js
│   │   │   ├── ngStyle.js
│   │   │   ├── ngSwitch.js
│   │   │   ├── ngTransclude.js
│   │   │   ├── script.js
│   │   │   ├── select.js
│   │   │   └── validators.js
│   │   ├── document.js
│   │   ├── exceptionHandler.js
│   │   ├── filter/
│   │   │   ├── filter.js
│   │   │   ├── filters.js
│   │   │   ├── limitTo.js
│   │   │   └── orderBy.js
│   │   ├── filter.js
│   │   ├── forceReflow.js
│   │   ├── http.js
│   │   ├── httpBackend.js
│   │   ├── interpolate.js
│   │   ├── interval.js
│   │   ├── intervalFactory.js
│   │   ├── jsonpCallbacks.js
│   │   ├── locale.js
│   │   ├── location.js
│   │   ├── log.js
│   │   ├── parse.js
│   │   ├── q.js
│   │   ├── raf.js
│   │   ├── rootElement.js
│   │   ├── rootScope.js
│   │   ├── sanitizeUri.js
│   │   ├── sce.js
│   │   ├── sniffer.js
│   │   ├── taskTrackerFactory.js
│   │   ├── templateRequest.js
│   │   ├── testability.js
│   │   ├── timeout.js
│   │   ├── urlUtils.js
│   │   └── window.js
│   ├── ngAnimate/
│   │   ├── .eslintrc.json
│   │   ├── animateCache.js
│   │   ├── animateChildrenDirective.js
│   │   ├── animateCss.js
│   │   ├── animateCssDriver.js
│   │   ├── animateJs.js
│   │   ├── animateJsDriver.js
│   │   ├── animateQueue.js
│   │   ├── animation.js
│   │   ├── module.js
│   │   ├── ngAnimateSwap.js
│   │   ├── rafScheduler.js
│   │   └── shared.js
│   ├── ngAria/
│   │   └── aria.js
│   ├── ngComponentRouter/
│   │   └── Router.js
│   ├── ngCookies/
│   │   ├── cookieWriter.js
│   │   └── cookies.js
│   ├── ngLocale/
│   │   ├── .eslintrc.json
│   │   ├── angular-locale_af-na.js
│   │   ├── angular-locale_af-za.js
│   │   ├── angular-locale_af.js
│   │   ├── angular-locale_agq-cm.js
│   │   ├── angular-locale_agq.js
│   │   ├── angular-locale_ak-gh.js
│   │   ├── angular-locale_ak.js
│   │   ├── angular-locale_am-et.js
│   │   ├── angular-locale_am.js
│   │   ├── angular-locale_ar-001.js
│   │   ├── angular-locale_ar-ae.js
│   │   ├── angular-locale_ar-bh.js
│   │   ├── angular-locale_ar-dj.js
│   │   ├── angular-locale_ar-dz.js
│   │   ├── angular-locale_ar-eg.js
│   │   ├── angular-locale_ar-eh.js
│   │   ├── angular-locale_ar-er.js
│   │   ├── angular-locale_ar-il.js
│   │   ├── angular-locale_ar-iq.js
│   │   ├── angular-locale_ar-jo.js
│   │   ├── angular-locale_ar-km.js
│   │   ├── angular-locale_ar-kw.js
│   │   ├── angular-locale_ar-lb.js
│   │   ├── angular-locale_ar-ly.js
│   │   ├── angular-locale_ar-ma.js
│   │   ├── angular-locale_ar-mr.js
│   │   ├── angular-locale_ar-om.js
│   │   ├── angular-locale_ar-ps.js
│   │   ├── angular-locale_ar-qa.js
│   │   ├── angular-locale_ar-sa.js
│   │   ├── angular-locale_ar-sd.js
│   │   ├── angular-locale_ar-so.js
│   │   ├── angular-locale_ar-ss.js
│   │   ├── angular-locale_ar-sy.js
│   │   ├── angular-locale_ar-td.js
│   │   ├── angular-locale_ar-tn.js
│   │   ├── angular-locale_ar-xb.js
│   │   ├── angular-locale_ar-ye.js
│   │   ├── angular-locale_ar.js
│   │   ├── angular-locale_as-in.js
│   │   ├── angular-locale_as.js
│   │   ├── angular-locale_asa-tz.js
│   │   ├── angular-locale_asa.js
│   │   ├── angular-locale_ast-es.js
│   │   ├── angular-locale_ast.js
│   │   ├── angular-locale_az-cyrl-az.js
│   │   ├── angular-locale_az-cyrl.js
│   │   ├── angular-locale_az-latn-az.js
│   │   ├── angular-locale_az-latn.js
│   │   ├── angular-locale_az.js
│   │   ├── angular-locale_bas-cm.js
│   │   ├── angular-locale_bas.js
│   │   ├── angular-locale_be-by.js
│   │   ├── angular-locale_be.js
│   │   ├── angular-locale_bem-zm.js
│   │   ├── angular-locale_bem.js
│   │   ├── angular-locale_bez-tz.js
│   │   ├── angular-locale_bez.js
│   │   ├── angular-locale_bg-bg.js
│   │   ├── angular-locale_bg.js
│   │   ├── angular-locale_bm-ml.js
│   │   ├── angular-locale_bm.js
│   │   ├── angular-locale_bn-bd.js
│   │   ├── angular-locale_bn-in.js
│   │   ├── angular-locale_bn.js
│   │   ├── angular-locale_bo-cn.js
│   │   ├── angular-locale_bo-in.js
│   │   ├── angular-locale_bo.js
│   │   ├── angular-locale_br-fr.js
│   │   ├── angular-locale_br.js
│   │   ├── angular-locale_brx-in.js
│   │   ├── angular-locale_brx.js
│   │   ├── angular-locale_bs-cyrl-ba.js
│   │   ├── angular-locale_bs-cyrl.js
│   │   ├── angular-locale_bs-latn-ba.js
│   │   ├── angular-locale_bs-latn.js
│   │   ├── angular-locale_bs.js
│   │   ├── angular-locale_ca-ad.js
│   │   ├── angular-locale_ca-es-valencia.js
│   │   ├── angular-locale_ca-es.js
│   │   ├── angular-locale_ca-fr.js
│   │   ├── angular-locale_ca-it.js
│   │   ├── angular-locale_ca.js
│   │   ├── angular-locale_ce-ru.js
│   │   ├── angular-locale_ce.js
│   │   ├── angular-locale_cgg-ug.js
│   │   ├── angular-locale_cgg.js
│   │   ├── angular-locale_chr-us.js
│   │   ├── angular-locale_chr.js
│   │   ├── angular-locale_ckb-arab-iq.js
│   │   ├── angular-locale_ckb-arab-ir.js
│   │   ├── angular-locale_ckb-arab.js
│   │   ├── angular-locale_ckb-iq.js
│   │   ├── angular-locale_ckb-ir.js
│   │   ├── angular-locale_ckb-latn-iq.js
│   │   ├── angular-locale_ckb-latn.js
│   │   ├── angular-locale_ckb.js
│   │   ├── angular-locale_cs-cz.js
│   │   ├── angular-locale_cs.js
│   │   ├── angular-locale_cu-ru.js
│   │   ├── angular-locale_cu.js
│   │   ├── angular-locale_cy-gb.js
│   │   ├── angular-locale_cy.js
│   │   ├── angular-locale_da-dk.js
│   │   ├── angular-locale_da-gl.js
│   │   ├── angular-locale_da.js
│   │   ├── angular-locale_dav-ke.js
│   │   ├── angular-locale_dav.js
│   │   ├── angular-locale_de-at.js
│   │   ├── angular-locale_de-be.js
│   │   ├── angular-locale_de-ch.js
│   │   ├── angular-locale_de-de.js
│   │   ├── angular-locale_de-it.js
│   │   ├── angular-locale_de-li.js
│   │   ├── angular-locale_de-lu.js
│   │   ├── angular-locale_de.js
│   │   ├── angular-locale_dje-ne.js
│   │   ├── angular-locale_dje.js
│   │   ├── angular-locale_dsb-de.js
│   │   ├── angular-locale_dsb.js
│   │   ├── angular-locale_dua-cm.js
│   │   ├── angular-locale_dua.js
│   │   ├── angular-locale_dyo-sn.js
│   │   ├── angular-locale_dyo.js
│   │   ├── angular-locale_dz-bt.js
│   │   ├── angular-locale_dz.js
│   │   ├── angular-locale_ebu-ke.js
│   │   ├── angular-locale_ebu.js
│   │   ├── angular-locale_ee-gh.js
│   │   ├── angular-locale_ee-tg.js
│   │   ├── angular-locale_ee.js
│   │   ├── angular-locale_el-cy.js
│   │   ├── angular-locale_el-gr.js
│   │   ├── angular-locale_el.js
│   │   ├── angular-locale_en-001.js
│   │   ├── angular-locale_en-150.js
│   │   ├── angular-locale_en-ag.js
│   │   ├── angular-locale_en-ai.js
│   │   ├── angular-locale_en-as.js
│   │   ├── angular-locale_en-at.js
│   │   ├── angular-locale_en-au.js
│   │   ├── angular-locale_en-bb.js
│   │   ├── angular-locale_en-be.js
│   │   ├── angular-locale_en-bi.js
│   │   ├── angular-locale_en-bm.js
│   │   ├── angular-locale_en-bs.js
│   │   ├── angular-locale_en-bw.js
│   │   ├── angular-locale_en-bz.js
│   │   ├── angular-locale_en-ca.js
│   │   ├── angular-locale_en-cc.js
│   │   ├── angular-locale_en-ch.js
│   │   ├── angular-locale_en-ck.js
│   │   ├── angular-locale_en-cm.js
│   │   ├── angular-locale_en-cx.js
│   │   ├── angular-locale_en-cy.js
│   │   ├── angular-locale_en-de.js
│   │   ├── angular-locale_en-dg.js
│   │   ├── angular-locale_en-dk.js
│   │   ├── angular-locale_en-dm.js
│   │   ├── angular-locale_en-er.js
│   │   ├── angular-locale_en-fi.js
│   │   ├── angular-locale_en-fj.js
│   │   ├── angular-locale_en-fk.js
│   │   ├── angular-locale_en-fm.js
│   │   ├── angular-locale_en-gb.js
│   │   ├── angular-locale_en-gd.js
│   │   ├── angular-locale_en-gg.js
│   │   ├── angular-locale_en-gh.js
│   │   ├── angular-locale_en-gi.js
│   │   ├── angular-locale_en-gm.js
│   │   ├── angular-locale_en-gu.js
│   │   ├── angular-locale_en-gy.js
│   │   ├── angular-locale_en-hk.js
│   │   ├── angular-locale_en-ie.js
│   │   ├── angular-locale_en-il.js
│   │   ├── angular-locale_en-im.js
│   │   ├── angular-locale_en-in.js
│   │   ├── angular-locale_en-io.js
│   │   ├── angular-locale_en-iso.js
│   │   ├── angular-locale_en-je.js
│   │   ├── angular-locale_en-jm.js
│   │   ├── angular-locale_en-ke.js
│   │   ├── angular-locale_en-ki.js
│   │   ├── angular-locale_en-kn.js
│   │   ├── angular-locale_en-ky.js
│   │   ├── angular-locale_en-lc.js
│   │   ├── angular-locale_en-lr.js
│   │   ├── angular-locale_en-ls.js
│   │   ├── angular-locale_en-mg.js
│   │   ├── angular-locale_en-mh.js
│   │   ├── angular-locale_en-mo.js
│   │   ├── angular-locale_en-mp.js
│   │   ├── angular-locale_en-ms.js
│   │   ├── angular-locale_en-mt.js
│   │   ├── angular-locale_en-mu.js
│   │   ├── angular-locale_en-mw.js
│   │   ├── angular-locale_en-my.js
│   │   ├── angular-locale_en-na.js
│   │   ├── angular-locale_en-nf.js
│   │   ├── angular-locale_en-ng.js
│   │   ├── angular-locale_en-nl.js
│   │   ├── angular-locale_en-nr.js
│   │   ├── angular-locale_en-nu.js
│   │   ├── angular-locale_en-nz.js
│   │   ├── angular-locale_en-pg.js
│   │   ├── angular-locale_en-ph.js
│   │   ├── angular-locale_en-pk.js
│   │   ├── angular-locale_en-pn.js
│   │   ├── angular-locale_en-pr.js
│   │   ├── angular-locale_en-pw.js
│   │   ├── angular-locale_en-rw.js
│   │   ├── angular-locale_en-sb.js
│   │   ├── angular-locale_en-sc.js
│   │   ├── angular-locale_en-sd.js
│   │   ├── angular-locale_en-se.js
│   │   ├── angular-locale_en-sg.js
│   │   ├── angular-locale_en-sh.js
│   │   ├── angular-locale_en-si.js
│   │   ├── angular-locale_en-sl.js
│   │   ├── angular-locale_en-ss.js
│   │   ├── angular-locale_en-sx.js
│   │   ├── angular-locale_en-sz.js
│   │   ├── angular-locale_en-tc.js
│   │   ├── angular-locale_en-tk.js
│   │   ├── angular-locale_en-to.js
│   │   ├── angular-locale_en-tt.js
│   │   ├── angular-locale_en-tv.js
│   │   ├── angular-locale_en-tz.js
│   │   ├── angular-locale_en-ug.js
│   │   ├── angular-locale_en-um.js
│   │   ├── angular-locale_en-us-posix.js
│   │   ├── angular-locale_en-us.js
│   │   ├── angular-locale_en-vc.js
│   │   ├── angular-locale_en-vg.js
│   │   ├── angular-locale_en-vi.js
│   │   ├── angular-locale_en-vu.js
│   │   ├── angular-locale_en-ws.js
│   │   ├── angular-locale_en-xa.js
│   │   ├── angular-locale_en-za.js
│   │   ├── angular-locale_en-zm.js
│   │   ├── angular-locale_en-zw.js
│   │   ├── angular-locale_en.js
│   │   ├── angular-locale_eo-001.js
│   │   ├── angular-locale_eo.js
│   │   ├── angular-locale_es-419.js
│   │   ├── angular-locale_es-ar.js
│   │   ├── angular-locale_es-bo.js
│   │   ├── angular-locale_es-br.js
│   │   ├── angular-locale_es-bz.js
│   │   ├── angular-locale_es-cl.js
│   │   ├── angular-locale_es-co.js
│   │   ├── angular-locale_es-cr.js
│   │   ├── angular-locale_es-cu.js
│   │   ├── angular-locale_es-do.js
│   │   ├── angular-locale_es-ea.js
│   │   ├── angular-locale_es-ec.js
│   │   ├── angular-locale_es-es.js
│   │   ├── angular-locale_es-gq.js
│   │   ├── angular-locale_es-gt.js
│   │   ├── angular-locale_es-hn.js
│   │   ├── angular-locale_es-ic.js
│   │   ├── angular-locale_es-mx.js
│   │   ├── angular-locale_es-ni.js
│   │   ├── angular-locale_es-pa.js
│   │   ├── angular-locale_es-pe.js
│   │   ├── angular-locale_es-ph.js
│   │   ├── angular-locale_es-pr.js
│   │   ├── angular-locale_es-py.js
│   │   ├── angular-locale_es-sv.js
│   │   ├── angular-locale_es-us.js
│   │   ├── angular-locale_es-uy.js
│   │   ├── angular-locale_es-ve.js
│   │   ├── angular-locale_es.js
│   │   ├── angular-locale_et-ee.js
│   │   ├── angular-locale_et.js
│   │   ├── angular-locale_eu-es.js
│   │   ├── angular-locale_eu.js
│   │   ├── angular-locale_ewo-cm.js
│   │   ├── angular-locale_ewo.js
│   │   ├── angular-locale_fa-af.js
│   │   ├── angular-locale_fa-ir.js
│   │   ├── angular-locale_fa.js
│   │   ├── angular-locale_ff-cm.js
│   │   ├── angular-locale_ff-gn.js
│   │   ├── angular-locale_ff-mr.js
│   │   ├── angular-locale_ff-sn.js
│   │   ├── angular-locale_ff.js
│   │   ├── angular-locale_fi-fi.js
│   │   ├── angular-locale_fi.js
│   │   ├── angular-locale_fil-ph.js
│   │   ├── angular-locale_fil.js
│   │   ├── angular-locale_fo-dk.js
│   │   ├── angular-locale_fo-fo.js
│   │   ├── angular-locale_fo.js
│   │   ├── angular-locale_fr-be.js
│   │   ├── angular-locale_fr-bf.js
│   │   ├── angular-locale_fr-bi.js
│   │   ├── angular-locale_fr-bj.js
│   │   ├── angular-locale_fr-bl.js
│   │   ├── angular-locale_fr-ca.js
│   │   ├── angular-locale_fr-cd.js
│   │   ├── angular-locale_fr-cf.js
│   │   ├── angular-locale_fr-cg.js
│   │   ├── angular-locale_fr-ch.js
│   │   ├── angular-locale_fr-ci.js
│   │   ├── angular-locale_fr-cm.js
│   │   ├── angular-locale_fr-dj.js
│   │   ├── angular-locale_fr-dz.js
│   │   ├── angular-locale_fr-fr.js
│   │   ├── angular-locale_fr-ga.js
│   │   ├── angular-locale_fr-gf.js
│   │   ├── angular-locale_fr-gn.js
│   │   ├── angular-locale_fr-gp.js
│   │   ├── angular-locale_fr-gq.js
│   │   ├── angular-locale_fr-ht.js
│   │   ├── angular-locale_fr-km.js
│   │   ├── angular-locale_fr-lu.js
│   │   ├── angular-locale_fr-ma.js
│   │   ├── angular-locale_fr-mc.js
│   │   ├── angular-locale_fr-mf.js
│   │   ├── angular-locale_fr-mg.js
│   │   ├── angular-locale_fr-ml.js
│   │   ├── angular-locale_fr-mq.js
│   │   ├── angular-locale_fr-mr.js
│   │   ├── angular-locale_fr-mu.js
│   │   ├── angular-locale_fr-nc.js
│   │   ├── angular-locale_fr-ne.js
│   │   ├── angular-locale_fr-pf.js
│   │   ├── angular-locale_fr-pm.js
│   │   ├── angular-locale_fr-re.js
│   │   ├── angular-locale_fr-rw.js
│   │   ├── angular-locale_fr-sc.js
│   │   ├── angular-locale_fr-sn.js
│   │   ├── angular-locale_fr-sy.js
│   │   ├── angular-locale_fr-td.js
│   │   ├── angular-locale_fr-tg.js
│   │   ├── angular-locale_fr-tn.js
│   │   ├── angular-locale_fr-vu.js
│   │   ├── angular-locale_fr-wf.js
│   │   ├── angular-locale_fr-yt.js
│   │   ├── angular-locale_fr.js
│   │   ├── angular-locale_fur-it.js
│   │   ├── angular-locale_fur.js
│   │   ├── angular-locale_fy-nl.js
│   │   ├── angular-locale_fy.js
│   │   ├── angular-locale_ga-ie.js
│   │   ├── angular-locale_ga.js
│   │   ├── angular-locale_gd-gb.js
│   │   ├── angular-locale_gd.js
│   │   ├── angular-locale_gl-es.js
│   │   ├── angular-locale_gl.js
│   │   ├── angular-locale_gsw-ch.js
│   │   ├── angular-locale_gsw-fr.js
│   │   ├── angular-locale_gsw-li.js
│   │   ├── angular-locale_gsw.js
│   │   ├── angular-locale_gu-in.js
│   │   ├── angular-locale_gu.js
│   │   ├── angular-locale_guz-ke.js
│   │   ├── angular-locale_guz.js
│   │   ├── angular-locale_gv-im.js
│   │   ├── angular-locale_gv.js
│   │   ├── angular-locale_ha-gh.js
│   │   ├── angular-locale_ha-ne.js
│   │   ├── angular-locale_ha-ng.js
│   │   ├── angular-locale_ha.js
│   │   ├── angular-locale_haw-us.js
│   │   ├── angular-locale_haw.js
│   │   ├── angular-locale_he-il.js
│   │   ├── angular-locale_he.js
│   │   ├── angular-locale_hi-in.js
│   │   ├── angular-locale_hi.js
│   │   ├── angular-locale_hr-ba.js
│   │   ├── angular-locale_hr-hr.js
│   │   ├── angular-locale_hr.js
│   │   ├── angular-locale_hsb-de.js
│   │   ├── angular-locale_hsb.js
│   │   ├── angular-locale_hu-hu.js
│   │   ├── angular-locale_hu.js
│   │   ├── angular-locale_hy-am.js
│   │   ├── angular-locale_hy.js
│   │   ├── angular-locale_id-id.js
│   │   ├── angular-locale_id.js
│   │   ├── angular-locale_ig-ng.js
│   │   ├── angular-locale_ig.js
│   │   ├── angular-locale_ii-cn.js
│   │   ├── angular-locale_ii.js
│   │   ├── angular-locale_in.js
│   │   ├── angular-locale_is-is.js
│   │   ├── angular-locale_is.js
│   │   ├── angular-locale_it-ch.js
│   │   ├── angular-locale_it-it.js
│   │   ├── angular-locale_it-sm.js
│   │   ├── angular-locale_it-va.js
│   │   ├── angular-locale_it.js
│   │   ├── angular-locale_iw.js
│   │   ├── angular-locale_ja-jp.js
│   │   ├── angular-locale_ja.js
│   │   ├── angular-locale_jgo-cm.js
│   │   ├── angular-locale_jgo.js
│   │   ├── angular-locale_jmc-tz.js
│   │   ├── angular-locale_jmc.js
│   │   ├── angular-locale_ka-ge.js
│   │   ├── angular-locale_ka.js
│   │   ├── angular-locale_kab-dz.js
│   │   ├── angular-locale_kab.js
│   │   ├── angular-locale_kam-ke.js
│   │   ├── angular-locale_kam.js
│   │   ├── angular-locale_kde-tz.js
│   │   ├── angular-locale_kde.js
│   │   ├── angular-locale_kea-cv.js
│   │   ├── angular-locale_kea.js
│   │   ├── angular-locale_khq-ml.js
│   │   ├── angular-locale_khq.js
│   │   ├── angular-locale_ki-ke.js
│   │   ├── angular-locale_ki.js
│   │   ├── angular-locale_kk-kz.js
│   │   ├── angular-locale_kk.js
│   │   ├── angular-locale_kkj-cm.js
│   │   ├── angular-locale_kkj.js
│   │   ├── angular-locale_kl-gl.js
│   │   ├── angular-locale_kl.js
│   │   ├── angular-locale_kln-ke.js
│   │   ├── angular-locale_kln.js
│   │   ├── angular-locale_km-kh.js
│   │   ├── angular-locale_km.js
│   │   ├── angular-locale_kn-in.js
│   │   ├── angular-locale_kn.js
│   │   ├── angular-locale_ko-kp.js
│   │   ├── angular-locale_ko-kr.js
│   │   ├── angular-locale_ko.js
│   │   ├── angular-locale_kok-in.js
│   │   ├── angular-locale_kok.js
│   │   ├── angular-locale_ks-in.js
│   │   ├── angular-locale_ks.js
│   │   ├── angular-locale_ksb-tz.js
│   │   ├── angular-locale_ksb.js
│   │   ├── angular-locale_ksf-cm.js
│   │   ├── angular-locale_ksf.js
│   │   ├── angular-locale_ksh-de.js
│   │   ├── angular-locale_ksh.js
│   │   ├── angular-locale_kw-gb.js
│   │   ├── angular-locale_kw.js
│   │   ├── angular-locale_ky-kg.js
│   │   ├── angular-locale_ky.js
│   │   ├── angular-locale_lag-tz.js
│   │   ├── angular-locale_lag.js
│   │   ├── angular-locale_lb-lu.js
│   │   ├── angular-locale_lb.js
│   │   ├── angular-locale_lg-ug.js
│   │   ├── angular-locale_lg.js
│   │   ├── angular-locale_lkt-us.js
│   │   ├── angular-locale_lkt.js
│   │   ├── angular-locale_ln-ao.js
│   │   ├── angular-locale_ln-cd.js
│   │   ├── angular-locale_ln-cf.js
│   │   ├── angular-locale_ln-cg.js
│   │   ├── angular-locale_ln.js
│   │   ├── angular-locale_lo-la.js
│   │   ├── angular-locale_lo.js
│   │   ├── angular-locale_lrc-iq.js
│   │   ├── angular-locale_lrc-ir.js
│   │   ├── angular-locale_lrc.js
│   │   ├── angular-locale_lt-lt.js
│   │   ├── angular-locale_lt.js
│   │   ├── angular-locale_lu-cd.js
│   │   ├── angular-locale_lu.js
│   │   ├── angular-locale_luo-ke.js
│   │   ├── angular-locale_luo.js
│   │   ├── angular-locale_luy-ke.js
│   │   ├── angular-locale_luy.js
│   │   ├── angular-locale_lv-lv.js
│   │   ├── angular-locale_lv.js
│   │   ├── angular-locale_mas-ke.js
│   │   ├── angular-locale_mas-tz.js
│   │   ├── angular-locale_mas.js
│   │   ├── angular-locale_mer-ke.js
│   │   ├── angular-locale_mer.js
│   │   ├── angular-locale_mfe-mu.js
│   │   ├── angular-locale_mfe.js
│   │   ├── angular-locale_mg-mg.js
│   │   ├── angular-locale_mg.js
│   │   ├── angular-locale_mgh-mz.js
│   │   ├── angular-locale_mgh.js
│   │   ├── angular-locale_mgo-cm.js
│   │   ├── angular-locale_mgo.js
│   │   ├── angular-locale_mk-mk.js
│   │   ├── angular-locale_mk.js
│   │   ├── angular-locale_ml-in.js
│   │   ├── angular-locale_ml.js
│   │   ├── angular-locale_mn-mn.js
│   │   ├── angular-locale_mn.js
│   │   ├── angular-locale_mo.js
│   │   ├── angular-locale_mr-in.js
│   │   ├── angular-locale_mr.js
│   │   ├── angular-locale_ms-bn.js
│   │   ├── angular-locale_ms-my.js
│   │   ├── angular-locale_ms-sg.js
│   │   ├── angular-locale_ms.js
│   │   ├── angular-locale_mt-mt.js
│   │   ├── angular-locale_mt.js
│   │   ├── angular-locale_mua-cm.js
│   │   ├── angular-locale_mua.js
│   │   ├── angular-locale_my-mm.js
│   │   ├── angular-locale_my.js
│   │   ├── angular-locale_mzn-ir.js
│   │   ├── angular-locale_mzn.js
│   │   ├── angular-locale_naq-na.js
│   │   ├── angular-locale_naq.js
│   │   ├── angular-locale_nb-no.js
│   │   ├── angular-locale_nb-sj.js
│   │   ├── angular-locale_nb.js
│   │   ├── angular-locale_nd-zw.js
│   │   ├── angular-locale_nd.js
│   │   ├── angular-locale_nds-de.js
│   │   ├── angular-locale_nds-nl.js
│   │   ├── angular-locale_nds.js
│   │   ├── angular-locale_ne-in.js
│   │   ├── angular-locale_ne-np.js
│   │   ├── angular-locale_ne.js
│   │   ├── angular-locale_nl-aw.js
│   │   ├── angular-locale_nl-be.js
│   │   ├── angular-locale_nl-bq.js
│   │   ├── angular-locale_nl-cw.js
│   │   ├── angular-locale_nl-nl.js
│   │   ├── angular-locale_nl-sr.js
│   │   ├── angular-locale_nl-sx.js
│   │   ├── angular-locale_nl.js
│   │   ├── angular-locale_nmg-cm.js
│   │   ├── angular-locale_nmg.js
│   │   ├── angular-locale_nn-no.js
│   │   ├── angular-locale_nn.js
│   │   ├── angular-locale_nnh-cm.js
│   │   ├── angular-locale_nnh.js
│   │   ├── angular-locale_no-no.js
│   │   ├── angular-locale_no.js
│   │   ├── angular-locale_nus-ss.js
│   │   ├── angular-locale_nus.js
│   │   ├── angular-locale_nyn-ug.js
│   │   ├── angular-locale_nyn.js
│   │   ├── angular-locale_om-et.js
│   │   ├── angular-locale_om-ke.js
│   │   ├── angular-locale_om.js
│   │   ├── angular-locale_or-in.js
│   │   ├── angular-locale_or.js
│   │   ├── angular-locale_os-ge.js
│   │   ├── angular-locale_os-ru.js
│   │   ├── angular-locale_os.js
│   │   ├── angular-locale_pa-arab-pk.js
│   │   ├── angular-locale_pa-arab.js
│   │   ├── angular-locale_pa-guru-in.js
│   │   ├── angular-locale_pa-guru.js
│   │   ├── angular-locale_pa.js
│   │   ├── angular-locale_pl-pl.js
│   │   ├── angular-locale_pl.js
│   │   ├── angular-locale_prg-001.js
│   │   ├── angular-locale_prg.js
│   │   ├── angular-locale_ps-af.js
│   │   ├── angular-locale_ps.js
│   │   ├── angular-locale_pt-ao.js
│   │   ├── angular-locale_pt-br.js
│   │   ├── angular-locale_pt-ch.js
│   │   ├── angular-locale_pt-cv.js
│   │   ├── angular-locale_pt-gq.js
│   │   ├── angular-locale_pt-gw.js
│   │   ├── angular-locale_pt-lu.js
│   │   ├── angular-locale_pt-mo.js
│   │   ├── angular-locale_pt-mz.js
│   │   ├── angular-locale_pt-pt.js
│   │   ├── angular-locale_pt-st.js
│   │   ├── angular-locale_pt-tl.js
│   │   ├── angular-locale_pt.js
│   │   ├── angular-locale_qu-bo.js
│   │   ├── angular-locale_qu-ec.js
│   │   ├── angular-locale_qu-pe.js
│   │   ├── angular-locale_qu.js
│   │   ├── angular-locale_rm-ch.js
│   │   ├── angular-locale_rm.js
│   │   ├── angular-locale_rn-bi.js
│   │   ├── angular-locale_rn.js
│   │   ├── angular-locale_ro-md.js
│   │   ├── angular-locale_ro-ro.js
│   │   ├── angular-locale_ro.js
│   │   ├── angular-locale_rof-tz.js
│   │   ├── angular-locale_rof.js
│   │   ├── angular-locale_ru-by.js
│   │   ├── angular-locale_ru-kg.js
│   │   ├── angular-locale_ru-kz.js
│   │   ├── angular-locale_ru-md.js
│   │   ├── angular-locale_ru-ru.js
│   │   ├── angular-locale_ru-ua.js
│   │   ├── angular-locale_ru.js
│   │   ├── angular-locale_rw-rw.js
│   │   ├── angular-locale_rw.js
│   │   ├── angular-locale_rwk-tz.js
│   │   ├── angular-locale_rwk.js
│   │   ├── angular-locale_sah-ru.js
│   │   ├── angular-locale_sah.js
│   │   ├── angular-locale_saq-ke.js
│   │   ├── angular-locale_saq.js
│   │   ├── angular-locale_sbp-tz.js
│   │   ├── angular-locale_sbp.js
│   │   ├── angular-locale_se-fi.js
│   │   ├── angular-locale_se-no.js
│   │   ├── angular-locale_se-se.js
│   │   ├── angular-locale_se.js
│   │   ├── angular-locale_seh-mz.js
│   │   ├── angular-locale_seh.js
│   │   ├── angular-locale_ses-ml.js
│   │   ├── angular-locale_ses.js
│   │   ├── angular-locale_sg-cf.js
│   │   ├── angular-locale_sg.js
│   │   ├── angular-locale_sh.js
│   │   ├── angular-locale_shi-latn-ma.js
│   │   ├── angular-locale_shi-latn.js
│   │   ├── angular-locale_shi-tfng-ma.js
│   │   ├── angular-locale_shi-tfng.js
│   │   ├── angular-locale_shi.js
│   │   ├── angular-locale_si-lk.js
│   │   ├── angular-locale_si.js
│   │   ├── angular-locale_sk-sk.js
│   │   ├── angular-locale_sk.js
│   │   ├── angular-locale_sl-si.js
│   │   ├── angular-locale_sl.js
│   │   ├── angular-locale_smn-fi.js
│   │   ├── angular-locale_smn.js
│   │   ├── angular-locale_sn-zw.js
│   │   ├── angular-locale_sn.js
│   │   ├── angular-locale_so-dj.js
│   │   ├── angular-locale_so-et.js
│   │   ├── angular-locale_so-ke.js
│   │   ├── angular-locale_so-so.js
│   │   ├── angular-locale_so.js
│   │   ├── angular-locale_sq-al.js
│   │   ├── angular-locale_sq-mk.js
│   │   ├── angular-locale_sq-xk.js
│   │   ├── angular-locale_sq.js
│   │   ├── angular-locale_sr-cyrl-ba.js
│   │   ├── angular-locale_sr-cyrl-me.js
│   │   ├── angular-locale_sr-cyrl-rs.js
│   │   ├── angular-locale_sr-cyrl-xk.js
│   │   ├── angular-locale_sr-cyrl.js
│   │   ├── angular-locale_sr-latn-ba.js
│   │   ├── angular-locale_sr-latn-me.js
│   │   ├── angular-locale_sr-latn-rs.js
│   │   ├── angular-locale_sr-latn-xk.js
│   │   ├── angular-locale_sr-latn.js
│   │   ├── angular-locale_sr.js
│   │   ├── angular-locale_sv-ax.js
│   │   ├── angular-locale_sv-fi.js
│   │   ├── angular-locale_sv-se.js
│   │   ├── angular-locale_sv.js
│   │   ├── angular-locale_sw-cd.js
│   │   ├── angular-locale_sw-ke.js
│   │   ├── angular-locale_sw-tz.js
│   │   ├── angular-locale_sw-ug.js
│   │   ├── angular-locale_sw.js
│   │   ├── angular-locale_ta-in.js
│   │   ├── angular-locale_ta-lk.js
│   │   ├── angular-locale_ta-my.js
│   │   ├── angular-locale_ta-sg.js
│   │   ├── angular-locale_ta.js
│   │   ├── angular-locale_te-in.js
│   │   ├── angular-locale_te.js
│   │   ├── angular-locale_teo-ke.js
│   │   ├── angular-locale_teo-ug.js
│   │   ├── angular-locale_teo.js
│   │   ├── angular-locale_th-th.js
│   │   ├── angular-locale_th.js
│   │   ├── angular-locale_ti-er.js
│   │   ├── angular-locale_ti-et.js
│   │   ├── angular-locale_ti.js
│   │   ├── angular-locale_tk-tm.js
│   │   ├── angular-locale_tk.js
│   │   ├── angular-locale_tl.js
│   │   ├── angular-locale_to-to.js
│   │   ├── angular-locale_to.js
│   │   ├── angular-locale_tr-cy.js
│   │   ├── angular-locale_tr-tr.js
│   │   ├── angular-locale_tr.js
│   │   ├── angular-locale_twq-ne.js
│   │   ├── angular-locale_twq.js
│   │   ├── angular-locale_tzm-ma.js
│   │   ├── angular-locale_tzm.js
│   │   ├── angular-locale_ug-cn.js
│   │   ├── angular-locale_ug.js
│   │   ├── angular-locale_uk-ua.js
│   │   ├── angular-locale_uk.js
│   │   ├── angular-locale_ur-in.js
│   │   ├── angular-locale_ur-pk.js
│   │   ├── angular-locale_ur.js
│   │   ├── angular-locale_uz-arab-af.js
│   │   ├── angular-locale_uz-arab.js
│   │   ├── angular-locale_uz-cyrl-uz.js
│   │   ├── angular-locale_uz-cyrl.js
│   │   ├── angular-locale_uz-latn-uz.js
│   │   ├── angular-locale_uz-latn.js
│   │   ├── angular-locale_uz.js
│   │   ├── angular-locale_vai-latn-lr.js
│   │   ├── angular-locale_vai-latn.js
│   │   ├── angular-locale_vai-vaii-lr.js
│   │   ├── angular-locale_vai-vaii.js
│   │   ├── angular-locale_vai.js
│   │   ├── angular-locale_vi-vn.js
│   │   ├── angular-locale_vi.js
│   │   ├── angular-locale_vo-001.js
│   │   ├── angular-locale_vo.js
│   │   ├── angular-locale_vun-tz.js
│   │   ├── angular-locale_vun.js
│   │   ├── angular-locale_wae-ch.js
│   │   ├── angular-locale_wae.js
│   │   ├── angular-locale_xog-ug.js
│   │   ├── angular-locale_xog.js
│   │   ├── angular-locale_yav-cm.js
│   │   ├── angular-locale_yav.js
│   │   ├── angular-locale_yi-001.js
│   │   ├── angular-locale_yi.js
│   │   ├── angular-locale_yo-bj.js
│   │   ├── angular-locale_yo-ng.js
│   │   ├── angular-locale_yo.js
│   │   ├── angular-locale_yue-hk.js
│   │   ├── angular-locale_yue.js
│   │   ├── angular-locale_zgh-ma.js
│   │   ├── angular-locale_zgh.js
│   │   ├── angular-locale_zh-cn.js
│   │   ├── angular-locale_zh-hans-cn.js
│   │   ├── angular-locale_zh-hans-hk.js
│   │   ├── angular-locale_zh-hans-mo.js
│   │   ├── angular-locale_zh-hans-sg.js
│   │   ├── angular-locale_zh-hans.js
│   │   ├── angular-locale_zh-hant-hk.js
│   │   ├── angular-locale_zh-hant-mo.js
│   │   ├── angular-locale_zh-hant-tw.js
│   │   ├── angular-locale_zh-hant.js
│   │   ├── angular-locale_zh-hk.js
│   │   ├── angular-locale_zh-tw.js
│   │   ├── angular-locale_zh.js
│   │   ├── angular-locale_zu-za.js
│   │   └── angular-locale_zu.js
│   ├── ngMessageFormat/
│   │   ├── .eslintrc.json
│   │   ├── messageFormatCommon.js
│   │   ├── messageFormatInterpolationParts.js
│   │   ├── messageFormatParser.js
│   │   ├── messageFormatSelector.js
│   │   └── messageFormatService.js
│   ├── ngMessages/
│   │   └── messages.js
│   ├── ngMock/
│   │   ├── .eslintrc.json
│   │   ├── angular-mocks.js
│   │   └── browserTrigger.js
│   ├── ngParseExt/
│   │   ├── module.js
│   │   └── ucd.js
│   ├── ngResource/
│   │   └── resource.js
│   ├── ngRoute/
│   │   ├── .eslintrc.json
│   │   ├── directive/
│   │   │   └── ngView.js
│   │   ├── route.js
│   │   └── routeParams.js
│   ├── ngSanitize/
│   │   ├── .eslintrc.json
│   │   ├── filter/
│   │   │   └── linky.js
│   │   └── sanitize.js
│   ├── ngTouch/
│   │   ├── .eslintrc.json
│   │   ├── directive/
│   │   │   └── ngSwipe.js
│   │   ├── swipe.js
│   │   └── touch.js
│   ├── publishExternalApis.js
│   ├── routeToRegExp.js
│   ├── shallowCopy.js
│   └── stringify.js
├── test/
│   ├── .eslintrc.json
│   ├── AngularSpec.js
│   ├── ApiSpecs.js
│   ├── BinderSpec.js
│   ├── auto/
│   │   └── injectorSpec.js
│   ├── e2e/
│   │   ├── fixtures/
│   │   │   ├── .eslintrc.json
│   │   │   ├── anchor-scroll/
│   │   │   │   ├── index.html
│   │   │   │   └── script.js
│   │   │   ├── anchor-scroll-y-offset/
│   │   │   │   ├── index.html
│   │   │   │   └── script.js
│   │   │   ├── angularjs-already-loaded/
│   │   │   │   ├── index.html
│   │   │   │   └── script.js
│   │   │   ├── back2dom/
│   │   │   │   ├── index.html
│   │   │   │   └── script.js
│   │   │   ├── base-tag/
│   │   │   │   ├── index.html
│   │   │   │   └── script.js
│   │   │   ├── directive-require-html/
│   │   │   │   ├── index.html
│   │   │   │   └── script.js
│   │   │   ├── http/
│   │   │   │   ├── index.html
│   │   │   │   └── script.js
│   │   │   ├── input-hidden/
│   │   │   │   └── index.html
│   │   │   ├── loader/
│   │   │   │   ├── index.html
│   │   │   │   └── script.js
│   │   │   ├── ng-jq/
│   │   │   │   ├── index.html
│   │   │   │   └── script.js
│   │   │   ├── ng-jq-jquery/
│   │   │   │   ├── index.html
│   │   │   │   └── script.js
│   │   │   ├── ng-route-promise/
│   │   │   │   ├── index.html
│   │   │   │   └── script.js
│   │   │   ├── ready/
│   │   │   │   ├── index.html
│   │   │   │   └── script.js
│   │   │   ├── sample/
│   │   │   │   ├── index.html
│   │   │   │   └── script.js
│   │   │   └── version/
│   │   │       └── index.html
│   │   ├── tests/
│   │   │   ├── .eslintrc.json
│   │   │   ├── anchor-scroll.spec.js
│   │   │   ├── angularjs-already-loaded.spec.js
│   │   │   ├── base-tag.spec.js
│   │   │   ├── directive-require-html.spec.js
│   │   │   ├── helpers/
│   │   │   │   └── main.js
│   │   │   ├── http.spec.js
│   │   │   ├── input-hidden.spec.js
│   │   │   ├── loader.spec.js
│   │   │   ├── ng-jq.spec.js
│   │   │   ├── ng-route-promise.spec.js
│   │   │   ├── ready.spec.js
│   │   │   ├── sample.spec.js
│   │   │   └── version.spec.js
│   │   └── tools/
│   │       ├── .eslintrc.json
│   │       ├── fixture.js
│   │       ├── index.js
│   │       ├── middleware.js
│   │       └── util.js
│   ├── helpers/
│   │   ├── matchers.js
│   │   ├── privateMocks.js
│   │   ├── privateMocksSpec.js
│   │   ├── support.js
│   │   ├── supportSpec.js
│   │   └── testabilityPatch.js
│   ├── jQueryPatchSpec.js
│   ├── jqLiteSpec.js
│   ├── jquery_alias.js
│   ├── jquery_remove.js
│   ├── loaderSpec.js
│   ├── minErrSpec.js
│   ├── modules/
│   │   └── no_bootstrap.js
│   ├── ng/
│   │   ├── anchorScrollSpec.js
│   │   ├── animateCssSpec.js
│   │   ├── animateRunnerSpec.js
│   │   ├── animateSpec.js
│   │   ├── browserSpecs.js
│   │   ├── cacheFactorySpec.js
│   │   ├── compileSpec.js
│   │   ├── controllerSpec.js
│   │   ├── cookieReaderSpec.js
│   │   ├── directive/
│   │   │   ├── aSpec.js
│   │   │   ├── booleanAttrsSpec.js
│   │   │   ├── formSpec.js
│   │   │   ├── inputSpec.js
│   │   │   ├── ngBindSpec.js
│   │   │   ├── ngChangeSpec.js
│   │   │   ├── ngClassSpec.js
│   │   │   ├── ngClickSpec.js
│   │   │   ├── ngCloakSpec.js
│   │   │   ├── ngControllerSpec.js
│   │   │   ├── ngEventDirsSpec.js
│   │   │   ├── ngHrefSpec.js
│   │   │   ├── ngIfSpec.js
│   │   │   ├── ngIncludeSpec.js
│   │   │   ├── ngInitSpec.js
│   │   │   ├── ngKeySpec.js
│   │   │   ├── ngListSpec.js
│   │   │   ├── ngModelOptionsSpec.js
│   │   │   ├── ngModelSpec.js
│   │   │   ├── ngNonBindableSpec.js
│   │   │   ├── ngOptionsSpec.js
│   │   │   ├── ngPluralizeSpec.js
│   │   │   ├── ngRefSpec.js
│   │   │   ├── ngRepeatSpec.js
│   │   │   ├── ngShowHideSpec.js
│   │   │   ├── ngSrcSpec.js
│   │   │   ├── ngSrcsetSpec.js
│   │   │   ├── ngStyleSpec.js
│   │   │   ├── ngSwitchSpec.js
│   │   │   ├── scriptSpec.js
│   │   │   ├── selectSpec.js
│   │   │   ├── styleSpec.js
│   │   │   └── validatorsSpec.js
│   │   ├── documentSpec.js
│   │   ├── exceptionHandlerSpec.js
│   │   ├── filter/
│   │   │   ├── filterSpec.js
│   │   │   ├── filtersSpec.js
│   │   │   ├── limitToSpec.js
│   │   │   └── orderBySpec.js
│   │   ├── filterSpec.js
│   │   ├── forceReflowSpec.js
│   │   ├── httpBackendSpec.js
│   │   ├── httpSpec.js
│   │   ├── interpolateSpec.js
│   │   ├── intervalSpec.js
│   │   ├── jsonpCallbacksSpec.js
│   │   ├── localeSpec.js
│   │   ├── locationSpec.js
│   │   ├── logSpec.js
│   │   ├── ngOnSpec.js
│   │   ├── ngPropSpec.js
│   │   ├── parseSpec.js
│   │   ├── qSpec.js
│   │   ├── rafSpec.js
│   │   ├── rootElementSpec.js
│   │   ├── rootScopeSpec.js
│   │   ├── sanitizeUriSpec.js
│   │   ├── sceSpecs.js
│   │   ├── snifferSpec.js
│   │   ├── templateRequestSpec.js
│   │   ├── testabilitySpec.js
│   │   ├── timeoutSpec.js
│   │   ├── urlUtilsSpec.js
│   │   └── windowSpec.js
│   ├── ngAnimate/
│   │   ├── .eslintrc.json
│   │   ├── animateCacheSpec.js
│   │   ├── animateCssDriverSpec.js
│   │   ├── animateCssSpec.js
│   │   ├── animateJsDriverSpec.js
│   │   ├── animateJsSpec.js
│   │   ├── animateSpec.js
│   │   ├── animationHelperFunctionsSpec.js
│   │   ├── animationSpec.js
│   │   ├── integrationSpec.js
│   │   ├── ngAnimateSwapSpec.js
│   │   └── rafSchedulerSpec.js
│   ├── ngAria/
│   │   └── ariaSpec.js
│   ├── ngCookies/
│   │   ├── cookieWriterSpec.js
│   │   └── cookiesSpec.js
│   ├── ngMessageFormat/
│   │   └── messageFormatSpec.js
│   ├── ngMessages/
│   │   └── messagesSpec.js
│   ├── ngMock/
│   │   └── angular-mocksSpec.js
│   ├── ngResource/
│   │   └── resourceSpec.js
│   ├── ngRoute/
│   │   ├── directive/
│   │   │   └── ngViewSpec.js
│   │   ├── routeParamsSpec.js
│   │   └── routeSpec.js
│   ├── ngSanitize/
│   │   ├── directive/
│   │   │   └── ngBindHtmlSpec.js
│   │   ├── filter/
│   │   │   └── linkySpec.js
│   │   └── sanitizeSpec.js
│   ├── ngTouch/
│   │   ├── directive/
│   │   │   └── ngSwipeSpec.js
│   │   └── swipeSpec.js
│   └── stringifySpec.js
└── vendor/
    ├── README.md
    ├── closure-compiler/
    │   ├── COPYING
    │   ├── README.md
    │   └── compiler.jar
    └── ng-closure-runner/
        ├── LICENSE
        ├── README.md
        └── ngcompiler.jar

================================================
FILE CONTENTS
================================================

================================================
FILE: .circleci/config.yml
================================================
# Configuration file for https://circleci.com/gh/angular/angular.js

# Note: YAML anchors allow an object to be re-used, reducing duplication.
# The ampersand declares an alias for an object, then later the `<<: *name`
# syntax dereferences it.
# See http://blog.daemonl.com/2016/02/yaml.html
# To validate changes, use an online parser, eg.
# http://yaml-online-parser.appspot.com/

# CircleCI configuration version
# Version 2.1 allows for extra config reuse features
# https://circleci.com/docs/2.0/reusing-config/#getting-started-with-config-reuse
version: 2.1

# Workspace persisted by the `setup` job to share build artifacts with other jobs.
# https://circleci.com/docs/2.0/workflows/#using-workspaces-to-share-data-among-jobs
# https://circleci.com/blog/deep-diving-into-circleci-workspaces/
var_workspace_location: &workspace_location ~/

# Executor Definitions
# https://circleci.com/docs/2.0/reusing-config/#authoring-reusable-executors
# **NOTE 1**: Pin to exact images using an ID (SHA). See https://circleci.com/docs/2.0/circleci-images/#using-a-docker-image-id-to-pin-an-image-to-a-fixed-version.
#             (Using the tag in not necessary when pinning by ID, but include it anyway for documentation purposes.)
executors:
  default-executor:
    parameters:
      resource_class:
        type: string
        default: medium
    docker:
      - image: circleci/node:14.16.1@sha256:b094e85848b43209ca83d9bb114d406fe62c75cb73b18c9d8eb1a9c6462c97d4
    resource_class: << parameters.resource_class >>
    working_directory: ~/ng
  cloud-sdk:
    description: The docker container to use when running gcp-gcs commands
    docker:
      - image: google/cloud-sdk:alpine@sha256:7d0cae28cb282b76f2d9babe278c63c910d54f0cceca7a65fdf6806e2b43882e
    working_directory: ~/ng


# Filter Definitions

# Filter to run a job on all branches and any `v1.X.Y(-Z)` tags.
# Since the jobs need to run on tagged builds too, a `tags` section has to be explicitly specified.
# (The `branches` section could be omitted, since it defaults to all branches - just being explicit
# here).
# See also https://circleci.com/docs/2.0/workflows/#executing-workflows-for-a-git-tag.
var-filter-run-always: &run-always
  filters:
    branches:
      only: /.*/
    tags:
      only: /v1\.\d+\.\d.*/

# Filter to run a job when code might need to be deployed - i.e. on builds for the `master` branch.
# (Further checks are needed to determine whether a deployment is actually needed, but these are not
# possible via filters.)
var-filter-run-on-master: &run-on-master
  filters:
    branches:
      only:
        - master
    tags:
      ignore: /.*/

# Filter to run a job when code/docs might need to be deployed - i.e. on tagged builds and on builds
# for master and `v1.*.x` branches.
# (Further checks are needed to determine whether a deployment is actually needed, but these are not
# possible via filters.)
var-filter-run-on-tags-and-master-and-version-branches: &run-on-tags-and-master-and-version-branches
  filters:
    branches:
      only:
        - master
        - /v1\.\d+\.x/
    tags:
      only: /v1\.\d+\.\d.*/

# Filter to run a job when docs might need to be deployed - i.e. on builds for `v1.*.x` branches,
# which might correspond to the stable branch.
# (Further checks are needed to determine whether a deployment is actually needed, but these are not
# possible via filters.)
var-filter-run-on-version-branches: &run-on-version-branches
  filters:
    branches:
      only:
        - /v1\.\d+\.x/
    tags:
      ignore: /.*/


# Command Definitions
# https://circleci.com/docs/2.0/reusing-config/#authoring-reusable-commands
commands:
  skip_on_pr_and_fork_builds:
    description: Skip a job on pull request and fork builds
    steps:
      - run:
          name: Skip this job if this is a pull request or fork build
          # Note: Using `CIRCLE_*` env variables (instead of those defined in `env.sh` so that this
          #       step can be run before `init_environment`.
          command: >
            if [[ -n "$CIRCLE_PR_NUMBER" ]] ||
                [[ "$CIRCLE_PROJECT_USERNAME" != "angular" ]] ||
                [[ "$CIRCLE_PROJECT_REPONAME" != "angular.js" ]]; then
              echo "Skipping this job, because this is either a pull request or a fork build."
              circleci step halt
            fi

  skip_unless_stable_branch:
    description: Skip a job unless this is the stable branch
    steps:
      - run:
          name: Skip this job unless this is the stable branch
          command: >
            if [[ "$DIST_TAG" != "latest" ]]; then
              echo "Skipping deployment, because this is not the stable branch."
              circleci step halt
            fi

  skip_unless_tag_or_master_or_stable_branch:
    description: Skip a job unless this is a tag or the master or stable branch
    steps:
      - run:
          name: Skip this job unless this is a tag or the master or stable branch
          command: >
            if [[ "$CI_GIT_TAG" == "false" ]] &&
                [[ "$CI_BRANCH" != "master" ]] &&
                [[ "$DIST_TAG" != "latest" ]]; then
              echo "Skipping this job, because this is neither a tag nor the master or stable branch."
              circleci step halt
            fi


  custom_attach_workspace:
    description: Attach workspace at a predefined location
    steps:
      - attach_workspace:
          at: *workspace_location

  # Java is needed for running the Closure Compiler (during the `minall` task).
  install_java:
    description: Install java
    steps:
      - run:
          name: Install java
          command: |
            sudo apt-get update
            # Install java runtime
            sudo apt-get install default-jre

  # Initializes the CI environment by setting up common environment variables.
  init_environment:
    description: Initializing environment (setting up variables)
    steps:
      - run:
          name: Set up environment
          environment:
              CIRCLE_GIT_BASE_REVISION: << pipeline.git.base_revision >>
              CIRCLE_GIT_REVISION: << pipeline.git.revision >>
          command: ./.circleci/env.sh
      - run:
          # Configure git as the CircleCI `checkout` command does.
          # This is needed because we only checkout on the setup job.
          # Add GitHub to known hosts
          name: Configure git
          command: |
            mkdir -p ~/.ssh
            echo 'github.com ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAQEAq2A7hRGmdnm9tUDbO9IDSwBK6TbQa+PXYPCPy6rbTrTtw7PHkccKrpp0yVhp5HdEIcKr6pLlVDBfOLX9QUsyCOV0wzfjIJNlGEYsdlLJizHhbn2mUjvSAHQqZETYP81eFzLQNnPHt4EVVUh7VfDESU84KezmD5QlWpXLmvU31/yMf+Se8xhHTvKSCZIFImWwoG6mbUoWf9nzpIoaSjB+weqqUUmpaaasXVal72J+UX2B+2RPW3RcT0eOzQgqlJL3RKrTJvdsjE3JEAvGq3lGHSZXy28G3skua2SmVi/w4yCE6gbODqnTWlg7+wC604ydGXA8VJiS5ap43JXiUFFAaQ==' >> ~/.ssh/known_hosts
            git config --global url."ssh://git@github.com".insteadOf "https://github.com" || true
            git config --global gc.auto 0 || true

  init_saucelabs_environment:
    description: Sets up a domain that resolves to the local host.
    steps:
      - run:
          name: Preparing environment for running tests on Saucelabs.
          command: |
            # For SauceLabs jobs, we set up a domain which resolves to the machine which launched
            # the tunnel. We do this because devices are sometimes not able to properly resolve
            # `localhost` or `127.0.0.1` through the SauceLabs tunnel. Using a domain that does not
            # resolve to anything on SauceLabs VMs ensures that such requests are always resolved
            # through the tunnel, and resolve to the actual tunnel host machine (i.e. the CircleCI VM).
            # More context can be found in: https://github.com/angular/angular/pull/35171.
            setPublicVar SAUCE_LOCALHOST_ALIAS_DOMAIN "angular-ci.local"
            setSecretVar SAUCE_ACCESS_KEY $(echo $SAUCE_ACCESS_KEY | rev)
      - run:
          # Sets up a local domain in the machine's host file that resolves to the local
          # host. This domain is helpful in Saucelabs tests where devices are not able to
          # properly resolve `localhost` or `127.0.0.1` through the sauce-connect tunnel.
          name: Setting up alias domain for local host.
          command: echo "127.0.0.1 $SAUCE_LOCALHOST_ALIAS_DOMAIN" | sudo tee -a /etc/hosts

  start_saucelabs:
    steps:
      - run:
          name: Starting Saucelabs tunnel service
          command: ./lib/saucelabs/sauce-service.sh start-ready-wait

  stop_saucelabs:
    steps:
      - run:
          name: Stopping Saucelabs tunnel service
          command: ./lib/saucelabs/sauce-service.sh stop

  run_e2e_tests:
    parameters:
      specs:
        type: string
    steps:
      - custom_attach_workspace
      - init_environment
      - init_saucelabs_environment
      - start_saucelabs
      - run:
          command: yarn grunt test:circleci-protractor --specs="<< parameters.specs >>"
          no_output_timeout: 30m
      - stop_saucelabs

  run_e2e_tests_jquery:
    parameters:
      specs:
        type: string
    steps:
      - custom_attach_workspace
      - init_environment
      - init_saucelabs_environment
      - start_saucelabs
      - run:
          environment:
              USE_JQUERY: 1
          command: yarn grunt test:circleci-protractor --specs="<< parameters.specs >>"
          no_output_timeout: 30m
      - stop_saucelabs

# Job definitions
# Jobs can include parameters that are passed in the workflow job invocation.
# https://circleci.com/docs/2.0/reusing-config/#authoring-parameterized-jobs
jobs:
  setup:
    executor: default-executor
    steps:
      - checkout
      - init_environment
      - install_java
      - run:
          name: Running Yarn install
          command: yarn install --frozen-lockfile --non-interactive
          # Yarn's requests sometimes take more than 10mins to complete.
          no_output_timeout: 45m
      - run: yarn grunt package
      # Persist any changes at this point to be reused by further jobs.
      # **NOTE**: To add new content to the workspace, always persist on the same root.
      - persist_to_workspace:
          root: *workspace_location
          paths:
            - ./ng

  lint:
    executor: default-executor
    steps:
      - custom_attach_workspace
      - init_environment
      - run: yarn grunt ci-checks
      - run: yarn commitplease "$CI_COMMIT_RANGE"
      - run: yarn grunt validate-angular-files

  unit-test:
    executor:
      name: default-executor
    steps:
      - custom_attach_workspace
      - init_environment
      - install_java
      - init_saucelabs_environment
      - run: yarn grunt test:promises-aplus
      - run:
          command: yarn grunt test:jqlite --browsers="$BROWSERS" --reporters=spec
          no_output_timeout: 10m
      - run:
          command: yarn grunt test:modules --browsers="$BROWSERS" --reporters=spec
          no_output_timeout: 10m
      - run:
          command: yarn grunt test:docs --browsers="$BROWSERS" --reporters=spec
          no_output_timeout: 10m

  unit-test-jquery:
    executor:
      name: default-executor
    steps:
      - custom_attach_workspace
      - init_environment
      - init_saucelabs_environment
      - run:
          command: yarn grunt test:jquery --browsers="$BROWSERS" --reporters=spec
          no_output_timeout: 10m
      - run:
          command: yarn grunt test:jquery-2.2 --browsers="$BROWSERS" --reporters=spec
          no_output_timeout: 10m
      - run:
          command: yarn grunt test:jquery-2.1 --browsers="$BROWSERS" --reporters=spec
          no_output_timeout: 10m

  e2e-test-1:
    executor:
      name: default-executor
    steps:
      - run_e2e_tests:
          specs: test/e2e/tests/**/*.js

  e2e-test-2a:
    executor:
      name: default-executor
    steps:
      - run_e2e_tests:
          specs: build/docs/ptore2e/example-ng*/**/default_test.js

  e2e-test-2b:
    executor:
      name: default-executor
    steps:
      - run_e2e_tests:
          specs: "build/docs/ptore2e/!(example-ng*)/**/default_test.js"

  e2e-test-jquery-1:
    executor:
      name: default-executor
    steps:
      - run_e2e_tests_jquery:
          specs: test/e2e/tests/**/*.js

  e2e-test-jquery-2a:
    executor:
      name: default-executor
    steps:
      - run_e2e_tests_jquery:
          specs: build/docs/ptore2e/example-ng*/**/jquery_test.js

  e2e-test-jquery-2b:
    executor:
      name: default-executor
    steps:
      - run_e2e_tests_jquery:
          specs:  build/docs/ptore2e/!(example-ng*)/**/jquery_test.js

  prepare-deployment:
    executor:
      name: default-executor
    steps:
      - skip_on_pr_and_fork_builds
      - custom_attach_workspace
      - init_environment
      - run: yarn grunt prepareDeploy
      # Write the deployment files to the workspace to be used by deploy-docs and deploy-code
      - persist_to_workspace:
          root: *workspace_location
          paths:
            - ./ng

  # The `deploy-code-files` job should only run when all of these conditions are true for the build:
  # - It is for the `angular/angular.js` repository (not a fork).
  # - It is not for a pull request.
  # - It is for a tag or the master branch or the stable branch(*).
  #
  # *: The stable branch is the one that has the value `latest` in `package.json > distTag`.
  deploy-code-files:
    executor:
      name: cloud-sdk
    steps:
      - skip_on_pr_and_fork_builds
      - custom_attach_workspace
      - init_environment
      - skip_unless_tag_or_master_or_stable_branch
      - run: ls scripts/code.angularjs.org-firebase/deploy
      - run:
          name: Authenticate and configure Docker
          command: |
            echo $GCLOUD_SERVICE_KEY | gcloud auth activate-service-account --key-file=-
            gcloud --quiet config set project ${GOOGLE_PROJECT_ID}
      - run:
          name: Sync files to code.angularjs.org
          command: |
            gsutil -m rsync -r scripts/code.angularjs.org-firebase/deploy gs://code-angularjs-org-338b8.appspot.com

  # The `deploy-code-firebase` job should only run when all of these conditions are true for the build:
  # - It is for the `angular/angular.js` repository (not a fork).
  # - It is not for a pull request.
  # - It is for the master branch.
  #   (This is enforced via job filters, so we don't need to a step to check it here.)
  deploy-code-firebase:
    executor:
      name: default-executor
    steps:
      - skip_on_pr_and_fork_builds
      - custom_attach_workspace
      - init_environment
        # Install dependencies for Firebase functions to prevent parsing errors during deployment.
        # See https://github.com/angular/angular.js/pull/16453.
      - run:
          name: Install dependencies in `scripts/code.angularjs.org-firebase/functions/`.
          working_directory: scripts/code.angularjs.org-firebase/functions
          command: yarn install --frozen-lockfile --ignore-engines --non-interactive
      - run:
          name: Deploy to Firebase from `scripts/code.angularjs.org-firebase/`.
          working_directory: scripts/code.angularjs.org-firebase
          command: |
            # Do not use `yarn firebase` as that causes the Firebase CLI to look for `firebase.json`
            # in the root directory, even if run from inside `scripts/code.angularjs.org-firebase/`.
            firebase=$(yarn bin)/firebase
            $firebase use
            $firebase deploy --message "Commit:\ $CI_COMMIT" --non-interactive --token "$FIREBASE_TOKEN"

  # The `deploy-docs` job should only run when all of these conditions are true for the build:
  # - It is for the `angular/angular.js` repository (not a fork).
  # - It is not for a pull request.
  # - It is for the stable branch(*).
  #
  # *: The stable branch is the one that has the value `latest` in `package.json > distTag`.
  deploy-docs:
    executor:
      name: default-executor
    steps:
      - skip_on_pr_and_fork_builds
      - custom_attach_workspace
      - init_environment
      - skip_unless_stable_branch
        # Install dependencies for Firebase functions to prevent parsing errors during deployment.
        # See https://github.com/angular/angular.js/pull/16453.
      - run:
          name: Install dependencies in `scripts/docs.angularjs.org-firebase/functions/`.
          working_directory: scripts/docs.angularjs.org-firebase/functions
          command: yarn install --frozen-lockfile --ignore-engines --non-interactive
      - run:
          name: Deploy to Firebase from `scripts/docs.angularjs.org-firebase/`.
          working_directory: scripts/docs.angularjs.org-firebase
          command: |
            # Do not use `yarn firebase` as that causes the Firebase CLI to look for `firebase.json`
            # in the root directory, even if run from inside `scripts/docs.angularjs.org-firebase/`.
            firebase=$(yarn bin)/firebase
            $firebase use
            $firebase deploy --message "Commit:\ $CI_COMMIT" --non-interactive --token "$FIREBASE_TOKEN"

workflows:
  version: 2
  default_workflow:
    jobs:
      - setup:
          <<: *run-always
      - lint:
          <<: *run-always
          requires:
            - setup
      - unit-test:
          <<: *run-always
          requires:
            - setup
      - unit-test-jquery:
          <<: *run-always
          requires:
            - setup
      - e2e-test-1:
          <<: *run-always
          requires:
            - setup
      - e2e-test-2a:
          <<: *run-always
          requires:
            - setup
      - e2e-test-2b:
          <<: *run-always
          requires:
            - setup
      - e2e-test-jquery-1:
          <<: *run-always
          requires:
            - setup
      - e2e-test-jquery-2a:
          <<: *run-always
          requires:
            - setup
      - e2e-test-jquery-2b:
          <<: *run-always
          requires:
            - setup
      - prepare-deployment:
          <<: *run-on-tags-and-master-and-version-branches
          requires:
             - setup
             - lint
             - unit-test
             - unit-test-jquery
             - e2e-test-1
             - e2e-test-2a
             - e2e-test-2b
             - e2e-test-jquery-1
             - e2e-test-jquery-2a
             - e2e-test-jquery-2b
      - deploy-code-files:
          <<: *run-on-tags-and-master-and-version-branches
          requires:
             - prepare-deployment
      - deploy-code-firebase:
          <<: *run-on-master
          requires:
             - prepare-deployment
      - deploy-docs:
          <<: *run-on-version-branches
          requires:
             - prepare-deployment


================================================
FILE: .circleci/env-helpers.inc.sh
================================================
####################################################################################################
# Helpers for defining environment variables for CircleCI.
#
# In CircleCI, each step runs in a new shell. The way to share ENV variables across steps is to
# export them from `$BASH_ENV`, which is automatically sourced at the beginning of every step (for
# the default `bash` shell).
#
# See also https://circleci.com/docs/2.0/env-vars/#using-bash_env-to-set-environment-variables.
####################################################################################################

# Set and print an environment variable.
#
# Use this function for setting environment variables that are public, i.e. it is OK for them to be
# visible to anyone through the CI logs.
#
# Usage: `setPublicVar <name> <value>`
function setPublicVar() {
  setSecretVar $1 "$2";
  echo "$1=$2";
}

# Set (without printing) an environment variable.
#
# Use this function for setting environment variables that are secret, i.e. should not be visible to
# everyone through the CI logs.
#
# Usage: `setSecretVar <name> <value>`
function setSecretVar() {
  # WARNING: Secrets (e.g. passwords, access tokens) should NOT be printed.
  # (Keep original shell options to restore at the end.)
  local -r originalShellOptions=$(set +o);
  set +x -eu -o pipefail;

  echo "export $1=\"${2:-}\";" >> $BASH_ENV;

  # Restore original shell options.
  eval "$originalShellOptions";
}


# Create a function to set an environment variable, when called.
#
# Use this function for creating setter for public environment variables that require expensive or
# time-consuming computaions and may not be needed. When needed, you can call this function to set
# the environment variable (which will be available through `$BASH_ENV` from that point onwards).
#
# Arguments:
# - `<name>`: The name of the environment variable. The generated setter function will be
#   `setPublicVar_<name>`.
# - `<code>`: The code to run to compute the value for the variable. Since this code should be
#   executed lazily, it must be properly escaped. For example:
#   ```sh
#   # DO NOT do this:
#   createPublicVarSetter MY_VAR "$(whoami)";  # `whoami` will be evaluated eagerly
#
#   # DO this isntead:
#   createPublicVarSetter MY_VAR "\$(whoami)";  # `whoami` will NOT be evaluated eagerly
#   ```
#
# Usage: `createPublicVarSetter <name> <code>`
#
# Example:
# ```sh
# createPublicVarSetter MY_VAR 'echo "FOO"';
# echo $MY_VAR;  # Not defined
#
# setPublicVar_MY_VAR;
# source $BASH_ENV;
# echo $MY_VAR;  # FOO
# ```
function createPublicVarSetter() {
  echo "setPublicVar_$1() { setPublicVar $1 \"$2\"; }" >> $BASH_ENV;
}


================================================
FILE: .circleci/env.sh
================================================
#!/usr/bin/env bash

# Variables
readonly projectDir=$(realpath "$(dirname ${BASH_SOURCE[0]})/..")
readonly envHelpersPath="$projectDir/.circleci/env-helpers.inc.sh";

# Load helpers and make them available everywhere (through `$BASH_ENV`).
source $envHelpersPath;
echo "source $envHelpersPath;" >> $BASH_ENV;

####################################################################################################
# Define PUBLIC environment variables for CircleCI.
####################################################################################################
# See https://circleci.com/docs/2.0/env-vars/#built-in-environment-variables for more info.
####################################################################################################
setPublicVar CI "$CI"
setPublicVar PROJECT_ROOT "$projectDir";
# This is the branch being built; e.g. `pull/12345` for PR builds.
setPublicVar CI_BRANCH "$CIRCLE_BRANCH";
setPublicVar CI_BUILD_URL "$CIRCLE_BUILD_URL";
setPublicVar CI_COMMIT "$CIRCLE_SHA1";
setPublicVar CI_GIT_BASE_REVISION "${CIRCLE_GIT_BASE_REVISION}";
setPublicVar CI_GIT_REVISION "${CIRCLE_GIT_REVISION}";
setPublicVar CI_GIT_TAG "${CIRCLE_TAG:-false}";
setPublicVar CI_COMMIT_RANGE "$CIRCLE_GIT_BASE_REVISION..$CIRCLE_GIT_REVISION";
setPublicVar CI_PULL_REQUEST "${CIRCLE_PR_NUMBER:-false}";
setPublicVar CI_REPO_NAME "$CIRCLE_PROJECT_REPONAME";
setPublicVar CI_REPO_OWNER "$CIRCLE_PROJECT_USERNAME";
setPublicVar CI_PR_REPONAME "$CIRCLE_PR_REPONAME";
setPublicVar CI_PR_USERNAME "$CIRCLE_PR_USERNAME";


####################################################################################################
# Define SauceLabs environment variables for CircleCI.
####################################################################################################
setPublicVar BROWSER_PROVIDER "saucelabs"

# The currently latest-1 version of desktop Safari on Saucelabs (v12.0) is unstable and disconnects
# consistently. The latest version (v12.1) works fine.
# TODO: Add `SL_Safari-1` back, once it no longer corresponds to v12.0.
setPublicVar BROWSERS "SL_Chrome,SL_Chrome-1,\
SL_Firefox,SL_Firefox-1,\
SL_Safari,\
SL_iOS,SL_iOS-1,\
SL_IE_9,SL_IE_10,SL_IE_11,\
SL_EDGE,SL_EDGE-1"

setPublicVar SAUCE_LOG_FILE /tmp/angular/sauce-connect.log
setPublicVar SAUCE_READY_FILE /tmp/angular/sauce-connect-ready-file.lock
setPublicVar SAUCE_PID_FILE /tmp/angular/sauce-connect-pid-file.lock
setPublicVar SAUCE_TUNNEL_IDENTIFIER "angularjs-framework-${CIRCLE_BUILD_NUM}-${CIRCLE_NODE_INDEX}"
# Amount of seconds we wait for sauceconnect to establish a tunnel instance. In order to not
# acquire CircleCI instances for too long if sauceconnect failed, we need a connect timeout.
setPublicVar SAUCE_READY_FILE_TIMEOUT 120

####################################################################################################
# Define additional environment variables
####################################################################################################

# NOTE: Make sure the tools used to compute this are available in all executors in `config.yml`.
setPublicVar DIST_TAG $( cat package.json | grep distTag | sed -E 's/^\s*"distTag"\s*:\s*"([^"]+)"\s*,\s*$/\1/' )

####################################################################################################
####################################################################################################
##                  Source `$BASH_ENV` to make the variables available immediately.               ##
##                  *** NOTE: This must remain the last command in this script. ***               ##
####################################################################################################
####################################################################################################
source $BASH_ENV;


================================================
FILE: .editorconfig
================================================
# https://editorconfig.org

root = true

[*]
charset = utf-8
indent_style = space
indent_size = 2
end_of_line = lf
insert_final_newline = true
trim_trailing_whitespace = true

[dropdown-toggle.js]
trim_trailing_whitespace = false
insert_final_newline = false

[htmlparser.js]
insert_final_newline = false


================================================
FILE: .eslintignore
================================================
build/**
docs/app/assets/js/angular-bootstrap/**
docs/config/templates/**
node_modules/**
lib/htmlparser/**
src/angular.bind.js
src/ngParseExt/ucd.js
i18n/closure/**
tmp/**
vendor/**


================================================
FILE: .eslintrc-base.json
================================================
{
  "rules": {
    // Rules are divided into sections from http://eslint.org/docs/rules/

    // Possible errors
    "comma-dangle": ["error", "never"],
    "no-cond-assign": ["error", "except-parens"],
    "no-constant-condition": ["error", {"checkLoops": false}],
    "no-control-regex": "error",
    "no-debugger": "error",
    "no-dupe-args": "error",
    "no-dupe-keys": "error",
    "no-duplicate-case": "error",
    "no-empty-character-class": "error",
    "no-empty": "error",
    "no-ex-assign": "error",
    "no-extra-boolean-cast": "error",
    "no-extra-semi": "error",
    "no-func-assign": "error",
    "no-inner-declarations": "error",
    "no-invalid-regexp": "error",
    "no-irregular-whitespace": "error",
    "no-negated-in-lhs": "error",
    "no-obj-calls": "error",
    "no-regex-spaces": "error",
    "no-sparse-arrays": "error",
    "no-unreachable": "error",
    "use-isnan": "error",
    "no-unsafe-finally": "error",
    "valid-typeof": "error",
    "no-unexpected-multiline": "error",

    // Best practices
    "accessor-pairs": "error",
    "array-callback-return": "error",
    "eqeqeq": ["error", "allow-null"],
    "no-alert": "error",
    "no-caller": "error",
    "no-case-declarations": "error",
    "no-eval": "error",
    "no-extend-native": "error",
    "no-extra-bind": "error",
    "no-extra-label": "error",
    "no-fallthrough": "error",
    "no-floating-decimal": "error",
    "no-implied-eval": "error",
    "no-invalid-this": "error",
    "no-iterator": "error",
    "no-multi-str": "error",
    "no-new-func": "error",
    "no-new-wrappers": "error",
    "no-new": "error",
    "no-octal-escape": "error",
    "no-octal": "error",
    "no-proto": "error",
    "no-redeclare": "error",
    "no-return-assign": "error",
    "no-script-url": "error",
    "no-self-assign": "error",
    "no-self-compare": "error",
    "no-sequences": "error",
    "no-throw-literal": "error",
    "no-unmodified-loop-condition": "error",
    "no-unused-expressions": "error",
    "no-unused-labels": "error",
    "no-useless-call": "error",
    "no-useless-concat": "error",
    "no-useless-escape": "error",
    "no-void": "error",
    "no-with": "error",
    "radix": "error",
    "wrap-iife": ["error", "inside"],

    // Strict mode
    "strict": ["error", "global"],

    // Variables
    "no-delete-var": "error",
    "no-label-var": "error",
    "no-restricted-globals": ["error", "event"],
    "no-shadow-restricted-names": "error",
    "no-undef-init": "error",
    "no-undef": "error",
    "no-unused-vars": ["error", { "vars": "local", "args": "none" }],

    // Node.js
    "handle-callback-err": "error",

    // Stylistic issues
    "array-bracket-spacing": ["error", "never"],
    "brace-style": ["error", "1tbs", { "allowSingleLine": true }],
    "comma-style": ["error", "last"],
    "eol-last": "error",
    "keyword-spacing": "error",
    "linebreak-style": ["error", "unix"],
    "max-len": ["error", { "code": 200, "ignoreComments": true, "ignoreUrls": true }],
    "new-cap": "error",
    "new-parens": "error",
    "no-array-constructor": "error",
    "no-bitwise": "error",
    "no-mixed-spaces-and-tabs": "error",
    "no-multiple-empty-lines": ["error", { "max": 3, "maxEOF": 1 }],
    "no-whitespace-before-property": "error",
    "no-spaced-func": "error",
    "no-trailing-spaces": "error",
    "no-unneeded-ternary": "error",
    "quotes": ["error", "single"],
    "semi-spacing": "error",
    "semi": "error",
    "space-before-blocks": ["error", "always"],
    "space-before-function-paren": ["error", "never"],
    "space-in-parens": ["error", "never"],
    "space-infix-ops": "error",
    "space-unary-ops": ["error", { "words": true, "nonwords": false }],
    "unicode-bom": ["error", "never"]
  }
}


================================================
FILE: .eslintrc-browser.json
================================================
{
  "extends": "./.eslintrc-base.json",

  "env": {
    // Note: don't set `"browser": true`; code in "src/" should be compatible with
    // non-browser environments like Node.js with a custom window implementation
    // like jsdom. All browser globals should be taken from window.
    "browser": false,
    "node": false
  },

  "globals": {
    "window": false,

    "angular": false
  }
}


================================================
FILE: .eslintrc-node.json
================================================
{
  "extends": "./.eslintrc-base.json",
  "env": {
    "browser": false,
    "node": true
  },
  "parserOptions": {
    "ecmaVersion": 2017
  },
  "plugins": [
    "promise"
  ]
}


================================================
FILE: .eslintrc-todo.json
================================================
{
  // This config contains proposed rules that we'd like to have enabled but haven't
  // converted the code to adhere yet. If a decision comes to not enable one of these
  // rules, it should be removed from the file. Every rule that got enabled in the
  // end should be moved from here to a respective section in .eslintrc.json

  "rules": {
    // Rules are divided into sections from http://eslint.org/docs/rules/

    // Best practices
    "complexity": ["error", 10],
    "dot-notation": "error",
    "dot-location": ["error", "property"],

    // Stylistic issues
    "block-spacing": ["error", "always"],
    "comma-spacing": "error",
    "id-denylist": ["error", "event"],
    "indent": ["error", 2],
    "key-spacing": ["error", { "beforeColon": false, "afterColon": true, "mode": "minimum" }],
    "object-curly-spacing": ["error", "never"],
    "object-property-newline": ["error", { "allowMultiplePropertiesPerLine": true }],
    "operator-linebreak": ["error", "after", { "overrides": { "?": "before", ":": "before" }}]
  }
}


================================================
FILE: .eslintrc.json
================================================
{
  "root": true,
  "extends": "./.eslintrc-node.json"
}


================================================
FILE: .gitattributes
================================================
# Auto detect text files and perform LF normalization
* text=auto

# JS files must always use LF for tools to work
*.js eol=lf


================================================
FILE: .github/ISSUE_TEMPLATE.md
================================================
# AngularJS is in LTS mode
We are no longer accepting changes that are not critical bug fixes into this project.
See https://blog.angular.io/stable-angularjs-and-long-term-support-7e077635ee9c for more detail.

<!--
IF YOU DON'T FILL OUT THE FOLLOWING INFORMATION WE MIGHT CLOSE YOUR ISSUE WITHOUT INVESTIGATION
-->

<!--
- For *SUPPORT QUESTIONS*, use one of the
[support channels](https://github.com/angular/angular.js/blob/master/CONTRIBUTING.md#question).
- Before submitting, please **SEARCH GITHUB** for a similar issue or PR. -->

**I'm submitting a ...**
<!-- (check one with "x") -->
- [ ] regression from 1.7.0
- [ ] security issue
- [ ] issue caused by a new browser version
- [ ] other <!--(Please do not submit support requests here - see above)-->

**Current behavior:**
<!-- Describe how the bug manifests / how the current features are insufficient. -->

**Expected / new behavior:**
<!-- Describe what the behavior would be without the bug / how the feature would improve AngularJS -->

**Minimal reproduction of the problem with instructions:**
<!--
If the current behavior is a bug or you can illustrate your feature request better with an example,
please provide the *STEPS TO REPRODUCE* and if possible a *MINIMAL DEMO* of the problem via
https://plnkr.co or similar (you can use this template as a starting point: http://plnkr.co/edit/tpl:yBpEi4).
-->

**AngularJS version:** 1.8.x
<!-- Check whether this is still an issue in the most recent stable or in the snapshot AngularJS
version (https://code.angularjs.org/snapshot/) -->

**Browser:** [all | Chrome XX | Firefox XX | Edge XX | IE XX | Safari XX | Mobile Chrome XX | Android X.X Web Browser | iOS XX Safari | iOS XX UIWebView | iOS XX WKWebView | Opera XX ]
<!-- All browsers where this could be reproduced (and Operating System if relevant) -->

**Anything else:**
<!-- e.g. stacktraces, related issues, suggestions how to fix -->


================================================
FILE: .github/PULL_REQUEST_TEMPLATE.md
================================================
# AngularJS is in LTS mode
We are no longer accepting changes that are not critical bug fixes into this project.
See https://blog.angular.io/stable-angularjs-and-long-term-support-7e077635ee9c for more detail.

<!-- General PR submission guidelines https://github.com/angular/angular.js/blob/master/CONTRIBUTING.md#submit-pr -->
**Does this PR fix a regression since 1.7.0, a security flaw, or a problem caused by a new browser version?**

<!-- If the answer is no, then we will not merge this PR -->


**What is the current behavior? (You can also link to an open issue here)**



**What is the new behavior (if this is a feature change)?**



**Does this PR introduce a breaking change?**



**Please check if the PR fulfills these requirements**
- [ ] The commit message follows our [guidelines](https://github.com/angular/angular.js/blob/master/DEVELOPERS.md#commits)
- [ ] Fix/Feature: [Docs](https://github.com/angular/angular.js/blob/master/DEVELOPERS.md#documentation) have been added/updated
- [ ] Fix/Feature: Tests have been added; existing tests pass

**Other information**:



================================================
FILE: .gitignore
================================================
/build/
/benchpress-build/
.DS_Store
gen_docs.disable
test.disable
regression/temp*.html
performance/temp*.html
.idea/workspace.xml
*~
*.swp
angular.js.tmproj
node_modules/
angular.xcodeproj
.firebase/
.idea
*.iml
.agignore
.lvimrc
libpeerconnection.log
npm-debug.log
/tmp/
.vscode
*.log
*.stackdump
scripts/code.angularjs.org-firebase/deploy
scripts/docs.angularjs.org-firebase/deploy
scripts/docs.angularjs.org-firebase/functions/content


================================================
FILE: .mailmap
================================================
Andres Ornelas <aornelas@google.com>
Caitlin Potter <caitpotter88@gmail.com>
Caitlin Potter <caitpotter88@gmail.com> <snowball@defpixel.com>
Di Peng <pengdi@google.com>
Di Peng <pengdi@google.com> <pengdi@go.wustl.edu>
Georgios Kalpakas <kalpakas.g@gmail.com>
Georgios Kalpakas <kalpakas.g@gmail.com> <g.kalpakas@hotmail.com>
Julie Ralph <ju.ralph@gmail.com>
Lucas Galfaso <lgalfaso@gmail.com>
Martin Staffa <mjstaffa@gmail.com>
Martin Staffa <mjstaffa@gmail.com> <mjstaffa@googlemail.com>
Matias Niemelä <matias@yearofmoo.com>
Michał Gołębiowski-Owczarek <m.goleb@gmail.com>
Misko Hevery <misko@hevery.com>
Misko Hevery <misko@hevery.com> <misko@google.com>
Igor Minar <igor@angularjs.org>
Igor Minar <igor@angularjs.org> <iiminar@gmail.com>
Igor Minar <igor@angularjs.org> <iminar@google.com>
Igor Minar <igor@angularjs.org> <iminar@dhcp-172-19-37-154.mtv.corp.google.com>
Pawel Kozlowski <pkozlowski.opensource@gmail.com>
Peter Bacon Darwin <pete@bacondarwin.com>
Rodric Haddad <rody@rodyhaddad.com>
Shahar Talmi <shahar.talmi@gmail.com>
Shahar Talmi <shahar.talmi@gmail.com> <shahart@wix.com>
Shyam Seshadri <shyamseshadri@google.com>
Shyam Seshadri <shyamseshadri@google.com> <shyamseshadri@gmail.com>
Vojta Jina <vojta.jina@gmail.com>
Vojta Jina <vojta.jina@gmail.com> <vojta@gemin-i.org>
Vojta Jina <vojta.jina@gmail.com> <vojta@google.com>


================================================
FILE: .nvmrc
================================================
14.16.1


================================================
FILE: CHANGELOG.md
================================================
**AngularJS support has officially ended as of January 2022.
[See what ending support means](https://docs.angularjs.org/misc/version-support-status)
and [read the end of life announcement](https://goo.gle/angularjs-end-of-life).**

**Visit [angular.io](https://angular.io) for the actively supported Angular.**

<a name="1.8.3"></a>
# 1.8.3 ultimate-farewell (2022-04-07)

One final release of AngularJS in order to update package README files on npm.

<a name="1.8.2"></a>
# 1.8.2 meteoric-mining (2020-10-21)

## Bug Fixes
- **$sceDelegate:** ensure that `resourceUrlWhitelist()` is identical to `trustedResourceUrlList()`
  ([e41f01](https://github.com/angular/angular.js/commit/e41f018959934bfbf982ba996cd654b1fce88d43),
  [#17090](https://github.com/angular/angular.js/issues/17090))


<a name="1.8.1"></a>
# 1.8.1 mutually-supporting (2020-09-30)

## Bug Fixes
- **$sanitize:** do not trigger CSP alert/report in Firefox and Chrome
  ([2fab3d](https://github.com/angular/angular.js/commit/2fab3d4e00f4fe35bfa3cf255160cb97404baf24))

## Refactorings

- **SanitizeUriProvider:** remove usages of whitelist
  ([76738102](https://github.com/angular/angular.js/commit/767381020d88bda2855ac87ca6f00748907e14ff))
- **httpProvider:** remove usages of whitelist and blacklist
  ([c953af6b](https://github.com/angular/angular.js/commit/c953af6b8cfeefe4acc0ca358550eed5da8cfe00))
- **sceDelegateProvider:** remove usages of whitelist and blacklist
  ([a206e267](https://github.com/angular/angular.js/commit/a206e2675c351c3cdcde3402978126774c1c5df9))

## Deprecation Notices

- Deprecated ~~`$compileProvider.aHrefSanitizationWhitelist`~~.
  It is now [`aHrefSanitizationTrustedUrlList`](https://docs.angularjs.org/api/ng/provider/$compileProvider#aHrefSanitizationTrustedUrlList).
- Deprecated ~~`$compileProvider.imgSrcSanitizationWhitelist`~~.
  It is now [`imgSrcSanitizationTrustedUrlList`](https://docs.angularjs.org/api/ng/provider/$compileProvider#imgSrcSanitizationTrustedUrlList).
- Deprecated ~~`$httpProvider.xsrfWhitelistedOrigins`~~.
  It is now [`xsrfTrustedOrigins`](https://docs.angularjs.org/api/ng/provider/$httpProvider#xsrfTrustedOrigins).
- Deprecated ~~`$sceDelegateProvider.resourceUrlWhitelist`~~.
  It is now [`trustedResourceUrlList`](https://docs.angularjs.org/api/ng/provider/$sceDelegateProvider#trustedResourceUrlList).
- Deprecated ~~`$sceDelegateProvider.resourceUrlBlacklist`~~.
  It is now [`bannedResourceUrlList`](https://docs.angularjs.org/api/ng/provider/$sceDelegateProvider#bannedResourceUrlList).

For the purposes of backward compatibility, the previous symbols are aliased to their new symbol.


<a name="1.8.0"></a>
# 1.8.0 nested-vaccination (2020-06-01)

_This release contains a breaking change to resolve a security issue which was discovered by
Krzysztof Kotowicz(@koto); and independently by Esben Sparre Andreasen (@esbena) while
performing a Variant Analysis of [CVE-2020-11022](https://github.com/advisories/GHSA-gxr4-xjj5-5px2)
which itself was found and reported by Masato Kinugawa (@masatokinugawa)._

## Bug Fixes
- **jqLite:**
  - prevent possible XSS due to regex-based HTML replacement
  ([2df43c](https://github.com/angular/angular.js/commit/2df43c07779137d1bddf7f3b282a1287a8634acd))

## Breaking Changes

### **jqLite** due to:
  - **[2df43c](https://github.com/angular/angular.js/commit/2df43c07779137d1bddf7f3b282a1287a8634acd)**: prevent possible XSS due to regex-based HTML replacement

JqLite no longer turns XHTML-like strings like `<div /><span />` to sibling elements `<div></div><span></span>`
when not in XHTML mode. Instead it will leave them as-is. The browser, in non-XHTML mode, will convert these to:
`<div><span></span></div>`.

This is a security fix to avoid an XSS vulnerability if a new jqLite element is created from a user-controlled HTML string.
If you must have this functionality and understand the risk involved then it is posible to restore the original behavior by calling

```js
angular.UNSAFE_restoreLegacyJqLiteXHTMLReplacement();
```

But you should adjust your code for this change and remove your use of this function as soon as possible.

Note that this only patches jqLite. If you use jQuery 3.5.0 or newer, please read the [jQuery 3.5 upgrade guide](https://jquery.com/upgrade-guide/3.5/) for more details about the workarounds.


<a name="1.7.9"></a>
# 1.7.9 pollution-eradication (2019-11-19)

## Bug Fixes
- **angular.merge:** do not merge __proto__ property
  ([726f49](https://github.com/angular/angular.js/commit/726f49dcf6c23106ddaf5cfd5e2e592841db743a))
  <br>(Thanks to the [Snyk Security Research Team](https://snyk.io/blog/snyk-research-team-discovers-severe-prototype-pollution-security-vulnerabilities-affecting-all-versions-of-lodash/) for identifyng this issue.)
- **ngStyle:** correctly remove old style when new style value is invalid
  ([5edd25](https://github.com/angular/angular.js/commit/5edd25364f617083363dc2bd61f9230b38267578),
  [#16860](https://github.com/angular/angular.js/issues/16860),
  [#16868](https://github.com/angular/angular.js/issues/16868))


<a name="1.7.8"></a>
# 1.7.8 enthusiastic-oblation (2019-03-11)


## Bug Fixes
- **required:** correctly validate required on non-input element surrounded by ngIf
  ([a4c7bd](https://github.com/angular/angular.js/commit/a4c7bdccd76c39c30e33f6215da9a00cc8acde2c),
  [#16830](https://github.com/angular/angular.js/issues/16830),
  [#16836](https://github.com/angular/angular.js/issues/16836))


<a name="1.7.7"></a>
# 1.7.7 kingly-exiting (2019-02-04)

## Bug Fixes
- **ngRequired:** set error correctly when inside ngRepeat and false by default
  ([5ad4f5](https://github.com/angular/angular.js/commit/5ad4f5562c37b1cb575e3e5fddd96e9dd10408e2),
  [#16814](https://github.com/angular/angular.js/issues/16814),
  [#16820](https://github.com/angular/angular.js/issues/16820))


<a name="1.7.6"></a>
# 1.7.6 gravity-manipulation (2019-01-17)

## Bug Fixes
- **$compile:** fix ng-prop-* with undefined values
  ([772440](https://github.com/angular/angular.js/commit/772440cdaf9a9bfa40de1675e20a5f0e356089ed),
  [#16797](https://github.com/angular/angular.js/issues/16797),
  [#16798](https://github.com/angular/angular.js/issues/16798))
- **compile:** properly handle false value for boolean attrs with jQuery
  ([27486b](https://github.com/angular/angular.js/commit/27486bd15e70946ece2ba713e4e8654b7f9bddad),
  [#16778](https://github.com/angular/angular.js/issues/16778),
  [#16779](https://github.com/angular/angular.js/issues/16779))
- **ngRepeat:**
  - fix reference to last collection value remaining across linkages
  ([cf919a](https://github.com/angular/angular.js/commit/cf919a6fb7fc655f3fa37a74899a797ea5b8073e))
  - fix trackBy function being invoked with incorrect scope
  ([d4d103](https://github.com/angular/angular.js/commit/d4d1031bcd9b30ae6a58bd60a79bcc9d20f0f2b7),
  [#16776](https://github.com/angular/angular.js/issues/16776),
  [#16777](https://github.com/angular/angular.js/issues/16777))
- **aria/ngClick:** check if element is `contenteditable` before blocking spacebar
  ([289374](https://github.com/angular/angular.js/commit/289374a43c1b2fd715ddf7455db225b17afebbaf),
  [#16762](https://github.com/angular/angular.js/issues/16762))
- **input:** prevent browsers from autofilling hidden inputs
  ([7cbb10](https://github.com/angular/angular.js/commit/7cbb1044fcb3576cdad791bd22ebea3dfd533ff8))
- **Angular:** add workaround for Safari / Webdriver problem
  ([eb49f6](https://github.com/angular/angular.js/commit/eb49f6b7555cfd7ab03fd35581adb6b4bd49044e))
- **$browser:** normalize inputted URLs
  ([2f72a6](https://github.com/angular/angular.js/commit/2f72a69ded53a122afad3ec28d91f9bd2f41eb4f),
  [#16606](https://github.com/angular/angular.js/issues/16606))
- **interpolate:** do not create directives for constant media URL attributes
  ([90a41d](https://github.com/angular/angular.js/commit/90a41d415c83abdbf28317f49df0fd0a7e07db86),
  [#16734](https://github.com/angular/angular.js/issues/16734))
- **$q:** allow third-party promise libraries
  ([eefaa7](https://github.com/angular/angular.js/commit/eefaa76a90dbef08fdc7d734a205cc2de50d9f91),
  [#16164](https://github.com/angular/angular.js/issues/16164),
  [#16471](https://github.com/angular/angular.js/issues/16471))
- **urlUtils:** make IPv6 URL's hostname wrapped in square brackets in IE/Edge
  ([0e1bd7](https://github.com/angular/angular.js/commit/0e1bd7822e61822a48b8fd7ba5913a8702e6dabf),
  [#16692](https://github.com/angular/angular.js/issues/16692),
  [#16715](https://github.com/angular/angular.js/issues/16715))
- **ngAnimateSwap:** make it compatible with `ngIf` on the same element
  ([b27080](https://github.com/angular/angular.js/commit/b27080d52546409fb4e483f212f03616e2ca8037),
  [#16616](https://github.com/angular/angular.js/issues/16616),
  [#16729](https://github.com/angular/angular.js/issues/16729))
- **ngMock:** make matchLatestDefinitionEnabled work
  ([3cdffc](https://github.com/angular/angular.js/commit/3cdffcecbae71189b4db69b57fadda6608a23b61),
  [#16702](https://github.com/angular/angular.js/issues/16702))
- **ngStyle:** skip setting empty value when new style has the property
  ([d6098e](https://github.com/angular/angular.js/commit/d6098eeb1c9510d599e9bd3cfdba7dd21e7a55a5),
  [#16709](https://github.com/angular/angular.js/issues/16709))

## Performance Improvements
- **input:** prevent multiple validations on initialization
  ([692622](https://github.com/angular/angular.js/commit/69262239632027b373258e75c670b89132ad9edb),
  [#14691](https://github.com/angular/angular.js/issues/14691),
  [#16760](https://github.com/angular/angular.js/issues/16760))



<a name="1.7.5"></a>
# 1.7.5 anti-prettification (2018-10-04)

## Bug Fixes
- **ngClass:** do not break on invalid values
  ([f3a565](https://github.com/angular/angular.js/commit/f3a565872d802c94bb213944791b11b483d52f73),
  [#16697](https://github.com/angular/angular.js/issues/16697),
  [#16699](https://github.com/angular/angular.js/issues/16699))


<a name="1.7.4"></a>
# 1.7.4 interstellar-exploration (2018-09-07)

## Bug Fixes
- **ngAria.ngClick:** prevent default event on space/enter only for non-interactive elements
  ([61b335](https://github.com/angular/angular.js/commit/61b33543ff8e7f32464dec98a46bf0a35e9b03a4),
  [#16664](https://github.com/angular/angular.js/issues/16664),
  [#16680](https://github.com/angular/angular.js/issues/16680))
- **ngAnimate:** remove the "prepare" classes with multiple structural animations
  ([3105b2](https://github.com/angular/angular.js/commit/3105b2c26a71594c4e7904efc18f4b2e9da25b1b),
  [#16681](https://github.com/angular/angular.js/issues/16681),
  [#16677](https://github.com/angular/angular.js/issues/16677))
- **$route:** correctly extract path params if the path contains a question mark or a hash
  ([2ceeb7](https://github.com/angular/angular.js/commit/2ceeb739f35e01fcebcabac4beeeb7684ae9f86d))
- **ngHref:** allow numbers and other objects in interpolation
  ([30084c](https://github.com/angular/angular.js/commit/30084c13699c814ff6703d7aa2d3947a9b2f7067),
  [#16652](https://github.com/angular/angular.js/issues/16652),
  [#16626](https://github.com/angular/angular.js/issues/16626))
- **select:** allow to select first option with value `undefined`
  ([668a33](https://github.com/angular/angular.js/commit/668a33da3439f17e61dfa8f6d9b114ebde8c9d87),
  [#16653](https://github.com/angular/angular.js/issues/16653),
  [#16656](https://github.com/angular/angular.js/issues/16656))


<a name="1.7.3"></a>
# 1.7.3 eventful-proposal (2018-08-03)

## Bug Fixes
- **$location:**
  - fix infinite recursion/digest on URLs with special characters
  ([e68697](https://github.com/angular/angular.js/commit/e68697e2e30695f509e6c2c1e43c2c02b7af41f0),
  [#16592](https://github.com/angular/angular.js/issues/16592),
  [#16611](https://github.com/angular/angular.js/issues/16611))
  - avoid unnecessary `$locationChange*` events due to empty hash
  ([1144b1](https://github.com/angular/angular.js/commit/1144b1eccb886ea0e4a80bcb07d38a305c3263b4),
  [#16632](https://github.com/angular/angular.js/issues/16632),
  [#16636](https://github.com/angular/angular.js/issues/16636))
- **ngMock.$httpBackend:**
  - pass failed HTTP expectations to `$exceptionHandler`
  ([4adbf8](https://github.com/angular/angular.js/commit/4adbf82a84a564a8d3f0982c17a64c6163200bcd),
  [#16644](https://github.com/angular/angular.js/issues/16644))
  - correctly ignore query params in {expect,when}Route
  ([be417f](https://github.com/angular/angular.js/commit/be417f28549e184fbc3c7f74251ac21fca965ae8),
  [#14173](https://github.com/angular/angular.js/issues/14173),
  [#16589](https://github.com/angular/angular.js/issues/16589))
- **Angular:** add workaround for Safari / Webdriver problem
  ([0a1db2](https://github.com/angular/angular.js/commit/0a1db2ad5f8da6902b1711a738ae4177ce9685fa),
  [#16645](https://github.com/angular/angular.js/issues/16645))
- **$animate:** avoid memory leak with `$animate.enabled(element, enabled)`
  ([4bd424](https://github.com/angular/angular.js/commit/4bd424690612885ca06028e9b27de585edc3d3c3),
  [#16649](https://github.com/angular/angular.js/issues/16649))
- **$compile:**
  - use correct parent element when requiring on html element
  ([05ac70](https://github.com/angular/angular.js/commit/05ac702bc7edae5f89c363ea661774910735ea8b),
  [#16535](https://github.com/angular/angular.js/issues/16535),
  [#16647](https://github.com/angular/angular.js/issues/16647))
  - work around Firefox `DocumentFragment` bug
  ([10973c](https://github.com/angular/angular.js/commit/10973c3366676ac8e5b2728b1e006cdef4ea197e),
  [#16607](https://github.com/angular/angular.js/issues/16607),
  [#16615](https://github.com/angular/angular.js/issues/16615))
- **ngEventDirs:**
  - pass error in handler to $exceptionHandler when event was triggered in a digest
  ([688211](https://github.com/angular/angular.js/commit/6882113bc194fb10081db9bab3dd7d69dd59f311))
  - don't wrap the event handler in $apply if already in $digest
  ([535ee3](https://github.com/angular/angular.js/commit/535ee32a0b4881c9fd526fb5e0ffc10919ba1800),
  [#14673](https://github.com/angular/angular.js/issues/14673),
  [#14674](https://github.com/angular/angular.js/issues/14674))
- **angular.element:** do not break on `cleanData()` if `_data()` returns undefined
  ([7cf4a2](https://github.com/angular/angular.js/commit/7cf4a2933cb017e45b0c97b0a836cbbd905ee31a),
  [#16641](https://github.com/angular/angular.js/issues/16641),
  [#16642](https://github.com/angular/angular.js/issues/16642))
- **ngAria:** do not scroll when pressing spacebar on custom buttons
  ([3a517c](https://github.com/angular/angular.js/commit/3a517c25f677294a7a9eca1660654a3edcc9e103),
  [#14665](https://github.com/angular/angular.js/issues/14665),
  [#16604](https://github.com/angular/angular.js/issues/16604))


## New Features
- **$compile:** add support for arbitrary DOM property and event bindings
  ([a5914c](https://github.com/angular/angular.js/commit/a5914c94a8fa5b1eceeab9e4e6849cbf467bc26d),
  [#16428](https://github.com/angular/angular.js/issues/16428),
  [#16235](https://github.com/angular/angular.js/issues/16235),
  [#16614](https://github.com/angular/angular.js/issues/16614))
- **ngMock:** add `$flushPendingTasks()` and `$verifyNoPendingTasks()`
  ([6f7674](https://github.com/angular/angular.js/commit/6f7674a7d063d434205f75f5b861f167e8125999),
  [#14336](https://github.com/angular/angular.js/issues/14336))
- **core:** implement more granular pending task tracking
  ([17b139](https://github.com/angular/angular.js/commit/17b139f107e5471a9351af638093a8e13a69e42a))
- **$animate:** add option data to event callbacks
  ([fc64e6](https://github.com/angular/angular.js/commit/fc64e6807642512b567deb52b497bd2bff570a1f),
  [#12697](https://github.com/angular/angular.js/issues/12697),
  [#13059](https://github.com/angular/angular.js/issues/13059))
- **form.FormController:** add $getControls()
  ([c9d1e6](https://github.com/angular/angular.js/commit/c9d1e690aa597283373b78e646676fa8f1ba1b4d),
  [#16601](https://github.com/angular/angular.js/issues/16601),
  [#14749](https://github.com/angular/angular.js/issues/14749),
  [#14517](https://github.com/angular/angular.js/issues/14517),
  [#13202](https://github.com/angular/angular.js/issues/13202))
- **ngModelOptions:** add `timeStripZeroSeconds` and `timeSecondsFormat`
  ([b68221](https://github.com/angular/angular.js/commit/b682213d72d65c996a6a31ea57b79d4c4f4e3c98),
  [#10721](https://github.com/angular/angular.js/issues/10721),
  [#16510](https://github.com/angular/angular.js/issues/16510),
  [#16584](https://github.com/angular/angular.js/issues/16584))


## Performance Improvements
- **ngAnimate:** avoid repeated calls to addClass/removeClass when animation has no duration
  ([093635](https://github.com/angular/angular.js/commit/0936353e9a03f072bc3c4056888fd154a96530ef),
  [#14165](https://github.com/angular/angular.js/issues/14165),
  [#14166](https://github.com/angular/angular.js/issues/14166),
  [#16613](https://github.com/angular/angular.js/issues/16613))


<a name="1.7.2"></a>
# 1.7.2 extreme-compatiplication (2018-06-12)

In the previous release, we removed a private, undocumented API that was no longer used by
AngularJS. It turned out that several popular UI libraries (such as
[AngularJS Material](https://material.angularjs.org/),
[UI Bootstrap](https://angular-ui.github.io/bootstrap/),
[ngDialog](http://likeastore.github.io/ngDialog/) and probably others) relied on that API.

In order to avoid unnecessary pain for developers, this release reverts the removal of the private
API and restores compatibility of the aforementioned libraries with the latest AngularJS.

## Reverts
- **$compile:** remove `preAssignBindingsEnabled` leftovers
  ([2da495](https://github.com/angular/angular.js/commit/2da49504065e9e2b71a7a5622e45118d8abbe87e),
  [#16580](https://github.com/angular/angular.js/pull/16580),
  [a81232](https://github.com/angular/angular.js/commit/a812327acda8bc890a4c4e809f0debb761c29625),
  [#16595](https://github.com/angular/angular.js/pull/16595))


<a name="1.7.1"></a>
# 1.7.1 momentum-defiance (2018-06-08)


## Bug Fixes
- **$compile:** support transcluding multi-element directives
  ([789db8](https://github.com/angular/angular.js/commit/789db83a8ae0e2db5db13289b2c29e56093d967a),
  [#15554](https://github.com/angular/angular.js/issues/15554),
  [#15555](https://github.com/angular/angular.js/issues/15555))
- **ngModel:** do not throw if view value changes on destroyed scope
  ([2b6c98](https://github.com/angular/angular.js/commit/2b6c9867369fd3ef1ddb687af1153478ab62ee1b),
  [#16583](https://github.com/angular/angular.js/issues/16583),
  [#16585](https://github.com/angular/angular.js/issues/16585))


## New Features
- **$compile:** add one-way collection bindings
  ([f9d1ca](https://github.com/angular/angular.js/commit/f9d1ca20c38f065f15769fbe23aee5314cb58bd4),
  [#14039](https://github.com/angular/angular.js/issues/14039),
  [#16553](https://github.com/angular/angular.js/issues/16553),
  [#15874](https://github.com/angular/angular.js/issues/15874))
- **ngRef:** add directive to publish controller, or element into scope
  ([bf841d](https://github.com/angular/angular.js/commit/bf841d35120bf3c4655fde46af4105c85a0f1cdc),
  [#16511](https://github.com/angular/angular.js/issues/16511))
- **errorHandlingConfig:** add option to exclude error params from url
  ([3d6c45](https://github.com/angular/angular.js/commit/3d6c45d76e30b1b3c4eb9672cf4a93e5251c06b3),
  [#14744](https://github.com/angular/angular.js/issues/14744),
  [#15707](https://github.com/angular/angular.js/issues/15707),
  [#16283](https://github.com/angular/angular.js/issues/16283),
  [#16299](https://github.com/angular/angular.js/issues/16299),
  [#16591](https://github.com/angular/angular.js/issues/16591))
- **ngAria:** add support for ignoring a specific element
  ([7d9d38](https://github.com/angular/angular.js/commit/7d9d387195292cb5e04984602b752d31853cfea6),
  [#14602](https://github.com/angular/angular.js/issues/14602),
  [#14672](https://github.com/angular/angular.js/issues/14672),
  [#14833](https://github.com/angular/angular.js/issues/14833))
- **ngCookies:** support samesite option
  ([10a229](https://github.com/angular/angular.js/commit/10a229ce1befdeaf6295d1635dc11391c252a91a),
  [#16543](https://github.com/angular/angular.js/issues/16543),
  [#16544](https://github.com/angular/angular.js/issues/16544))
- **ngMessages:** add support for default message
  ([a8c263](https://github.com/angular/angular.js/commit/a8c263c1947cc85ee60b4732f7e4bcdc7ba463e8),
  [#12008](https://github.com/angular/angular.js/issues/12008),
  [#12213](https://github.com/angular/angular.js/issues/12213),
  [#16587](https://github.com/angular/angular.js/issues/16587))
- **ngMock, ngMockE2E:** add option to match latest definition for `$httpBackend` request
  ([773f39](https://github.com/angular/angular.js/commit/773f39c9345479f5f8b6321236ce6ad96f77aa92),
  [#16251](https://github.com/angular/angular.js/issues/16251),
  [#11637](https://github.com/angular/angular.js/issues/11637),
  [#16560](https://github.com/angular/angular.js/issues/16560))
- **$route:** add support for the `reloadOnUrl` configuration option
  ([f4f571](https://github.com/angular/angular.js/commit/f4f571efdf86d6acbcd5c6b1de66b4b33a259125),
  [#7925](https://github.com/angular/angular.js/issues/7925),
  [#15002](https://github.com/angular/angular.js/issues/15002))


<a name="1.7.0"></a>
# 1.7.0 nonexistent-physiology (2018-05-11)

**Here are the full changes for the release of 1.7.0 that are not already released in the 1.6.x branch,
which includes commits from 1.7.0-rc.0 and commits from 1.7.0 directly.**

1.7.0 is the last scheduled release of AngularJS that includes breaking changes. 1.7.x patch
releases will continue to receive bug fixes and non-breaking features until AngularJS enters Long
Term Support mode (LTS) on July 1st 2018.

## Bug Fixes
- **input:**
  - listen on "change" instead of "click" for radio/checkbox ngModels
  ([656c8f](https://github.com/angular/angular.js/commit/656c8fa8f23b1277cc5c214c4d0237f3393afa1e),
  [#4516](https://github.com/angular/angular.js/issues/4516),
  [#14667](https://github.com/angular/angular.js/issues/14667),
  [#14685](https://github.com/angular/angular.js/issues/14685))
- **input\[number\]:** validate min/max against viewValue
  ([aa3f95](https://github.com/angular/angular.js/commit/aa3f951330ec7b10b43ea884d9b5754e296770ec),
  [#12761](https://github.com/angular/angular.js/issues/12761),
  [#16325](https://github.com/angular/angular.js/issues/16325))
- **input\[date\]:** correctly parse 2-digit years
  ([627180](https://github.com/angular/angular.js/commit/627180fb71b92048d5b9ca2606b9eff1fd99387e),
  [#16537](https://github.com/angular/angular.js/issues/16537),
  [#16539](https://github.com/angular/angular.js/issues/16539))
- **jqLite:** make removeData() not remove event handlers
  ([b7d396](https://github.com/angular/angular.js/commit/b7d396b8b6e8f27a1f4556d58fc903321e8d532a),
  [#15869](https://github.com/angular/angular.js/issues/15869),
  [#16512](https://github.com/angular/angular.js/issues/16512))
- **$compile:**
  - remove the preAssignBindingsEnabled flag
  ([38f8c9](https://github.com/angular/angular.js/commit/38f8c97af74649ce224b6dd45f433cc665acfbfb),
  [#15782](https://github.com/angular/angular.js/issues/15782))
  - add `base[href]` to the list of RESOURCE_URL context attributes
  ([1cf728](https://github.com/angular/angular.js/commit/1cf728e209a9e0016068fac2769827e8f747760e),
  [#15597](https://github.com/angular/angular.js/issues/15597))
- **$interval:** throw when trying to cancel non-$interval promise
  ([a8bef9](https://github.com/angular/angular.js/commit/a8bef95127775d83d80daa4617c33227c4b443d4),
  [#16424](https://github.com/angular/angular.js/issues/16424),
  [#16476](https://github.com/angular/angular.js/issues/16476))
- **$timeout:** throw when trying to cancel non-$timeout promise
  ([336525](https://github.com/angular/angular.js/commit/3365256502344970f86355d3ace1cb4251ae9828),
  [#16424](https://github.com/angular/angular.js/issues/16424),
  [#16476](https://github.com/angular/angular.js/issues/16476))
- **$cookies:** remove the deprecated $cookieStore factory
  ([73c646](https://github.com/angular/angular.js/commit/73c6467f1468353215dc689c019ed83aa4993c77),
  [#16465](https://github.com/angular/angular.js/issues/16465))
- **$resource:** fix interceptors and success/error callbacks
  ([ea0585](https://github.com/angular/angular.js/commit/ea0585773bb93fd891576e2271254a17e15f1ddd),
  [#6731](https://github.com/angular/angular.js/issues/6731),
  [#9334](https://github.com/angular/angular.js/issues/9334),
  [#6865](https://github.com/angular/angular.js/issues/6865),
  [#16446](https://github.com/angular/angular.js/issues/16446))
- **$templateRequest:**
  - give tpload error the correct namespace
  ([c617d6](https://github.com/angular/angular.js/commit/c617d6dceee5b000bfceda44ced22fc16b48b18b))
  - always return the template that is stored in the cache
  ([fb0099](https://github.com/angular/angular.js/commit/fb00991460cf69ae8bc7f1f826363d09c73c0d5e),
  [#16225](https://github.com/angular/angular.js/issues/16225))
- **$animate:** let cancel() reject the runner promise
  ([16b82c](https://github.com/angular/angular.js/commit/16b82c6afe0ab916fef1d6ca78053b00bf5ada83),
  [#14204](https://github.com/angular/angular.js/issues/14204),
  [#16373](https://github.com/angular/angular.js/issues/16373))
- **ngTouch:**
  - deprecate the module and its contents
  ([67f54b](https://github.com/angular/angular.js/commit/67f54b660038de2b4346b3e76d66a8dc8ccb1f9b),
  [#16427](https://github.com/angular/angular.js/issues/16427),
  [#16431](https://github.com/angular/angular.js/issues/16431))
  - remove ngClick override, `$touchProvider`, and `$touch`
  ([11d9ad](https://github.com/angular/angular.js/commit/11d9ad1eb25eaf5967195e424108207427835d50),
  [#15761](https://github.com/angular/angular.js/issues/15761),
  [#15755](https://github.com/angular/angular.js/issues/15755))
- **ngScenario:** completely remove the angular scenario runner
  ([0cd392](https://github.com/angular/angular.js/commit/0cd39217828b0ad53eaf731576af17d66c18ff60),
  [#9405](https://github.com/angular/angular.js/issues/9405))
- **form:** set $submitted to true on child forms when parent is submitted
  ([223de5](https://github.com/angular/angular.js/commit/223de59e988dc0cc8b4ec3a045b7c0735eba1c77),
  [#10071](https://github.com/angular/angular.js/issues/10071))
- **$rootScope:**
  - provide correct value of one-time bindings in watchGroup
  ([c2b8fa](https://github.com/angular/angular.js/commit/c2b8fab0a480204374d561d6b9b3d47347ac5570))
  - don't allow explicit digest calls to affect $evalAsync
  ([02c046](https://github.com/angular/angular.js/commit/02c04690da16a9bef55694f5db0b8368dc0125c9),
  [#15127](https://github.com/angular/angular.js/issues/15127),
  [#15494](https://github.com/angular/angular.js/issues/15494))
- **ngAria:** do not set aria attributes on input[type="hidden"]
  ([6d5ef3](https://github.com/angular/angular.js/commit/6d5ef34fc6a974cde73157ba94f9706723dd8f5b),
  [#15113](https://github.com/angular/angular.js/issues/15113),
  [#16367](https://github.com/angular/angular.js/issues/16367))
- **ngModel, input:** improve handling of built-in named parsers
  ([74b04c](https://github.com/angular/angular.js/commit/74b04c9403af4fc7df5b6420f22c9f45a3e84140),
  [#14292](https://github.com/angular/angular.js/issues/14292),
  [#10076](https://github.com/angular/angular.js/issues/10076),
  [#16347](https://github.com/angular/angular.js/issues/16347))
- **$httpParamSerializerJQLike:**
  - call functions as jQuery does
  ([a784fa](https://github.com/angular/angular.js/commit/a784fab605d825f1158c6292b3c42f8c4a502fdf),
  [#16138](https://github.com/angular/angular.js/issues/16138),
  [#16139](https://github.com/angular/angular.js/issues/16139))
  - follow jQuery for `null` and `undefined`
  ([301fdd](https://github.com/angular/angular.js/commit/301fdda648680d89ccab607c413a7ddede7b0165))
- **$parse:**
  - do not pass scope/locals to interceptors of one-time bindings
  ([87a586](https://github.com/angular/angular.js/commit/87a586eb9a23cfd0d0bb681cc778b4b8e5c8451d))
  - always pass the intercepted value to watchers
  ([2ee503](https://github.com/angular/angular.js/commit/2ee5033967d5f87a516bad137686b0592e25d26b),
  [#16021](https://github.com/angular/angular.js/issues/16021))
  - respect the interceptor.$stateful flag
  ([de7403](https://github.com/angular/angular.js/commit/de74034ddf6f92505ccdb61be413a6df2c723f87))
- **Angular:** remove `angular.lowercase` and `angular.uppercase`
  ([1daa4f](https://github.com/angular/angular.js/commit/1daa4f2231a89ee88345689f001805ffffa9e7de),
  [#15445](https://github.com/angular/angular.js/issues/15445))
- **$controller:** remove instantiating controllers defined on window
  ([e269c1](https://github.com/angular/angular.js/commit/e269c14425a3209040f65c022658770e00a36f16),
  [#15349](https://github.com/angular/angular.js/issues/15349),
  [#15762](https://github.com/angular/angular.js/issues/15762))


## New Features
- **angular.isArray:** support Array subclasses in `angular.isArray()`
  ([e3ece2](https://github.com/angular/angular.js/commit/e3ece2fad9e1e6d47b5f06815ff186d7e6f44948),
  [#15533](https://github.com/angular/angular.js/issues/15533),
  [#15541](https://github.com/angular/angular.js/issues/15541))
- **$sce:** handle URL sanitization through the `$sce` service
  ([1e9ead](https://github.com/angular/angular.js/commit/1e9eadcd72dbbd5c67dae8328a63e535cfa91ff9))
- **orderBy:** consider `null` and `undefined` greater than other values
  ([1d8046](https://github.com/angular/angular.js/commit/1d804645f7656d592c90216a0355b4948807f6b8),
  [#15294](https://github.com/angular/angular.js/issues/15294),
  [#16376](https://github.com/angular/angular.js/issues/16376))
- **$resource:** add support for `request` and `requestError` interceptors (#15674)
  ([240a3d](https://github.com/angular/angular.js/commit/240a3ddbf12a9bb79754031be95dae4b6bd2dded),
  [#5146](https://github.com/angular/angular.js/issues/5146))
- **ngModelOptions:** add debounce catch-all + allow debouncing 'default' only
  ([55ba44](https://github.com/angular/angular.js/commit/55ba44913e02650b56410aa9ab5eeea5d3492b68),
  [#15411](https://github.com/angular/angular.js/issues/15411),
  [#16335](https://github.com/angular/angular.js/issues/16335))
- **$compile:** lower the `xlink:href` security context for SVG's `a` and `image` elements
  ([6ccbfa](https://github.com/angular/angular.js/commit/6ccbfa65d60a3dc396d0cf6da21b993ad74653fd),
  [#15736](https://github.com/angular/angular.js/issues/15736))


## Performance Improvements
- **$rootScope:** allow $watchCollection use of expression input watching
  ([97b00c](https://github.com/angular/angular.js/commit/97b00ca497676aaff8a803762a9f8c7ff4aa24dd))
- **ngStyle:** use $watchCollection
  ([15bbd3](https://github.com/angular/angular.js/commit/15bbd3e18cd89b91f7206a06c73d40e54a8a48a0),
  [#15947](https://github.com/angular/angular.js/issues/15947))
- **$compile:** do not use deepWatch in literal one-way bindings
  ([fd4f01](https://github.com/angular/angular.js/commit/fd4f0111188b62773b99ab6eab38b4d2b5d8d727),
  [#15301](https://github.com/angular/angular.js/issues/15301))




## Breaking Changes

### **jqLite** due to:
  - **[b7d396](https://github.com/angular/angular.js/commit/b7d396b8b6e8f27a1f4556d58fc903321e8d532a)**: make removeData() not remove event handlers

Before this commit `removeData()` invoked on an element removed its event
handlers as well. If you want to trigger a full cleanup of an element, change:

```js
elem.removeData();
```

to:

```js
angular.element.cleanData(elem);
```

In most cases, though, cleaning up after an element is supposed to be done
only when it's removed from the DOM as well; in such cases the following:

```js
elem.remove();
```

will remove event handlers as well.

### **$cookies** due to:
  - **[73c646](https://github.com/angular/angular.js/commit/73c6467f1468353215dc689c019ed83aa4993c77)**: remove the deprecated $cookieStore factory

The $cookieStore has been removed. Migrate to the $cookies service. Note that
for object values you need to use the `putObject` & `getObject` methods as
`get`/`put` will not correctly save/retrieve them.

Before:
```js
$cookieStore.put('name', {key: 'value'});
$cookieStore.get('name'); // {key: 'value'}
$cookieStore.remove('name');
```

After:
```js
$cookies.putObject('name', {key: 'value'});
$cookies.getObject('name'); // {key: 'value'}
$cookies.remove('name');
```

### **$resource** due to:
  - **[ea0585](https://github.com/angular/angular.js/commit/ea0585773bb93fd891576e2271254a17e15f1ddd)**: fix interceptors and success/error callbacks

If you are not using `success` or `error` callbacks with `$resource`,
your app should not be affected by this change.

If you are using `success` or `error` callbacks (with or without
response interceptors), one (subtle) difference is that throwing an
error inside the callbacks will not propagate to the returned
`$promise`. Therefore, you should try to use the promises whenever
possible. E.g.:

```js
// Avoid
User.query(function onSuccess(users) { throw new Error(); }).
  $promise.
  catch(function onError() { /* Will not be called. */ });

// Prefer
User.query().
  $promise.
  then(function onSuccess(users) { throw new Error(); }).
  catch(function onError() { /* Will be called. */ });
```

Finally, if you are using `success` or `error` callbacks with response
interceptors, the callbacks will now always run _after_ the interceptors
(and wait for them to resolve in case they return a promise).
Previously, the `error` callback was called before the `responseError`
interceptor and the `success` callback was synchronously called after
the `response` interceptor. E.g.:

```js
var User = $resource('/api/users/:id', {id: '@id'}, {
  get: {
    method: 'get',
    interceptor: {
      response: function(response) {
        console.log('responseInterceptor-1');
        return $timeout(1000).then(function() {
          console.log('responseInterceptor-2');
          return response.resource;
        });
      },
      responseError: function(response) {
        console.log('responseErrorInterceptor-1');
        return $timeout(1000).then(function() {
          console.log('responseErrorInterceptor-2');
          return $q.reject('Ooops!');
        });
      }
    }
  }
});
var onSuccess = function(value) { console.log('successCallback', value); };
var onError = function(error) { console.log('errorCallback', error); };

// Assuming the following call is successful...
User.get({id: 1}, onSuccess, onError);
  // Old behavior:
  //   responseInterceptor-1
  //   successCallback, {/* Promise object */}
  //   responseInterceptor-2
  // New behavior:
  //   responseInterceptor-1
  //   responseInterceptor-2
  //   successCallback, {/* User object */}

// Assuming the following call returns an error...
User.get({id: 2}, onSuccess, onError);
  // Old behavior:
  //   errorCallback, {/* Response object */}
  //   responseErrorInterceptor-1
  //   responseErrorInterceptor-2
  // New behavior:
  //   responseErrorInterceptor-1
  //   responseErrorInterceptor-2
  //   errorCallback, Ooops!
```

  - **[240a3d](https://github.com/angular/angular.js/commit/240a3ddbf12a9bb79754031be95dae4b6bd2dded)**: add support for `request` and `requestError` interceptors (#15674)

Previously, calling a `$resource` method would synchronously call
`$http`. Now, it will be called asynchronously (regardless if a
`request`/`requestError` interceptor has been defined.

This is not expected to affect applications at runtime, since the
overall operation is asynchronous already, but may affect assertions in
tests. For example, if you want to assert that `$http` has been called
with specific arguments as a result of a `$resource` call, you now need
to run a `$digest` first, to ensure the (possibly empty) request
interceptor promise has been resolved.

Before:
```js
it('...', function() {
  $httpBackend.expectGET('/api/things').respond(...);
  var Things = $resource('/api/things');
  Things.query();

  expect($http).toHaveBeenCalledWith(...);
});
```

After:
```js
it('...', function() {
  $httpBackend.expectGET('/api/things').respond(...);
  var Things = $resource('/api/things');
  Things.query();
  $rootScope.$digest();

  expect($http).toHaveBeenCalledWith(...);
});
```

### **$templateRequest**:
  - due to **[c617d6](https://github.com/angular/angular.js/commit/c617d6dceee5b000bfceda44ced22fc16b48b18b)**: give tpload error the correct namespace

Previously the `tpload` error was namespaced to `$compile`. If you have
code that matches errors of the form `[$compile:tpload]` it will no
longer run. You should change the code to match
`[$templateRequest:tpload]`.

  - due to **([fb0099](https://github.com/angular/angular.js/commit/fb00991460cf69ae8bc7f1f826363d09c73c0d5e)**: always return the template that is stored in the cache

The service now returns the result of `$templateCache.put()` when making a server request to the
template. Previously it would return the content of the response directly.
This now means if you are decorating `$templateCache.put()` to manipulate the template, you will
now get this manipulated result also on the first `$templateRequest` rather than only on subsequent
calls (when the template is retrived from the cache).
In practice this should not affect any apps, as it is unlikely that they rely on the template being
different in the first and subsequent calls.

### **$animate** due to:
  - **[16b82c](https://github.com/angular/angular.js/commit/16b82c6afe0ab916fef1d6ca78053b00bf5ada83)**: let cancel() reject the runner promise

$animate.cancel(runner) now rejects the underlying
promise and calls the catch() handler on the runner
returned by $animate functions (enter, leave, move,
addClass, removeClass, setClass, animate).
Previously it would resolve the promise as if the animation
had ended successfully.

Example:

```js
var runner = $animate.addClass('red');
runner.then(function() { console.log('success')});
runner.catch(function() { console.log('cancelled')});

runner.cancel();
```

Pre-1.7.0, this logs 'success', 1.7.0 and later it logs 'cancelled'.
To migrate, add a catch() handler to your animation runners.

### **angular.isArray** due to:
  - **[e3ece2](https://github.com/angular/angular.js/commit/e3ece2fad9e1e6d47b5f06815ff186d7e6f44948)**: support Array subclasses in `angular.isArray()`

Previously, `angular.isArray()` was an alias for `Array.isArray()`.
Therefore, objects that prototypally inherit from `Array` where not
considered arrays. Now such objects are considered arrays too.

This change affects several other methods that use `angular.isArray()`
under the hood, such as `angular.copy()`, `angular.equals()`,
`angular.forEach()`, and `angular.merge()`.

This in turn affects how dirty checking treats objects that prototypally
inherit from `Array` (e.g. MobX observable arrays). AngularJS will now
be able to handle these objects better when copying or watching.

### **$sce** :
  - due to **[1e9ead](https://github.com/angular/angular.js/commit/1e9eadcd72dbbd5c67dae8328a63e535cfa91ff9)**: handle URL sanitization through the `$sce` service

If you use `attrs.$set` for URL attributes (a[href] and img[src]) there will no
longer be any automated sanitization of the value. This is in line with other
programmatic operations, such as writing to the innerHTML of an element.

If you are programmatically writing URL values to attributes from untrusted
input then you must sanitize it yourself. You could write your own sanitizer or copy
the private `$$sanitizeUri` service.

Note that values that have been passed through the `$interpolate` service within the
`URL` or `MEDIA_URL` will have already been sanitized, so you would not need to sanitize
these values again.

  - due to **[1e9ead](https://github.com/angular/angular.js/commit/1e9eadcd72dbbd5c67dae8328a63e535cfa91ff9)**: handle URL sanitization through the `$sce` service

binding `trustAs()` and the short versions (`trustAsResourceUrl()` et al.) to
`ngSrc`, `ngSrcset`, and `ngHref` will now raise an infinite digest error:

```js
  $scope.imgThumbFn = function(id) {
    return $sce.trustAsResourceUrl(someService.someUrl(id));
  };
```

```html
  <img ng-src="{{imgThumbFn(imgId)}}">
```
This is because the `$interpolate` service is now responsible for sanitizing
the attribute value, and its watcher receives a new object from `trustAs()`
on every digest.
To migrate, compute the trusted value only when the input value changes:

```js
  $scope.$watch('imgId', function(id) {
    $scope.imgThumb = $sce.trustAsResourceUrl(someService.someUrl(id));
  });
```

```html
  <img ng-src="{{imgThumb}}">
```

### **orderBy** due to:
  - **[1d8046](https://github.com/angular/angular.js/commit/1d804645f7656d592c90216a0355b4948807f6b8)**: consider `null` and `undefined` greater than other values

When using `orderBy` to sort arrays containing `null` values, the `null` values
will be considered "greater than" all other values, except for `undefined`.
Previously, they were sorted as strings. This will result in different (but more
intuitive) sorting order.

Before:
```js
orderByFilter(['a', undefined, 'o', null, 'z']);
//--> 'a', null, 'o', 'z', undefined
```

After:
```js
orderByFilter(['a', undefined, 'o', null, 'z']);
//--> 'a', 'o', 'z', null, undefined
```

### **ngScenario** due to:
  - **[0cd392](https://github.com/angular/angular.js/commit/0cd39217828b0ad53eaf731576af17d66c18ff60)**: completely remove the angular scenario runner

The angular scenario runner end-to-end test framework has been
removed from the project and will no longer be available on npm
or bower starting with 1.7.0.
It was deprecated and removed from the documentation in 2014.
Applications that still use it should migrate to
[Protractor](http://www.protractortest.org).
Technically, it should also be possible to continue using an
older version of the scenario runner, as the underlying APIs have
not changed. However, we do not guarantee future compatibility.

### **form** due to:
  - **[223de5](https://github.com/angular/angular.js/commit/223de59e988dc0cc8b4ec3a045b7c0735eba1c77)**: set $submitted to true on child forms when parent is submitted

Forms will now set $submitted on child forms when they are submitted.
For example:
```
<form name="parentform" ng-submit="$ctrl.submit()">
  <ng-form name="childform">
    <input type="text" name="input" ng-model="my.model" />
  </ng-form>
  <input type="submit" />
</form>
```

Submitting this form will set $submitted on "parentform" and "childform".
Previously, it was only set on "parentform".

This change was introduced because mixing form and ngForm does not create
logically separate forms, but rather something like input groups.
Therefore, child forms should inherit the submission state from their parent form.

### **ngAria** due to:
  - **[6d5ef3](https://github.com/angular/angular.js/commit/6d5ef34fc6a974cde73157ba94f9706723dd8f5b)**: do not set aria attributes on input[type="hidden"]

ngAria no longer sets aria-* attributes on input[type="hidden"] with ngModel.
This can affect apps that test for the presence of aria attributes on hidden inputs.
To migrate, remove these assertions.
In actual apps, this should not have a user-facing effect, as the previous behavior
was incorrect, and the new behavior is correct for accessibility.

### **ngModel, input** due to:
  - **[74b04c](https://github.com/angular/angular.js/commit/74b04c9403af4fc7df5b6420f22c9f45a3e84140)**: improve handling of built-in named parsers

*Custom* parsers that fail to parse on input types "email", "url", "number", "date", "month",
"time", "datetime-local", "week", do no longer set `ngModelController.$error[inputType]`, and
the `ng-invalid-[inputType]` class. Also, custom parsers on input type "range" do no
longer set `ngModelController.$error.number` and the `ng-invalid-number` class.

Instead, any custom parsers on these inputs set `ngModelController.$error.parse` and
`ng-invalid-parse`. This change was made to make distinguishing errors from built-in parsers
and custom parsers easier.

### **ngModelOptions** due to:
  - **[55ba44](https://github.com/angular/angular.js/commit/55ba44913e02650b56410aa9ab5eeea5d3492b68)**: add debounce catch-all + allow debouncing 'default' only

the 'default' key in 'debounce' now only debounces the default event, i.e. the event
that is added as an update trigger by the different input directives automatically.

Previously, it also applied to other update triggers defined in 'updateOn' that
did not have a corresponding key in the 'debounce'.

This behavior is now supported via a special wildcard / catch-all key: '*'.

See the following example:

Pre-1.7:
'mouseup' is also debounced by 500 milliseconds because 'default' is applied:
```
ng-model-options="{
  updateOn: 'default blur mouseup',
  debounce: { 'default': 500, 'blur': 0 }
}
```

1.7:
The pre-1.7 behavior can be re-created by setting '*' as a catch-all debounce value:
```
ng-model-options="{
  updateOn: 'default blur mouseup',
  debounce: { '*': 500, 'blur': 0 }
}
```

In contrast, when only 'default' is used, 'blur' and 'mouseup' are not debounced:
```
ng-model-options="{
  updateOn: 'default blur mouseup',
  debounce: { 'default': 500 }
}
```

### **input\[number\]** due to:
  - **[aa3f95](https://github.com/angular/angular.js/commit/aa3f951330ec7b10b43ea884d9b5754e296770ec)**: validate min/max against viewValue

`input[type=number]` with `ngModel` now validates the input for the `max`/`min` restriction against
the `ngModelController.$viewValue` instead of against the `ngModelController.$modelValue`.

This affects apps that use `$parsers` or `$formatters` to transform the input / model value.

If you rely on the $modelValue validation, you can overwrite the `min`/`max` validator from a custom directive, as seen in the following example directive definition object:

```
{
  restrict: 'A',
  require: 'ngModel',
  link: function(scope, element, attrs, ctrl) {
    var maxValidator = ctrl.$validators.max;

    ctrl.$validators.max = function(modelValue, viewValue) {
      return maxValidator(modelValue, modelValue);
    };
  }
}
```

### **input** due to:
  - **[656c8f](https://github.com/angular/angular.js/commit/656c8fa8f23b1277cc5c214c4d0237f3393afa1e)**: listen on "change" instead of "click" for radio/checkbox ngModels

`input[radio]` and `input[checkbox]` now listen to the "change" event instead of the "click" event.
Most apps should not be affected, as "change" is automatically fired by browsers after "click"
happens.

Two scenarios might need migration:

- Custom click events:

Before this change, custom click event listeners on radio / checkbox would be called after the
input element and `ngModel` had been updated, unless they were specifically registered before
the built-in click handlers.
After this change, they are called before the input is updated, and can call event.preventDefault()
to prevent the input from updating.

If an app uses a click event listener that expects ngModel to be updated when it is called, it now
needs to register a change event listener instead.

- Triggering click events:

Conventional trigger functions:

The change event might not be fired when the input element is not attached to the document. This
can happen in **tests** that compile input elements and
trigger click events on them. Depending on the browser (Chrome and Safari) and the trigger method,
the change event will not be fired when the input isn't attached to the document.

Before:

```js
    it('should update the model', inject(function($compile, $rootScope) {
      var inputElm = $compile('<input type="checkbox" ng-model="checkbox" />')($rootScope);

      inputElm[0].click(); // Or different trigger mechanisms, such as jQuery.trigger()
      expect($rootScope.checkbox).toBe(true);
    });
```

With this patch, `$rootScope.checkbox` might not be true, because the click event
hasn't triggered the change event. To make the test, work append the inputElm to the app's
`$rootElement`, and the `$rootElement` to the `$document`.

After:

```js
    it('should update the model', inject(function($compile, $rootScope, $rootElement, $document) {
      var inputElm = $compile('<input type="checkbox" ng-model="checkbox" />')($rootScope);

      $rootElement.append(inputElm);
      $document.append($rootElement);

      inputElm[0].click(); // Or different trigger mechanisms, such as jQuery.trigger()
      expect($rootScope.checkbox).toBe(true);
    });
```

`triggerHandler()`:

If you are using this jQuery / jqLite function on the input elements, you don't have to attach
the elements to the document, but instead change the triggered event to "change". This is because
`triggerHandler(event)` only triggers the exact event when it has been added by jQuery / jqLite.

### **ngStyle** due to:
  - **[15bbd3](https://github.com/angular/angular.js/commit/15bbd3e18cd89b91f7206a06c73d40e54a8a48a0)**: use $watchCollection

Previously the use of deep watch by ng-style would trigger styles to be
re-applied when nested state changed. Now only changes to direct
properties of the watched object will trigger changes.

### **$compile** due to:
  - **[38f8c9](https://github.com/angular/angular.js/commit/38f8c97af74649ce224b6dd45f433cc665acfbfb)**: remove the preAssignBindingsEnabled flag

Previously, the `$compileProvider.preAssignBindingsEnabled` flag was supported.
The flag controlled whether bindings were available inside the controller
constructor or only in the `$onInit` hook. The bindings are now no longer
available in the constructor.

To migrate your code:

1. If you haven't invoked `$compileProvider.preAssignBindingsEnabled()` you
don't have to do anything to migrate.

2. If you specified `$compileProvider.preAssignBindingsEnabled(false)`, you
can remove that statement - since AngularJS 1.6.0 this is the default so your
app should still work even in AngularJS 1.6 after such removal. Afterwards,
migrating to AngularJS 1.7.0 shouldn't require any further action.

3. If you specified `$compileProvider.preAssignBindingsEnabled(true)` you need
to first migrate your code so that the flag can be flipped to `false`. The
instructions on how to do that are available in the "Migrating from 1.5 to 1.6"
guide:
https://docs.angularjs.org/guide/migration#migrating-from-1-5-to-1-6
Afterwards, remove the `$compileProvider.preAssignBindingsEnabled(true)`
statement.

  - **[6ccbfa](https://github.com/angular/angular.js/commit/6ccbfa65d60a3dc396d0cf6da21b993ad74653fd)**: lower the `xlink:href` security context for SVG's `a` and `image` elements

In the unlikely case that an app relied on RESOURCE_URL whitelisting for the
purpose of binding to the `xlink:href` property of SVG's `<a>` or `<image>`
elements and if the values do not pass the regular URL sanitization, they will
break.

To fix this you need to ensure that the values used for binding to the affected
`xlink:href` contexts are considered safe URLs, e.g. by whitelisting them in
`$compileProvider`'s `aHrefSanitizationWhitelist` (for `<a>` elements) or
`imgSrcSanitizationWhitelist` (for `<image>` elements).

  - **[fd4f01](https://github.com/angular/angular.js/commit/fd4f0111188b62773b99ab6eab38b4d2b5d8d727)**: do not use deepWatch in literal one-way bindings

Previously when a literal value was passed into a directive/component via
one-way binding it would be watched with a deep watcher.

For example, for `<my-component input="[a]">`, a new instance of the array
would be passed into the directive/component (and trigger $onChanges) not
only if `a` changed but also if any sub property of `a` changed such as
`a.b` or `a.b.c.d.e` etc.

This also means a new but equal value for `a` would NOT trigger such a
change.

Now literal values use an input-based watch similar to other directive/component
one-way bindings. In this context inputs are the non-constant parts of the
literal. In the example above the input would be `a`. Changes are only
triggered when the inputs to the literal change.

  - **[1cf728](https://github.com/angular/angular.js/commit/1cf728e209a9e0016068fac2769827e8f747760e)**: add `base[href]` to the list of RESOURCE_URL context attributes

Previously, `<base href="{{ $ctrl.baseUrl }}" />` would not require `baseUrl` to
be trusted as a RESOURCE_URL. Now, `baseUrl` will be sent to `$sce`'s
RESOURCE_URL checks. By default, it will break unless `baseUrl` is of the same
origin as the application document.

Refer to the
[`$sce` API docs](https://code.angularjs.org/snapshot/docs/api/ng/service/$sce)
for more info on how to trust a value in a RESOURCE_URL context.

Also, concatenation in trusted contexts is not allowed, which means that the
following won't work: `<base href="/something/{{ $ctrl.partialPath }}" />`.

Either construct complex values in a controller (recommended):

```js
this.baseUrl = '/something/' + this.partialPath;
```
```html
<base href="{{ $ctrl.baseUrl }}" />
```

Or use string concatenation in the interpolation expression (not recommended
except for the simplest of cases):

```html
<base href="{{ '/something/' + $ctrl.partialPath }}" />
```

### **ngTouch** due to:
  - **[11d9ad](https://github.com/angular/angular.js/commit/11d9ad1eb25eaf5967195e424108207427835d50)**: remove ngClick override, `$touchProvider`, and `$touch`

The `ngClick` directive from the ngTouch module has been removed, and with it the
corresponding `$touchProvider` and `$touch` service.

If you have included ngTouch v1.5.0 or higher in your application, and have not
changed the value of `$touchProvider.ngClickOverrideEnabled()`, or injected and used the `$touch`
service, then there are no migration steps for your code. Otherwise you must remove references to
the provider and service.

The `ngClick` override directive had been deprecated and by default disabled since v1.5.0,
because of buggy behavior in edge cases, and a general trend to avoid special touch based
overrides of click events. In modern browsers, it should not be necessary to use a touch override
library:

- Chrome, Firefox, Edge, and Safari remove the 300ms delay when
  `<meta name="viewport" content="width=device-width">` is set.
- Internet Explorer 10+, Edge, Safari, and Chrome remove the delay on elements that have the
  `touch-action` css property is set to `manipulation`.

You can find out more in these articles:
https://developers.google.com/web/updates/2013/12/300ms-tap-delay-gone-away
https://developer.apple.com/library/content/releasenotes/General/WhatsNewInSafari/Articles/Safari_9_1.html#//apple_ref/doc/uid/TP40014305-CH10-SW8
https://blogs.msdn.microsoft.com/ie/2015/02/24/pointer-events-w3c-recommendation-interoperable-touch-and-removing-the-dreaded-300ms-tap-delay/

### **Angular** due to:
  - **[1daa4f](https://github.com/angular/angular.js/commit/1daa4f2231a89ee88345689f001805ffffa9e7de)**: remove `angular.lowercase` and `angular.uppercase`

The helper functions `angular.lowercase` `and angular.uppercase` have
been removed.

These functions have been deprecated since 1.5.0. They are internally
used, but should not be exposed as they contain special locale handling
(for Turkish) to maintain internal consistency regardless of user-set locale.

Developers should generally use the built-ins `toLowerCase` and `toUpperCase`
or `toLocaleLowerCase` and `toLocaleUpperCase` for special cases.

Further, we generally discourage using the angular.x helpers in application code.

### **$controller** due to:
  - **[e269c1](https://github.com/angular/angular.js/commit/e269c14425a3209040f65c022658770e00a36f16)**: remove instantiating controllers defined on window

The option to instantiate controllers from constructors on the global `window` object
has been removed. Likewise, the deprecated `$controllerProvider.allowGlobals()`
method that could enable this behavior, has been removed.

This behavior had been deprecated since AngularJS v1.3.0, because polluting the global scope
is bad. To migrate, remove the call to $controllerProvider.allowGlobals() in the config, and
register your controller via the Module API or the $controllerProvider, e.g.

```
angular.module('myModule', []).controller('myController', function() {...});

angular.module('myModule', []).config(function($controllerProvider) {
  $controllerProvider.register('myController', function() {...});
});

```

### **$rootScope** due to:
  - **[c2b8fa](https://github.com/angular/angular.js/commit/c2b8fab0a480204374d561d6b9b3d47347ac5570)**: provide correct value of one-time bindings in watchGroup

Previously when using `$watchGroup` the entries in `newValues` and
`oldValues` represented the *most recent change of each entry*.

Now the entries in `oldValues` will always equal the `newValues` of the previous
call of the listener. This means comparing the entries in `newValues` and
`oldValues` can be used to determine which individual expressions changed.

For example `$scope.$watchGroup(['a', 'b'], fn)` would previously:

|  Action  |  newValue  |  oldValue  |
|----------|------------|------------|
|  (init)  | [undefined, undefined] | [undefined, undefined] |
|  `a=1`   | [1, undefined] | [undefined, undefined] |
|  `a=2`   | [2, undefined] | [1, undefined] |
|  `b=3`   | [2, 3] | [1, undefined] |


Now the `oldValue` will always equal the previous `newValue`:

|  Action  |  newValue  |  oldValue  |
|----------|------------|------------|
|  (init)  | [undefined, undefined] | [undefined, undefined] |
|  `a=1`   | [1, undefined] | [undefined, undefined] |
|  `a=2`   | [2, undefined] | [1, undefined] |
|  `b=3`   | [2, 3] | [2, undefined] |

Note the last call now shows `a === 2` in the `oldValues` array.

This also makes the `oldValue` of one-time watchers more clear. Previously
the `oldValue` of a one-time watcher would remain `undefined` forever. For
example `$scope.$watchGroup(['a', '::b'], fn)` would previously:

|  Action  |  newValue  |  oldValue  |
|----------|------------|------------|
|  (init)  | [undefined, undefined] | [undefined, undefined] |
|  `a=1`   | [1, undefined] | [undefined, undefined] |
|  `b=2`   | [1, 2] | [undefined, undefined] |
|  `a=b=3` | [3, 2] | [1, undefined] |

Where now the `oldValue` will always equal the previous `newValue`:

|  Action  |  newValue  |  oldValue  |
|----------|------------|------------|
|  (init)  | [undefined, undefined] | [undefined, undefined] |
|  `a=1`   | [1, undefined] | [undefined, undefined] |
|  `b=2`   | [1, 2] | [1, undefined] |
|  `a=b=3` | [3, 2] | [1, 2] |

### **$interval** due to:
  - **[a8bef9](https://github.com/angular/angular.js/commit/a8bef95127775d83d80daa4617c33227c4b443d4)**: throw when trying to cancel non-$interval promise

`$interval.cancel()` will throw an error if called with a promise that
was not generated by `$interval()`. Previously, it would silently do
nothing.

Before:
```js
var promise = $interval(doSomething, 1000, 5).then(doSomethingElse);
$interval.cancel(promise);  // No error; interval NOT canceled.
```

After:
```js
var promise = $interval(doSomething, 1000, 5).then(doSomethingElse);
$interval.cancel(promise);  // Throws error.
```

Correct usage:
```js
var promise = $interval(doSomething, 1000, 5);
var newPromise = promise.then(doSomethingElse);
$interval.cancel(promise);  // Interval canceled.
```

### **$timeout** due to:
  - **[336525](https://github.com/angular/angular.js/commit/3365256502344970f86355d3ace1cb4251ae9828)**: throw when trying to cancel non-$timeout promise

`$timeout.cancel()` will throw an error if called with a promise that
was not generated by `$timeout()`. Previously, it would silently do
nothing.

Before:
```js
var promise = $timeout(doSomething, 1000).then(doSomethingElse);
$timeout.cancel(promise);  // No error; timeout NOT canceled.
```

After:
```js
var promise = $timeout(doSomething, 1000).then(doSomethingElse);
$timeout.cancel(promise);  // Throws error.
```

Correct usage:
```js
var promise = $timeout(doSomething, 1000);
var newPromise = promise.then(doSomethingElse);
$timeout.cancel(promise);  // Timeout canceled.
```

<a name="1.7.0-rc.0"></a>
# 1.7.0-rc.0 maximum-overdrive (2018-04-19)

## Bug Fixes
- **input:**
  - listen on "change" instead of "click" for radio/checkbox ngModels
  ([656c8f](https://github.com/angular/angular.js/commit/656c8fa8f23b1277cc5c214c4d0237f3393afa1e),
  [#4516](https://github.com/angular/angular.js/issues/4516),
  [#14667](https://github.com/angular/angular.js/issues/14667),
  [#14685](https://github.com/angular/angular.js/issues/14685))
- **input\[number\]:** validate min/max against viewValue
  ([aa3f95](https://github.com/angular/angular.js/commit/aa3f951330ec7b10b43ea884d9b5754e296770ec),
  [#12761](https://github.com/angular/angular.js/issues/12761),
  [#16325](https://github.com/angular/angular.js/issues/16325))
- **jqLite:** make removeData() not remove event handlers
  ([b7d396](https://github.com/angular/angular.js/commit/b7d396b8b6e8f27a1f4556d58fc903321e8d532a),
  [#15869](https://github.com/angular/angular.js/issues/15869),
  [#16512](https://github.com/angular/angular.js/issues/16512))
- **$compile:**
  - remove the preAssignBindingsEnabled flag
  ([38f8c9](https://github.com/angular/angular.js/commit/38f8c97af74649ce224b6dd45f433cc665acfbfb),
  [#15782](https://github.com/angular/angular.js/issues/15782))
  - add `base[href]` to the list of RESOURCE_URL context attributes
  ([1cf728](https://github.com/angular/angular.js/commit/1cf728e209a9e0016068fac2769827e8f747760e),
  [#15597](https://github.com/angular/angular.js/issues/15597))
- **$interval:** throw when trying to cancel non-$interval promise
  ([a8bef9](https://github.com/angular/angular.js/commit/a8bef95127775d83d80daa4617c33227c4b443d4),
  [#16424](https://github.com/angular/angular.js/issues/16424),
  [#16476](https://github.com/angular/angular.js/issues/16476))
- **$timeout:** throw when trying to cancel non-$timeout promise
  ([336525](https://github.com/angular/angular.js/commit/3365256502344970f86355d3ace1cb4251ae9828),
  [#16424](https://github.com/angular/angular.js/issues/16424),
  [#16476](https://github.com/angular/angular.js/issues/16476))
- **$cookies:** remove the deprecated $cookieStore factory
  ([73c646](https://github.com/angular/angular.js/commit/73c6467f1468353215dc689c019ed83aa4993c77),
  [#16465](https://github.com/angular/angular.js/issues/16465))
- **$resource:** fix interceptors and success/error callbacks
  ([ea0585](https://github.com/angular/angular.js/commit/ea0585773bb93fd891576e2271254a17e15f1ddd),
  [#6731](https://github.com/angular/angular.js/issues/6731),
  [#9334](https://github.com/angular/angular.js/issues/9334),
  [#6865](https://github.com/angular/angular.js/issues/6865),
  [#16446](https://github.com/angular/angular.js/issues/16446))
- **$templateRequest:**
  - give tpload error the correct namespace
  ([c617d6](https://github.com/angular/angular.js/commit/c617d6dceee5b000bfceda44ced22fc16b48b18b))
  - always return the template that is stored in the cache
  ([fb0099](https://github.com/angular/angular.js/commit/fb00991460cf69ae8bc7f1f826363d09c73c0d5e),
  [#16225](https://github.com/angular/angular.js/issues/16225))
- **$animate:** let cancel() reject the runner promise
  ([16b82c](https://github.com/angular/angular.js/commit/16b82c6afe0ab916fef1d6ca78053b00bf5ada83),
  [#14204](https://github.com/angular/angular.js/issues/14204),
  [#16373](https://github.com/angular/angular.js/issues/16373))
- **ngTouch:**
  - deprecate the module and its contents
  ([67f54b](https://github.com/angular/angular.js/commit/67f54b660038de2b4346b3e76d66a8dc8ccb1f9b),
  [#16427](https://github.com/angular/angular.js/issues/16427),
  [#16431](https://github.com/angular/angular.js/issues/16431))
  - remove ngClick override, `$touchProvider`, and `$touch`
  ([11d9ad](https://github.com/angular/angular.js/commit/11d9ad1eb25eaf5967195e424108207427835d50),
  [#15761](https://github.com/angular/angular.js/issues/15761),
  [#15755](https://github.com/angular/angular.js/issues/15755))
- **ngScenario:** completely remove the angular scenario runner
  ([0cd392](https://github.com/angular/angular.js/commit/0cd39217828b0ad53eaf731576af17d66c18ff60),
  [#9405](https://github.com/angular/angular.js/issues/9405))
- **form:** set $submitted to true on child forms when parent is submitted
  ([223de5](https://github.com/angular/angular.js/commit/223de59e988dc0cc8b4ec3a045b7c0735eba1c77),
  [#10071](https://github.com/angular/angular.js/issues/10071))
- **$rootScope:**
  - provide correct value of one-time bindings in watchGroup
  ([c2b8fa](https://github.com/angular/angular.js/commit/c2b8fab0a480204374d561d6b9b3d47347ac5570))
- **ngAria:** do not set aria attributes on input[type="hidden"]
  ([6d5ef3](https://github.com/angular/angular.js/commit/6d5ef34fc6a974cde73157ba94f9706723dd8f5b),
  [#15113](https://github.com/angular/angular.js/issues/15113),
  [#16367](https://github.com/angular/angular.js/issues/16367))
- **ngModel, input:** improve handling of built-in named parsers
  ([74b04c](https://github.com/angular/angular.js/commit/74b04c9403af4fc7df5b6420f22c9f45a3e84140),
  [#14292](https://github.com/angular/angular.js/issues/14292),
  [#10076](https://github.com/angular/angular.js/issues/10076),
  [#16347](https://github.com/angular/angular.js/issues/16347))
- **$httpParamSerializerJQLike:**
  - call functions as jQuery does
  ([a784fa](https://github.com/angular/angular.js/commit/a784fab605d825f1158c6292b3c42f8c4a502fdf),
  [#16138](https://github.com/angular/angular.js/issues/16138),
  [#16139](https://github.com/angular/angular.js/issues/16139))
  - follow jQuery for `null` and `undefined`
  ([301fdd](https://github.com/angular/angular.js/commit/301fdda648680d89ccab607c413a7ddede7b0165))
- **$parse:**
  - do not pass scope/locals to interceptors of one-time bindings
  ([87a586](https://github.com/angular/angular.js/commit/87a586eb9a23cfd0d0bb681cc778b4b8e5c8451d))
  - always pass the intercepted value to watchers
  ([2ee503](https://github.com/angular/angular.js/commit/2ee5033967d5f87a516bad137686b0592e25d26b),
  [#16021](https://github.com/angular/angular.js/issues/16021))
  - respect the interceptor.$stateful flag
  ([de7403](https://github.com/angular/angular.js/commit/de74034ddf6f92505ccdb61be413a6df2c723f87))
- **Angular:** remove `angular.lowercase` and `angular.uppercase`
  ([1daa4f](https://github.com/angular/angular.js/commit/1daa4f2231a89ee88345689f001805ffffa9e7de),
  [#15445](https://github.com/angular/angular.js/issues/15445))
- **$controller:** remove instantiating controllers defined on window
  ([e269c1](https://github.com/angular/angular.js/commit/e269c14425a3209040f65c022658770e00a36f16),
  [#15349](https://github.com/angular/angular.js/issues/15349),
  [#15762](https://github.com/angular/angular.js/issues/15762))


## New Features
- **angular.isArray:** support Array subclasses in `angular.isArray()`
  ([e3ece2](https://github.com/angular/angular.js/commit/e3ece2fad9e1e6d47b5f06815ff186d7e6f44948),
  [#15533](https://github.com/angular/angular.js/issues/15533),
  [#15541](https://github.com/angular/angular.js/issues/15541))
- **$sce:** handle URL sanitization through the `$sce` service
  ([1e9ead](https://github.com/angular/angular.js/commit/1e9eadcd72dbbd5c67dae8328a63e535cfa91ff9))
- **orderBy:** consider `null` and `undefined` greater than other values
  ([1d8046](https://github.com/angular/angular.js/commit/1d804645f7656d592c90216a0355b4948807f6b8),
  [#15294](https://github.com/angular/angular.js/issues/15294),
  [#16376](https://github.com/angular/angular.js/issues/16376))
- **$resource:** add support for `request` and `requestError` interceptors (#15674)
  ([240a3d](https://github.com/angular/angular.js/commit/240a3ddbf12a9bb79754031be95dae4b6bd2dded),
  [#5146](https://github.com/angular/angular.js/issues/5146))
- **ngModelOptions:** add debounce catch-all + allow debouncing 'default' only
  ([55ba44](https://github.com/angular/angular.js/commit/55ba44913e02650b56410aa9ab5eeea5d3492b68),
  [#15411](https://github.com/angular/angular.js/issues/15411),
  [#16335](https://github.com/angular/angular.js/issues/16335))
- **$compile:** lower the `xlink:href` security context for SVG's `a` and `image` elements
  ([6ccbfa](https://github.com/angular/angular.js/commit/6ccbfa65d60a3dc396d0cf6da21b993ad74653fd),
  [#15736](https://github.com/angular/angular.js/issues/15736))


## Performance Improvements
- **$rootScope:** allow $watchCollection use of expression input watching
  ([97b00c](https://github.com/angular/angular.js/commit/97b00ca497676aaff8a803762a9f8c7ff4aa24dd))
- **ngStyle:** use $watchCollection
  ([15bbd3](https://github.com/angular/angular.js/commit/15bbd3e18cd89b91f7206a06c73d40e54a8a48a0),
  [#15947](https://github.com/angular/angular.js/issues/15947))
- **$compile:** do not use deepWatch in literal one-way bindings
  ([fd4f01](https://github.com/angular/angular.js/commit/fd4f0111188b62773b99ab6eab38b4d2b5d8d727),
  [#15301](https://github.com/angular/angular.js/issues/15301))




## Breaking Changes

### **jqLite** due to:
  - **[b7d396](https://github.com/angular/angular.js/commit/b7d396b8b6e8f27a1f4556d58fc903321e8d532a)**: make removeData() not remove event handlers

Before this commit `removeData()` invoked on an element removed its event
handlers as well. If you want to trigger a full cleanup of an element, change:

```js
elem.removeData();
```

to:

```js
angular.element.cleanData(elem);
```

In most cases, though, cleaning up after an element is supposed to be done
only when it's removed from the DOM as well; in such cases the following:

```js
elem.remove();
```

will remove event handlers as well.

### **$cookies** due to:
  - **[73c646](https://github.com/angular/angular.js/commit/73c6467f1468353215dc689c019ed83aa4993c77)**: remove the deprecated $cookieStore factory

The $cookieStore has been removed. Migrate to the $cookies service. Note that
for object values you need to use the `putObject` & `getObject` methods as
`get`/`put` will not correctly save/retrieve them.

Before:
```js
$cookieStore.put('name', {key: 'value'});
$cookieStore.get('name'); // {key: 'value'}
$cookieStore.remove('name');
```

After:
```js
$cookies.putObject('name', {key: 'value'});
$cookies.getObject('name'); // {key: 'value'}
$cookies.remove('name');
```

### **$resource** due to:
  - **[ea0585](https://github.com/angular/angular.js/commit/ea0585773bb93fd891576e2271254a17e15f1ddd)**: fix interceptors and success/error callbacks

If you are not using `success` or `error` callbacks with `$resource`,
your app should not be affected by this change.

If you are using `success` or `error` callbacks (with or without
response interceptors), one (subtle) difference is that throwing an
error inside the callbacks will not propagate to the returned
`$promise`. Therefore, you should try to use the promises whenever
possible. E.g.:

```js
// Avoid
User.query(function onSuccess(users) { throw new Error(); }).
  $promise.
  catch(function onError() { /* Will not be called. */ });

// Prefer
User.query().
  $promise.
  then(function onSuccess(users) { throw new Error(); }).
  catch(function onError() { /* Will be called. */ });
```

Finally, if you are using `success` or `error` callbacks with response
interceptors, the callbacks will now always run _after_ the interceptors
(and wait for them to resolve in case they return a promise).
Previously, the `error` callback was called before the `responseError`
interceptor and the `success` callback was synchronously called after
the `response` interceptor. E.g.:

```js
var User = $resource('/api/users/:id', {id: '@id'}, {
  get: {
    method: 'get',
    interceptor: {
      response: function(response) {
        console.log('responseInterceptor-1');
        return $timeout(1000).then(function() {
          console.log('responseInterceptor-2');
          return response.resource;
        });
      },
      responseError: function(response) {
        console.log('responseErrorInterceptor-1');
        return $timeout(1000).then(function() {
          console.log('responseErrorInterceptor-2');
          return $q.reject('Ooops!');
        });
      }
    }
  }
});
var onSuccess = function(value) { console.log('successCallback', value); };
var onError = function(error) { console.log('errorCallback', error); };

// Assuming the following call is successful...
User.get({id: 1}, onSuccess, onError);
  // Old behavior:
  //   responseInterceptor-1
  //   successCallback, {/* Promise object */}
  //   responseInterceptor-2
  // New behavior:
  //   responseInterceptor-1
  //   responseInterceptor-2
  //   successCallback, {/* User object */}

// Assuming the following call returns an error...
User.get({id: 2}, onSuccess, onError);
  // Old behavior:
  //   errorCallback, {/* Response object */}
  //   responseErrorInterceptor-1
  //   responseErrorInterceptor-2
  // New behavior:
  //   responseErrorInterceptor-1
  //   responseErrorInterceptor-2
  //   errorCallback, Ooops!
```

  - **[240a3d](https://github.com/angular/angular.js/commit/240a3ddbf12a9bb79754031be95dae4b6bd2dded)**: add support for `request` and `requestError` interceptors (#15674)

Previously, calling a `$resource` method would synchronously call
`$http`. Now, it will be called asynchronously (regardless if a
`request`/`requestError` interceptor has been defined.

This is not expected to affect applications at runtime, since the
overall operation is asynchronous already, but may affect assertions in
tests. For example, if you want to assert that `$http` has been called
with specific arguments as a result of a `$resource` call, you now need
to run a `$digest` first, to ensure the (possibly empty) request
interceptor promise has been resolved.

Before:
```js
it('...', function() {
  $httpBackend.expectGET('/api/things').respond(...);
  var Things = $resource('/api/things');
  Things.query();

  expect($http).toHaveBeenCalledWith(...);
});
```

After:
```js
it('...', function() {
  $httpBackend.expectGET('/api/things').respond(...);
  var Things = $resource('/api/things');
  Things.query();
  $rootScope.$digest();

  expect($http).toHaveBeenCalledWith(...);
});
```

### **$templateRequest**:
  - due to **[c617d6](https://github.com/angular/angular.js/commit/c617d6dceee5b000bfceda44ced22fc16b48b18b)**: give tpload error the correct namespace

Previously the `tpload` error was namespaced to `$compile`. If you have
code that matches errors of the form `[$compile:tpload]` it will no
longer run. You should change the code to match
`[$templateRequest:tpload]`.

  - due to **([fb0099](https://github.com/angular/angular.js/commit/fb00991460cf69ae8bc7f1f826363d09c73c0d5e)**: always return the template that is stored in the cache

The service now returns the result of `$templateCache.put()` when making a server request to the
template. Previously it would return the content of the response directly.
This now means if you are decorating `$templateCache.put()` to manipulate the template, you will
now get this manipulated result also on the first `$templateRequest` rather than only on subsequent
calls (when the template is retrived from the cache).
In practice this should not affect any apps, as it is unlikely that they rely on the template being
different in the first and subsequent calls.

### **$animate** due to:
  - **[16b82c](https://github.com/angular/angular.js/commit/16b82c6afe0ab916fef1d6ca78053b00bf5ada83)**: let cancel() reject the runner promise

$animate.cancel(runner) now rejects the underlying
promise and calls the catch() handler on the runner
returned by $animate functions (enter, leave, move,
addClass, removeClass, setClass, animate).
Previously it would resolve the promise as if the animation
had ended successfully.

Example:

```js
var runner = $animate.addClass('red');
runner.then(function() { console.log('success')});
runner.catch(function() { console.log('cancelled')});

runner.cancel();
```

Pre-1.7.0, this logs 'success', 1.7.0 and later it logs 'cancelled'.
To migrate, add a catch() handler to your animation runners.

### **angular.isArray** due to:
  - **[e3ece2](https://github.com/angular/angular.js/commit/e3ece2fad9e1e6d47b5f06815ff186d7e6f44948)**: support Array subclasses in `angular.isArray()`

Previously, `angular.isArray()` was an alias for `Array.isArray()`.
Therefore, objects that prototypally inherit from `Array` where not
considered arrays. Now such objects are considered arrays too.

This change affects several other methods that use `angular.isArray()`
under the hood, such as `angular.copy()`, `angular.equals()`,
`angular.forEach()`, and `angular.merge()`.

This in turn affects how dirty checking treats objects that prototypally
inherit from `Array` (e.g. MobX observable arrays). AngularJS will now
be able to handle these objects better when copying or watching.

### **$sce** due to:
  - **[1e9ead](https://github.com/angular/angular.js/commit/1e9eadcd72dbbd5c67dae8328a63e535cfa91ff9)**: handle URL sanitization through the `$sce` service

If you use `attrs.$set` for URL attributes (a[href] and img[src]) there will no
longer be any automated sanitization of the value. This is in line with other
programmatic operations, such as writing to the innerHTML of an element.

If you are programmatically writing URL values to attributes from untrusted
input then you must sanitize it yourself. You could write your own sanitizer or copy
the private `$$sanitizeUri` service.

Note that values that have been passed through the `$interpolate` service within the
`URL` or `MEDIA_URL` will have already been sanitized, so you would not need to sanitize
these values again.

### **orderBy** due to:
  - **[1d8046](https://github.com/angular/angular.js/commit/1d804645f7656d592c90216a0355b4948807f6b8)**: consider `null` and `undefined` greater than other values

When using `orderBy` to sort arrays containing `null` values, the `null` values
will be considered "greater than" all other values, except for `undefined`.
Previously, they were sorted as strings. This will result in different (but more
intuitive) sorting order.

Before:
```js
orderByFilter(['a', undefined, 'o', null, 'z']);
//--> 'a', null, 'o', 'z', undefined
```

After:
```js
orderByFilter(['a', undefined, 'o', null, 'z']);
//--> 'a', 'o', 'z', null, undefined
```

### **ngScenario** due to:
  - **[0cd392](https://github.com/angular/angular.js/commit/0cd39217828b0ad53eaf731576af17d66c18ff60)**: completely remove the angular scenario runner

The angular scenario runner end-to-end test framework has been
removed from the project and will no longer be available on npm
or bower starting with 1.7.0.
It was deprecated and removed from the documentation in 2014.
Applications that still use it should migrate to
[Protractor](http://www.protractortest.org).
Technically, it should also be possible to continue using an
older version of the scenario runner, as the underlying APIs have
not changed. However, we do not guarantee future compatibility.

### **form** due to:
  - **[223de5](https://github.com/angular/angular.js/commit/223de59e988dc0cc8b4ec3a045b7c0735eba1c77)**: set $submitted to true on child forms when parent is submitted

Forms will now set $submitted on child forms when they are submitted.
For example:
```
<form name="parentform" ng-submit="$ctrl.submit()">
  <ng-form name="childform">
    <input type="text" name="input" ng-model="my.model" />
  </ng-form>
  <input type="submit" />
</form>
```

Submitting this form will set $submitted on "parentform" and "childform".
Previously, it was only set on "parentform".

This change was introduced because mixing form and ngForm does not create
logically separate forms, but rather something like input groups.
Therefore, child forms should inherit the submission state from their parent form.

### **ngAria** due to:
  - **[6d5ef3](https://github.com/angular/angular.js/commit/6d5ef34fc6a974cde73157ba94f9706723dd8f5b)**: do not set aria attributes on input[type="hidden"]

ngAria no longer sets aria-* attributes on input[type="hidden"] with ngModel.
This can affect apps that test for the presence of aria attributes on hidden inputs.
To migrate, remove these assertions.
In actual apps, this should not have a user-facing effect, as the previous behavior
was incorrect, and the new behavior is correct for accessibility.

### **ngModel, input** due to:
  - **[74b04c](https://github.com/angular/angular.js/commit/74b04c9403af4fc7df5b6420f22c9f45a3e84140)**: improve handling of built-in named parsers

*Custom* parsers that fail to parse on input types "email", "url", "number", "date", "month",
"time", "datetime-local", "week", do no longer set `ngModelController.$error[inputType]`, and
the `ng-invalid-[inputType]` class. Also, custom parsers on input type "range" do no
longer set `ngModelController.$error.number` and the `ng-invalid-number` class.

Instead, any custom parsers on these inputs set `ngModelController.$error.parse` and
`ng-invalid-parse`. This change was made to make distinguishing errors from built-in parsers
and custom parsers easier.

### **ngModelOptions** due to:
  - **[55ba44](https://github.com/angular/angular.js/commit/55ba44913e02650b56410aa9ab5eeea5d3492b68)**: add debounce catch-all + allow debouncing 'default' only

the 'default' key in 'debounce' now only debounces the default event, i.e. the event
that is added as an update trigger by the different input directives automatically.

Previously, it also applied to other update triggers defined in 'updateOn' that
did not have a corresponding key in the 'debounce'.

This behavior is now supported via a special wildcard / catch-all key: '*'.

See the following example:

Pre-1.7:
'mouseup' is also debounced by 500 milliseconds because 'default' is applied:
```
ng-model-options="{
  updateOn: 'default blur mouseup',
  debounce: { 'default': 500, 'blur': 0 }
}
```

1.7:
The pre-1.7 behavior can be re-created by setting '*' as a catch-all debounce value:
```
ng-model-options="{
  updateOn: 'default blur mouseup',
  debounce: { '*': 500, 'blur': 0 }
}
```

In contrast, when only 'default' is used, 'blur' and 'mouseup' are not debounced:
```
ng-model-options="{
  updateOn: 'default blur mouseup',
  debounce: { 'default': 500 }
}
```

### **input\[number\]** due to:
  - **[aa3f95](https://github.com/angular/angular.js/commit/aa3f951330ec7b10b43ea884d9b5754e296770ec)**: validate min/max against viewValue

`input[type=number]` with `ngModel` now validates the input for the `max`/`min` restriction against
the `ngModelController.$viewValue` instead of against the `ngModelController.$modelValue`.

This affects apps that use `$parsers` or `$formatters` to transform the input / model value.

If you rely on the $modelValue validation, you can overwrite the `min`/`max` validator from a custom directive, as seen in the following example directive definition object:

```
{
  restrict: 'A',
  require: 'ngModel',
  link: function(scope, element, attrs, ctrl) {
    var maxValidator = ctrl.$validators.max;

    ctrl.$validators.max = function(modelValue, viewValue) {
      return maxValidator(modelValue, modelValue);
    };
  }
}
```

### **input** due to:
  - **[656c8f](https://github.com/angular/angular.js/commit/656c8fa8f23b1277cc5c214c4d0237f3393afa1e)**: listen on "change" instead of "click" for radio/checkbox ngModels

`input[radio]` and `input[checkbox]` now listen to the "change" event instead of the "click" event.
Most apps should not be affected, as "change" is automatically fired by browsers after "click"
happens.

Two scenarios might need migration:

- Custom click events:

Before this change, custom click event listeners on radio / checkbox would be called after the
input element and `ngModel` had been updated, unless they were specifically registered before
the built-in click handlers.
After this change, they are called before the input is updated, and can call event.preventDefault()
to prevent the input from updating.

If an app uses a click event listener that expects ngModel to be updated when it is called, it now
needs to register a change event listener instead.

- Triggering click events:

Conventional trigger functions:

The change event might not be fired when the input element is not attached to the document. This
can happen in **tests** that compile input elements and
trigger click events on them. Depending on the browser (Chrome and Safari) and the trigger method,
the change event will not be fired when the input isn't attached to the document.

Before:

```js
    it('should update the model', inject(function($compile, $rootScope) {
      var inputElm = $compile('<input type="checkbox" ng-model="checkbox" />')($rootScope);

      inputElm[0].click(); // Or different trigger mechanisms, such as jQuery.trigger()
      expect($rootScope.checkbox).toBe(true);
    });
```

With this patch, `$rootScope.checkbox` might not be true, because the click event
hasn't triggered the change event. To make the test, work append the inputElm to the app's
`$rootElement`, and the `$rootElement` to the `$document`.

After:

```js
    it('should update the model', inject(function($compile, $rootScope, $rootElement, $document) {
      var inputElm = $compile('<input type="checkbox" ng-model="checkbox" />')($rootScope);

      $rootElement.append(inputElm);
      $document.append($rootElement);

      inputElm[0].click(); // Or different trigger mechanisms, such as jQuery.trigger()
      expect($rootScope.checkbox).toBe(true);
    });
```

`triggerHandler()`:

If you are using this jQuery / jqLite function on the input elements, you don't have to attach
the elements to the document, but instead change the triggered event to "change". This is because
`triggerHandler(event)` only triggers the exact event when it has been added by jQuery / jqLite.

### **ngStyle** due to:
  - **[15bbd3](https://github.com/angular/angular.js/commit/15bbd3e18cd89b91f7206a06c73d40e54a8a48a0)**: use $watchCollection

Previously the use of deep watch by ng-style would trigger styles to be
re-applied when nested state changed. Now only changes to direct
properties of the watched object will trigger changes.

### **$compile** due to:
  - **[38f8c9](https://github.com/angular/angular.js/commit/38f8c97af74649ce224b6dd45f433cc665acfbfb)**: remove the preAssignBindingsEnabled flag

Previously, the `$compileProvider.preAssignBindingsEnabled` flag was supported.
The flag controlled whether bindings were available inside the controller
constructor or only in the `$onInit` hook. The bindings are now no longer
available in the constructor.

To migrate your code:

1. If you haven't invoked `$compileProvider.preAssignBindingsEnabled()` you
don't have to do anything to migrate.

2. If you specified `$compileProvider.preAssignBindingsEnabled(false)`, you
can remove that statement - since AngularJS 1.6.0 this is the default so your
app should still work even in AngularJS 1.6 after such removal. Afterwards,
migrating to AngularJS 1.7.0 shouldn't require any further action.

3. If you specified `$compileProvider.preAssignBindingsEnabled(true)` you need
to first migrate your code so that the flag can be flipped to `false`. The
instructions on how to do that are available in the "Migrating from 1.5 to 1.6"
guide:
https://docs.angularjs.org/guide/migration#migrating-from-1-5-to-1-6
Afterwards, remove the `$compileProvider.preAssignBindingsEnabled(true)`
statement.

  - **[6ccbfa](https://github.com/angular/angular.js/commit/6ccbfa65d60a3dc396d0cf6da21b993ad74653fd)**: lower the `xlink:href` security context for SVG's `a` and `image` elements

In the unlikely case that an app relied on RESOURCE_URL whitelisting for the
purpose of binding to the `xlink:href` property of SVG's `<a>` or `<image>`
elements and if the values do not pass the regular URL sanitization, they will
break.

To fix this you need to ensure that the values used for binding to the affected
`xlink:href` contexts are considered safe URLs, e.g. by whitelisting them in
`$compileProvider`'s `aHrefSanitizationWhitelist` (for `<a>` elements) or
`imgSrcSanitizationWhitelist` (for `<image>` elements).

  - **[fd4f01](https://github.com/angular/angular.js/commit/fd4f0111188b62773b99ab6eab38b4d2b5d8d727)**: do not use deepWatch in literal one-way bindings

Previously when a literal value was passed into a directive/component via
one-way binding it would be watched with a deep watcher.

For example, for `<my-component input="[a]">`, a new instance of the array
would be passed into the directive/component (and trigger $onChanges) not
only if `a` changed but also if any sub property of `a` changed such as
`a.b` or `a.b.c.d.e` etc.

This also means a new but equal value for `a` would NOT trigger such a
change.

Now literal values use an input-based watch similar to other directive/component
one-way bindings. In this context inputs are the non-constant parts of the
literal. In the example above the input would be `a`. Changes are only
triggered when the inputs to the literal change.

  - **[1cf728](https://github.com/angular/angular.js/commit/1cf728e209a9e0016068fac2769827e8f747760e)**: add `base[href]` to the list of RESOURCE_URL context attributes

Previously, `<base href="{{ $ctrl.baseUrl }}" />` would not require `baseUrl` to
be trusted as a RESOURCE_URL. Now, `baseUrl` will be sent to `$sce`'s
RESOURCE_URL checks. By default, it will break unless `baseUrl` is of the same
origin as the application document.

Refer to the
[`$sce` API docs](https://code.angularjs.org/snapshot/docs/api/ng/service/$sce)
for more info on how to trust a value in a RESOURCE_URL context.

Also, concatenation in trusted contexts is not allowed, which means that the
following won't work: `<base href="/something/{{ $ctrl.partialPath }}" />`.

Either construct complex values in a controller (recommended):

```js
this.baseUrl = '/something/' + this.partialPath;
```
```html
<base href="{{ $ctrl.baseUrl }}" />
```

Or use string concatenation in the interpolation expression (not recommended
except for the simplest of cases):

```html
<base href="{{ '/something/' + $ctrl.partialPath }}" />
```

### **ngTouch** due to:
  - **[11d9ad](https://github.com/angular/angular.js/commit/11d9ad1eb25eaf5967195e424108207427835d50)**: remove ngClick override, `$touchProvider`, and `$touch`

The `ngClick` directive from the ngTouch module has been removed, and with it the
corresponding `$touchProvider` and `$touch` service.

If you have included ngTouch v1.5.0 or higher in your application, and have not
changed the value of `$touchProvider.ngClickOverrideEnabled()`, or injected and used the `$touch`
service, then there are no migration steps for your code. Otherwise you must remove references to
the provider and service.

The `ngClick` override directive had been deprecated and by default disabled since v1.5.0,
because of buggy behavior in edge cases, and a general trend to avoid special touch based
overrides of click events. In modern browsers, it should not be necessary to use a touch override
library:

- Chrome, Firefox, Edge, and Safari remove the 300ms delay when
  `<meta name="viewport" content="width=device-width">` is set.
- Internet Explorer 10+, Edge, Safari, and Chrome remove the delay on elements that have the
  `touch-action` css property is set to `manipulation`.

You can find out more in these articles:
https://developers.google.com/web/updates/2013/12/300ms-tap-delay-gone-away
https://developer.apple.com/library/content/releasenotes/General/WhatsNewInSafari/Articles/Safari_9_1.html#//apple_ref/doc/uid/TP40014305-CH10-SW8
https://blogs.msdn.microsoft.com/ie/2015/02/24/pointer-events-w3c-recommendation-interoperable-touch-and-removing-the-dreaded-300ms-tap-delay/

### **Angular** due to:
  - **[1daa4f](https://github.com/angular/angular.js/commit/1daa4f2231a89ee88345689f001805ffffa9e7de)**: remove `angular.lowercase` and `angular.uppercase`

The helper functions `angular.lowercase` `and angular.uppercase` have
been removed.

These functions have been deprecated since 1.5.0. They are internally
used, but should not be exposed as they contain special locale handling
(for Turkish) to maintain internal consistency regardless of user-set locale.

Developers should generally use the built-ins `toLowerCase` and `toUpperCase`
or `toLocaleLowerCase` and `toLocaleUpperCase` for special cases.

Further, we generally discourage using the angular.x helpers in application code.

### **$controller** due to:
  - **[e269c1](https://github.com/angular/angular.js/commit/e269c14425a3209040f65c022658770e00a36f16)**: remove instantiating controllers defined on window

The option to instantiate controllers from constructors on the global `window` object
has been removed. Likewise, the deprecated `$controllerProvider.allowGlobals()`
method that could enable this behavior, has been removed.

This behavior had been deprecated since AngularJS v1.3.0, because polluting the global scope
is bad. To migrate, remove the call to $controllerProvider.allowGlobals() in the config, and
register your controller via the Module API or the $controllerProvider, e.g.

```
angular.module('myModule', []).controller('myController', function() {...});

angular.module('myModule', []).config(function($controllerProvider) {
  $controllerProvider.register('myController', function() {...});
});

```

### **$rootScope** due to:
  - **[c2b8fa](https://github.com/angular/angular.js/commit/c2b8fab0a480204374d561d6b9b3d47347ac5570)**: provide correct value of one-time bindings in watchGroup

Previously when using `$watchGroup` the entries in `newValues` and
`oldValues` represented the *most recent change of each entry*.

Now the entries in `oldValues` will always equal the `newValues` of the previous
call of the listener. This means comparing the entries in `newValues` and
`oldValues` can be used to determine which individual expressions changed.

For example `$scope.$watchGroup(['a', 'b'], fn)` would previously:

|  Action  |  newValue  |  oldValue  |
|----------|------------|------------|
|  (init)  | [undefined, undefined] | [undefined, undefined] |
|  `a=1`   | [1, undefined] | [undefined, undefined] |
|  `a=2`   | [2, undefined] | [1, undefined] |
|  `b=3`   | [2, 3] | [1, undefined] |


Now the `oldValue` will always equal the previous `newValue`:

|  Action  |  newValue  |  oldValue  |
|----------|------------|------------|
|  (init)  | [undefined, undefined] | [undefined, undefined] |
|  `a=1`   | [1, undefined] | [undefined, undefined] |
|  `a=2`   | [2, undefined] | [1, undefined] |
|  `b=3`   | [2, 3] | [2, undefined] |

Note the last call now shows `a === 2` in the `oldValues` array.

This also makes the `oldValue` of one-time watchers more clear. Previously
the `oldValue` of a one-time watcher would remain `undefined` forever. For
example `$scope.$watchGroup(['a', '::b'], fn)` would previously:

|  Action  |  newValue  |  oldValue  |
|----------|------------|------------|
|  (init)  | [undefined, undefined] | [undefined, undefined] |
|  `a=1`   | [1, undefined] | [undefined, undefined] |
|  `b=2`   | [1, 2] | [undefined, undefined] |
|  `a=b=3` | [3, 2] | [1, undefined] |

Where now the `oldValue` will always equal the previous `newValue`:

|  Action  |  newValue  |  oldValue  |
|----------|------------|------------|
|  (init)  | [undefined, undefined] | [undefined, undefined] |
|  `a=1`   | [1, undefined] | [undefined, undefined] |
|  `b=2`   | [1, 2] | [1, undefined] |
|  `a=b=3` | [3, 2] | [1, 2] |

### **$interval** due to:
  - **[a8bef9](https://github.com/angular/angular.js/commit/a8bef95127775d83d80daa4617c33227c4b443d4)**: throw when trying to cancel non-$interval promise

`$interval.cancel()` will throw an error if called with a promise that
was not generated by `$interval()`. Previously, it would silently do
nothing.

Before:
```js
var promise = $interval(doSomething, 1000, 5).then(doSomethingElse);
$interval.cancel(promise);  // No error; interval NOT canceled.
```

After:
```js
var promise = $interval(doSomething, 1000, 5).then(doSomethingElse);
$interval.cancel(promise);  // Throws error.
```

Correct usage:
```js
var promise = $interval(doSomething, 1000, 5);
var newPromise = promise.then(doSomethingElse);
$interval.cancel(promise);  // Interval canceled.
```

### **$timeout** due to:
  - **[336525](https://github.com/angular/angular.js/commit/3365256502344970f86355d3ace1cb4251ae9828)**: throw when trying to cancel non-$timeout promise

`$timeout.cancel()` will throw an error if called with a promise that
was not generated by `$timeout()`. Previously, it would silently do
nothing.

Before:
```js
var promise = $timeout(doSomething, 1000).then(doSomethingElse);
$timeout.cancel(promise);  // No error; timeout NOT canceled.
```

After:
```js
var promise = $timeout(doSomething, 1000).then(doSomethingElse);
$timeout.cancel(promise);  // Throws error.
```

Correct usage:
```js
var promise = $timeout(doSomething, 1000);
var newPromise = promise.then(doSomethingElse);
$timeout.cancel(promise);  // Timeout canceled.
```


<a name="1.6.10"></a>
# 1.6.10 crystalline-persuasion (2018-04-17)

## Bug Fixes
- **$compile:**
  - correctly handle `null`/`undefined` href `attrs.$set()`
  ([f04e04](https://github.com/angular/angular.js/commit/f04e04e0e63e0d30c29718abd5cae634901793b2),
  [#16520](https://github.com/angular/angular.js/issues/16520))
  - throw error in `$onChanges` immediately
  ([b7d1e0fbd](https://github.com/angular/angular.js/commit/983e27b628fd1eab653e2b3966d90a270f27cc93),
  [#15578](https://github.com/angular/angular.js/issues/15578),
  [#16492](https://github.com/angular/angular.js/issues/16492))
- **input:**
  - allow overriding timezone for date input types
  ([4355de](https://github.com/angular/angular.js/commit/4355dee21d26667bb7f6f21bf75c081351315033),
  [#16181](https://github.com/angular/angular.js/issues/16181),
  [#13382](https://github.com/angular/angular.js/issues/13382),
  [#16336](https://github.com/angular/angular.js/issues/16336))
  - take timezone into account when validating minimum and maximum in date types
  ([2f0ac6](https://github.com/angular/angular.js/commit/2f0ac696cb09aec3e291bb8c9c8a1092cbe3a061),
  [#16342](https://github.com/angular/angular.js/issues/16342),
  [#16390](https://github.com/angular/angular.js/issues/16390))
  - fix composition mode in IE for Korean input
  ([9a1b7c](https://github.com/angular/angular.js/commit/9a1b7c9fa135d1dae3f9b4ccf48f081675796e92),
  [#6656](https://github.com/angular/angular.js/issues/6656),
  [#16273](https://github.com/angular/angular.js/issues/16273))
- **jqLite:** use XHTML-compliant HTML as input for jqLite
  ([a0c55a](https://github.com/angular/angular.js/commit/a0c55af9858075ab268a88dd7a4464788a46f4b7),
  [#6917](https://github.com/angular/angular.js/issues/6917),
  [#16518](https://github.com/angular/angular.js/issues/16518))
- **minErr:** update url to https
  ([52e466](https://github.com/angular/angular.js/commit/52e46683bfcc0ce0dc9a3d2ee42b389508423799))
- **$http:** set correct xhrStatus in response when using 'timeout'
  ([1faf7e](https://github.com/angular/angular.js/commit/1faf7ec30d55bba107b18efbcf0ef07732c55b91))
- **browserTrigger:** support CompositionEvent
  ([c33fd1](https://github.com/angular/angular.js/commit/c33fd1325417fdc6d7d6abc90cd935130653b149))


## New Features
- **$http:** support sending XSRF token to whitelisted origins
  ([bc7757](https://github.com/angular/angular.js/commit/bc775759c88b2221c2bb71d2335bc233c93f43b0),
  [#7862](https://github.com/angular/angular.js/issues/7862))
- **minErr:** strip error url from error parameters
  ([980b69](https://github.com/angular/angular.js/commit/980b69dcae73dd8a3d0b9d91b63fa7711cd0ba36))
- **$sanitize:** support enhancing elements/attributes white-lists
  ([ee8e05](https://github.com/angular/angular.js/commit/ee8e05cfafe086188fc318ed4115fb56ba335112),
  [#5900](https://github.com/angular/angular.js/issues/5900),
  [#16326](https://github.com/angular/angular.js/issues/16326))
- **$rootScope:** allow suspending and resuming watchers on scope
  ([efb822c58](https://github.com/angular/angular.js/commit/41d5c90f170cc054b0f8f88220c22ef1ef6cc0a6),
  [#16308](https://github.com/angular/angular.js/issues/5301))

<a name="1.6.9"></a>
# 1.6.9 fiery-basilisk (2018-02-02)


## Bug Fixes
- **input:** add `drop` event support for IE
  ([5dc076](https://github.com/angular/angular.js/commit/5dc07667de00c5e85fd69c5b7b7fe4fb5fd65a77))
- **ngMessages:** prevent memory leak from messages that are never attached
  ([9d058d](https://github.com/angular/angular.js/commit/9d058de04bb78694b83179e9b97bc40214eca01a),
  [#16389](https://github.com/angular/angular.js/issues/16389),
  [#16404](https://github.com/angular/angular.js/issues/16404),
  [#16406](https://github.com/angular/angular.js/issues/16406))
- **ngTransclude:** remove terminal: true
  ([1d826e](https://github.com/angular/angular.js/commit/1d826e2f1e941d14c3c56d7a0249f5796ba11f85),
  [#16411](https://github.com/angular/angular.js/issues/16411),
  [#16412](https://github.com/angular/angular.js/issues/16412))
- **$sanitize:** sanitize `xml:base` attributes
  ([b9ef65](https://github.com/angular/angular.js/commit/b9ef6585e10477fbbf912a971fe0b390bca692a6))


## New Features
- **currencyFilter:** trim whitespace around an empty currency symbol
  ([367390](https://github.com/angular/angular.js/commit/3673909896efb6ff47546caf7fc61549f193e043),
  [#15018](https://github.com/angular/angular.js/issues/15018),
  [#15085](https://github.com/angular/angular.js/issues/15085),
  [#15105](https://github.com/angular/angular.js/issues/15105))


<a name="1.6.8"></a>
# 1.6.8 beneficial-tincture (2017-12-18)


## Bug Fixes
- **$location:**
  - always decode special chars in `$location.url(value)`
  ([2bdf71](https://github.com/angular/angular.js/commit/2bdf7126878c87474bb7588ce093d0a3c57b0026))
  - decode non-component special chars in Hashbang URLS
  ([57b626](https://github.com/angular/angular.js/commit/57b626a673b7530399d3377dfe770165bec35f8a))
- **ngModelController:** allow $overrideModelOptions to set updateOn
  ([55516d](https://github.com/angular/angular.js/commit/55516da2dfc7c5798dce24e9fa930c5ac90c900c),
  [#16351](https://github.com/angular/angular.js/issues/16351),
  [#16364](https://github.com/angular/angular.js/issues/16364))


## New Features
- **$parse:** add a hidden interface to retrieve an expression's AST
  ([f33d95](https://github.com/angular/angular.js/commit/f33d95cfcff6fd0270f92a142df8794cca2013ad),
  [#16253](https://github.com/angular/angular.js/issues/16253),
  [#16260](https://github.com/angular/angular.js/issues/16260))

<a name="1.6.7"></a>
# 1.6.7 imperial-backstroke (2017-11-24)


## Bug Fixes
- **$compile:** sanitize special chars in directive name
  ([c4003f](https://github.com/angular/angular.js/commit/c4003fd03489f876b646f06838f4edb576bacf6f),
  [#16314](https://github.com/angular/angular.js/issues/16314),
  [#16278](https://github.com/angular/angular.js/issues/16278))
- **$location:** do not decode forward slashes in the path in HTML5 mode
  ([e06ebf](https://github.com/angular/angular.js/commit/e06ebfdbb558544602fe9da4d7d98045a965f468),
  [#16312](https://github.com/angular/angular.js/issues/16312))
- **sanitizeUri:** sanitize URIs that contain IDEOGRAPHIC SPACE chars
  ([ddeb1d](https://github.com/angular/angular.js/commit/ddeb1df15a23de93eb95dbe202e83e93673e1c4e),
  [#16288](https://github.com/angular/angular.js/issues/16288))
- **$rootScope:** fix potential memory leak when removing scope listeners
  ([358a69](https://github.com/angular/angular.js/commit/358a69fa8b89b251ee44e523458d6c7f40b92b2d),
  [#16135](https://github.com/angular/angular.js/issues/16135),
  [#16161](https://github.com/angular/angular.js/issues/16161))
- **http:** do not allow encoded callback params in jsonp requests
  ([569e90](https://github.com/angular/angular.js/commit/569e906a5818271416ad0b749be2f58dc34938bd))
- **ngMock:** pass unexpected request failures in `$httpBackend` to the error handler
  ([1555a4](https://github.com/angular/angular.js/commit/1555a4911ad5360c145c0ddc8ec6c4bf9a381c13),
  [#16150](https://github.com/angular/angular.js/issues/16150),
  [#15855](https://github.com/angular/angular.js/issues/15855))
- **ngAnimate:** don't close transitions when child transitions close
  ([1391e9](https://github.com/angular/angular.js/commit/1391e99c7f73795180b792af21ad4402f96e225d),
  [#16210](https://github.com/angular/angular.js/issues/16210))
- **ngMock.browserTrigger:** add 'bubbles' to Transition/Animation Event
  ([7a5f06](https://github.com/angular/angular.js/commit/7a5f06d55d123a39bb7b030667fb1ab672939598))


## New Features
- **$sanitize, $compileProvider, linky:** add support for the "sftp" protocol in links
  ([a675ea](https://github.com/angular/angular.js/commit/a675ea034366fbb0fcf0d73fed65216aa99bce11),
  [#16102](https://github.com/angular/angular.js/issues/16102))
- **ngModel.NgModelController:** expose $processModelValue to run model -> view pipeline
  ([145194](https://github.com/angular/angular.js/commit/14519488ce9218aa891d34e89fc3271fd4ed0f04),
  [#3407](https://github.com/angular/angular.js/issues/3407),
  [#10764](https://github.com/angular/angular.js/issues/10764),
  [#16237](https://github.com/angular/angular.js/issues/16237))
- **$injector:** ability to load new modules after bootstrapping
  ([6e78fe](https://github.com/angular/angular.js/commit/6e78fee73258bb0ae36414f9db2e8734273e481b))


## Performance Improvements
- **jqLite:**
  - avoid setting class attribute when not changed
  ([9c95f6](https://github.com/angular/angular.js/commit/9c95f6d5e00ee7e054aabb3e363f5bfb3b7b4103))
  - avoid repeated add/removeAttribute in jqLiteRemoveClass
  ([cab9eb](https://github.com/angular/angular.js/commit/cab9ebfd5a02e897f802bf6321b8471e4843c5d3),
  [#16078](https://github.com/angular/angular.js/issues/16078),
  [#16131](https://github.com/angular/angular.js/issues/16131))


<a name="1.6.6"></a>
# 1.6.6 interdimensional-cable (2017-08-18)


## Bug Fixes
- **$httpParamSerializer:** ignore functions
  ([b51ded](https://github.com/angular/angular.js/commit/b51ded67366865f36c5781dd5d9b801488ec95ea),
  [#16133](https://github.com/angular/angular.js/issues/16133))
- **$resource:** do not throw when calling old `$cancelRequest()`
  ([009ebe](https://github.com/angular/angular.js/commit/009ebec64c81d11b280c635167050e8906e191c6),
  [#16037](https://github.com/angular/angular.js/issues/16037))
- **$parse:**
  - do not shallow-watch computed property keys
  ([750465](https://github.com/angular/angular.js/commit/7504656a26202de591e4ac9674333254304edf8a))
  - support constants in computed keys
  ([9d6c3f](https://github.com/angular/angular.js/commit/9d6c3f3ec233279885e37a250d25860d5c15f716))
- **$http:** do not throw error if `Content-Type` is not `application/json` but response is JSON-like
  ([2e1163](https://github.com/angular/angular.js/commit/2e1163ef5cb56d1933e8ecd7b74020b9df9c6693),
  [#16027](https://github.com/angular/angular.js/issues/16027),
  [#16075](https://github.com/angular/angular.js/issues/16075))


## New Features
- **$compile:** add `strictComponentBindingsEnabled()` method
  ([3ec181](https://github.com/angular/angular.js/commit/3ec1819b913c8edf0649e06217dbd5920f29f126),
  [#16129](https://github.com/angular/angular.js/issues/16129))
- **$resource:** add resource to response for error interceptors
  ([9256db](https://github.com/angular/angular.js/commit/9256dbc4201343ce5cd63a9eadf98da4793f45af),
  [#16109](https://github.com/angular/angular.js/issues/16109))
- **$http:** allow differentiation between XHR completion, error, abort, timeout
  ([5e2bc5](https://github.com/angular/angular.js/commit/5e2bc5bbf347a9dfadc08b1514b8be06fd550913),
  [#15924](https://github.com/angular/angular.js/issues/15924),
  [#15847](https://github.com/angular/angular.js/issues/15847))


<a name="1.6.5"></a>
# 1.6.5 toffee-salinization (2017-07-03)


## Bug Fixes
- **core:**
  - correctly detect Error instances from different contexts
  ([6daca0](https://github.com/angular/angular.js/commit/6daca023e42098f7098b9bf153c8e53a17af84f1),
  [#15868](https://github.com/angular/angular.js/issues/15868),
  [#15872](https://github.com/angular/angular.js/issues/15872))
  - deprecate `angular.merge`
  ([dc41f4](https://github.com/angular/angular.js/commit/dc41f465baae9bc91418a61f446596157c530b6e),
  [#12653](https://github.com/angular/angular.js/issues/12653),
  [#14941](https://github.com/angular/angular.js/issues/14941),
  [#15180](https://github.com/angular/angular.js/issues/15180),
  [#15992](https://github.com/angular/angular.js/issues/15992),
  [#16036](https://github.com/angular/angular.js/issues/16036))
- **ngOptions:**
  - re-render after empty option has been removed
  ([510d0f](https://github.com/angular/angular.js/commit/510d0f946fa1a443ad43fa31bc9337676ef31332))
  - allow empty option to be removed and re-added
  ([71b4da](https://github.com/angular/angular.js/commit/71b4daa4e10b6912891927ee2a7930c604b538f8))
  - select unknown option if unmatched model does not match empty option
  ([17d34b](https://github.com/angular/angular.js/commit/17d34b7a983a0ef63f6cf404490385c696fb0da1))
- **orderBy:** guarantee stable sort
  ([e50ed4](https://github.com/angular/angular.js/commit/e50ed4da9e8177168f67da68bdf02f07da4e7bcf),
  [#14881](https://github.com/angular/angular.js/issues/14881),
  [#15914](https://github.com/angular/angular.js/issues/15914))
- **$parse:**
  - do not shallow-watch inputs to one-time intercepted expressions
  ([6e3b5a](https://github.com/angular/angular.js/commit/6e3b5a57cd921823f3eca7200a79ac5c2ef0567a))
  - standardize one-time literal vs non-literal and interceptors
  ([f003d9](https://github.com/angular/angular.js/commit/f003d93a3dd052dccddef41125d9c51034ac3605))
  - do not shallow-watch inputs when wrapped in an interceptor fn
  ([aac562](https://github.com/angular/angular.js/commit/aac5623247a86681cbe0e1c8179617b816394c1d),
  [#15905](https://github.com/angular/angular.js/issues/15905))
  - always re-evaluate filters within literals when an input is an object
  ([ec9768](https://github.com/angular/angular.js/commit/ec97686f2f4a5481cc806462313a664fc7a1c893),
  [#15964](https://github.com/angular/angular.js/issues/15964),
  [#15990](https://github.com/angular/angular.js/issues/15990))
- **$sanitize:** use appropriate inert document strategy for Firefox and Safari
  ([8f31f1](https://github.com/angular/angular.js/commit/8f31f1ff43b673a24f84422d5c13d6312b2c4d94))
- **$timeout/$interval:** do not trigger a digest on cancel
  ([a222d0](https://github.com/angular/angular.js/commit/a222d0b452622624dc498ef0b9d3c43647fd4fbc),
  [#16057](https://github.com/angular/angular.js/issues/16057),
  [#16064](https://github.com/angular/angular.js/issues/16064))<br>
  This change might affect the use of `$timeout.flush()` in unit tests. See the commit message for
  more info.
- **ngMock/$interval:** add support for zero-delay intervals in tests
  ([a1e3f8](https://github.com/angular/angular.js/commit/a1e3f8728e0a80396f980e48f8dc68dde6721b2b),
  [#15952](https://github.com/angular/angular.js/issues/15952),
  [#15953](https://github.com/angular/angular.js/issues/15953))
- **angular-loader:** do not depend on "closure" globals that may not be available
  ([a3226d](https://github.com/angular/angular.js/commit/a3226d01fadaf145713518dc5b8022b581c34e81),
  [#15880](https://github.com/angular/angular.js/issues/15880),
  [#15881](https://github.com/angular/angular.js/issues/15881))


## New Features
- **select:** expose info about selection state in controller
  ([0b962d](https://github.com/angular/angular.js/commit/0b962d4881e98327a91c37f7317da557aa991663),
  [#13172](https://github.com/angular/angular.js/issues/13172),
  [#10127](https://github.com/angular/angular.js/issues/10127))
- **$animate:** add support for `customFilter`
  ([ab114a](https://github.com/angular/angular.js/commit/ab114af8508bdbdb1fa5fd1e070d08818d882e28),
  [#14891](https://github.com/angular/angular.js/issues/14891))
- **$compile:** overload `.component()` to accept object map of components
  ([210112](https://github.com/angular/angular.js/commit/2101126ce72308d8fc468ca2411bb9972e614f79),
  [#14579](https://github.com/angular/angular.js/issues/14579),
  [#16062](https://github.com/angular/angular.js/issues/16062))
- **$log:** log all parameters in IE 9, not just the first two.
  ([3671a4](https://github.com/angular/angular.js/commit/3671a43be43d05b00c90dfb3a3f746c013139581))
- **ngMock:** describe unflushed http requests
  ([d9128e](https://github.com/angular/angular.js/commit/d9128e7b2371ab2bb5169ba854b21c78baa784d2),
  [#10596](https://github.com/angular/angular.js/issues/10596),
  [#15928](https://github.com/angular/angular.js/issues/15928))


## Performance Improvements
- **ngOptions:** prevent initial options repainting
  ([ff52b1](https://github.com/angular/angular.js/commit/ff52b188a759f2cc7ee6ee78a8c646c2354a47eb),
  [#15801](https://github.com/angular/angular.js/issues/15801),
  [#15812](https://github.com/angular/angular.js/issues/15812),
  [#16071](https://github.com/angular/angular.js/issues/16071))
- **$animate:**
  - avoid unnecessary computations if animations are globally disabled
  ([ce5ffb](https://github.com/angular/angular.js/commit/ce5ffbf667464bd58eae4c4af0917eb2685f1f6a),
  [#14914](https://github.com/angular/angular.js/issues/14914))
  - do not retrieve `className` unless `classNameFilter` is used
  ([275978](https://github.com/angular/angular.js/commit/27597887379a1904cd86832602e286894b449a75))



<a name="1.6.4"></a>
# 1.6.4 phenomenal-footnote (2017-03-31)


## Bug Fixes
- **$parse:**
  - standardize one-time literal vs non-literal and interceptors
  ([60394a](https://github.com/angular/angular.js/commit/60394a9d91dad8932fa900af7c8529837f1d4557),
  [#15858](https://github.com/angular/angular.js/issues/15858))
  - fix infinite digest errors when watching objects with .valueOf in literals
  ([f5ddb1](https://github.com/angular/angular.js/commit/f5ddb10b56676c2ad912ce453acb87f0a7a94e01),
  [#15867](https://github.com/angular/angular.js/issues/15867))
- **ngModel:** prevent internal scope reference from being copied
  ([e1f8a6](https://github.com/angular/angular.js/commit/e1f8a6e82bb8a70079ef3db9a891b1c08b5bae31),
  [#15833](https://github.com/angular/angular.js/issues/15833))
- **jqLite:** make jqLite invoke jqLite.cleanData as a method
  ([9cde98](https://github.com/angular/angular.js/commit/9cde98cbc770f8d33fc074ba563b7ab6e2baaf8b),
  [#15846](https://github.com/angular/angular.js/issues/15846))
- **$http:** throw more informative error on invalid JSON response
  ([df8887](https://github.com/angular/angular.js/commit/df88873bb79213057057adb47151b626a7ec0e5d),
  [#15695](https://github.com/angular/angular.js/issues/15695),
  [#15724](https://github.com/angular/angular.js/issues/15724))
- **dateFilter:** correctly handle newlines in `format` string
  ([982271](https://github.com/angular/angular.js/commit/9822711ad2a401c2449239edc13d18b301714757),
  [#15794](https://github.com/angular/angular.js/issues/15794),
  [#15792](https://github.com/angular/angular.js/issues/15792))


## New Features
- **$resource:** add `hasBody` action configuration option
  ([a9f987](https://github.com/angular/angular.js/commit/a9f987a0c9653246ea471a89197907d94c0cea2a),
  [#10128](https://github.com/angular/angular.js/issues/10128),
  [#12181](https://github.com/angular/angular.js/issues/12181))


<a name="1.6.3"></a>
# 1.6.3 scriptalicious-bootstrapping (2017-03-08)


## Bug Fixes
- **AngularJS:**
  - do not auto-bootstrap if the `src` exists but is empty
  ([3536e8](https://github.com/angular/angular.js/commit/3536e83d8a085b02bd6dcec8324800b7e6c734e4))
  - do not auto bootstrap if the currentScript has been clobbered
  ([95f964](https://github.com/angular/angular.js/commit/95f964b827b6f5b5aab10af54f7831316c7a9935))
  - do not auto-bootstrap if the script source is bad and inside SVG
  ([c8f78a](https://github.com/angular/angular.js/commit/c8f78a8ca9debc33a6deaf951f344b8d372bf210))
- **$log:** don't parse error stacks manually outside of IE/Edge
  ([64e5af](https://github.com/angular/angular.js/commit/64e5afc4786fdfd850c6bdb488a5aa2b8b077f74),
  [#15590](https://github.com/angular/angular.js/issues/15590),
  [#15767](https://github.com/angular/angular.js/issues/15767))
- **$sanitize:** prevent clobbered elements from freezing the browser
  ([3bb1dd](https://github.com/angular/angular.js/commit/3bb1dd5d7f7dcde6fea5a3148f8f10e92f451e9d),
  [#15699](https://github.com/angular/angular.js/issues/15699))
- **$animate:**
  - reset `classNameFilter` to `null` when a disallowed RegExp is used
  ([a584fb](https://github.com/angular/angular.js/commit/a584fb6e1569fc1dd85e23b251a7c126edc2dd5b),
  [#14913](https://github.com/angular/angular.js/issues/14913))
  - improve detection on `ng-animate` in `classNameFilter` RegExp
  ([1f1331](https://github.com/angular/angular.js/commit/1f13313f403381581e1c31c57ebfe7a96546c6e4),
  [#14806](https://github.com/angular/angular.js/issues/14806))
- **filterFilter:** don't throw if `key.charAt` is not a function
  ([f27d19](https://github.com/angular/angular.js/commit/f27d19ed606bf05ba41698159ebbc5fbc195033e),
  [#15644](https://github.com/angular/angular.js/issues/15644),
  [#15660](https://github.com/angular/angular.js/issues/15660))
- **select:**
  - add attribute "selected" for `select[multiple]`
  ([851367](https://github.com/angular/angular.js/commit/8513674911300b27d518383a905fde9b3f25f7ae))
  - keep original selection when using shift to add options in IE/Edge
  ([97b74a](https://github.com/angular/angular.js/commit/97b74ad6fbcbc4b63e37e9eb44962d6f8de83e8b),
  [#15675](https://github.com/angular/angular.js/issues/15675),
  [#15676](https://github.com/angular/angular.js/issues/15676))
- **$jsonpCallbacks:** allow `$window` to be mocked in unit tests
  ([5ca0de](https://github.com/angular/angular.js/commit/5ca0de64873c32ab2f540a3226e73c4175a15c50),
  [#15685](https://github.com/angular/angular.js/issues/15685),
  [#15686](https://github.com/angular/angular.js/issues/15686))


## New Features
- **info:** add `angularVersion` info to each module
  ([1e582e](https://github.com/angular/angular.js/commit/1e582e4fa486f340150bba95927f1b26d9142de2))
- **$injector:** add new `modules` property
  ([742123](https://github.com/angular/angular.js/commit/7421235f247e5b7113345401bc5727cfbf81ddc2))
- **Module:** add `info()` method
  ([09ba69](https://github.com/angular/angular.js/commit/09ba69078de6ba52c70571b82b6205929f6facc5),
  [#15225](https://github.com/angular/angular.js/issues/15225))
- **errorHandlingConfig:** make the depth for object stringification in errors configurable
  ([4a5eaf](https://github.com/angular/angular.js/commit/4a5eaf7bec85ceca8b934ebaff4d1834a1a09f57),
  [#15402](https://github.com/angular/angular.js/issues/15402),
  [#15433](https://github.com/angular/angular.js/issues/15433))


<a name="1.6.2"></a>
# 1.6.2 llamacorn-lovehug (2017-02-07)


## Bug Fixes
- **$compile:**
  - do not swallow thrown errors in testsg
  ([0377c6](https://github.com/angular/angular.js/commit/0377c6f0e890cb4ed3eb020b96720b4b34f75df3),
  [#15629](https://github.com/angular/angular.js/issues/15629),
  [#15631](https://github.com/angular/angular.js/issues/15631))
  - allow the usage of "$" in isolate scope property alias
  ([7f2af3](https://github.com/angular/angular.js/commit/7f2af3f923e7a3f85c8862d0ed57d21c72eae904),
  [#15594](https://github.com/angular/angular.js/issues/15594))
- **$location:** correctly handle external URL change during `$digest`
  ([b60761](https://github.com/angular/angular.js/commit/b607618342d6c4fab364966fe05f152be6bd4d5f),
  [#11075](https://github.com/angular/angular.js/issues/11075),
  [#12571](https://github.com/angular/angular.js/issues/12571),
  [#15556](https://github.com/angular/angular.js/issues/15556),
  [#15561](https://github.com/angular/angular.js/issues/15561))
- **$browser:** detect external changes in `history.state`
  ([fa50fb](https://github.com/angular/angular.js/commit/fa50fbaf57b3437be7a410ecaba7008dbe0ef239))
- **$resource:**
  - do not swallow errors in `success` callback
  ([27146e](https://github.com/angular/angular.js/commit/27146e8a7fad54c1342179b6d291b1b5c2ebe816),
  [#15624](https://github.com/angular/angular.js/issues/15624),
  [#15628](https://github.com/angular/angular.js/issues/15628))
  - correctly unescape `/\.` even if `\.` comes from a param value
  ([419a48](https://github.com/angular/angular.js/commit/419a4813e354496bdf0df44e3f8afaa198df1ab1),
  [#15627](https://github.com/angular/angular.js/issues/15627))
  - delete `$cancelRequest()` in `toJSON()`
  ([086c5d](https://github.com/angular/angular.js/commit/086c5d0354db8cb3d106b9ff966fb48d6fb46ef8),
  [#15244](https://github.com/angular/angular.js/issues/15244))
- **$animate:** correctly animate transcluded clones with `templateUrl`
  ([f01212](https://github.com/angular/angular.js/commit/f01212ab5287ac7a154da7d75037ed444e81eb34),
  [#15510](https://github.com/angular/angular.js/issues/15510),
  [#15514](https://github.com/angular/angular.js/issues/15514))
- **$route:** make asynchronous tasks count as pending requests
  ([eb968c](https://github.com/angular/angular.js/commit/eb968c4a6884838db05369a04459066424c5bba8),
  [#14159](https://github.com/angular/angular.js/issues/14159))
- **$parse:** make sure ES6 object computed properties are watched
  ([5e418b](https://github.com/angular/angular.js/commit/5e418b1145a1045da598c7863e785d647ea83850),
  [#15678](https://github.com/angular/angular.js/issues/15678))
- **$sniffer:** allow `history` for NW.js apps
  ([4a593d](https://github.com/angular/angular.js/commit/4a593db79ba1e21a6aa600a82cf6d757cad94d01),
  [#15474](https://github.com/angular/angular.js/issues/15474),
  [#15633](https://github.com/angular/angular.js/issues/15633))
- **input:** fix `step` validation for `input[type=number/range]`
  ([c95a67](https://github.com/angular/angular.js/commit/c95a6737fbd277e40c064bd9f68f383bf119505c),
  [#15504](https://github.com/angular/angular.js/issues/15504),
  [#15506](https://github.com/angular/angular.js/issues/15506))
- **select:** keep `ngModel` when selected option is recreated by `ngRepeat`
  ([131af8](https://github.com/angular/angular.js/commit/131af8272d269a541d04cb522c264a91e0ec8b6a),
  [#15630](https://github.com/angular/angular.js/issues/15630),
  [#15632](https://github.com/angular/angular.js/issues/15632))
- **ngValue:** correctly update the `value` property when `value` is undefined
  ([05aab6](https://github.com/angular/angular.js/commit/05aab660ce74f526f2110d3b5faf9a5b4f4e664b)
  [#15603](https://github.com/angular/angular.js/issues/15603),
  [#15605](https://github.com/angular/angular.js/issues/15605))
- **angularInit:** allow auto-bootstrapping from inline script
  ([bb464d](https://github.com/angular/angular.js/commit/bb464d16b434b9e2de2fecf80c192d4741cba879),
  [#15567](https://github.com/angular/angular.js/issues/15567),
  [#15571](https://github.com/angular/angular.js/issues/15571))
- **ngMockE2E:** ensure that mocked `$httpBackend` uses correct `$browser`
  ([bd63b2](https://github.com/angular/angular.js/commit/bd63b2235cd410251cb83eebd9a47d3102830b6b),
  [#15593](https://github.com/angular/angular.js/issues/15593))


## New Features
- **ngModel:** add `$overrideModelOptions` support
  ([2546c2](https://github.com/angular/angular.js/commit/2546c29f811b68eea4d68be7fa1c8f7bb562dc11),
  [#15415](https://github.com/angular/angular.js/issues/15415))
- **$parse:** allow watching array/object literals with non-primitive values
  ([25f008](https://github.com/angular/angular.js/commit/25f008f541d68b09efd7b428b648c6d4899e6972),
  [#15301](https://github.com/angular/angular.js/issues/15301))



<a name="1.5.11"></a>
# 1.5.11 princely-quest (2017-01-13)


## Bug Fixes
- **$compile:** allow the usage of "$" in isolate scope property alias
  ([e75fbc](https://github.com/angular/angular.js/commit/e75fbc494e6a0da6a9231b40bb0382431b62be07),
  [#15586](https://github.com/angular/angular.js/issues/15586),
  [#15594](https://github.com/angular/angular.js/issues/15594))
- **angularInit:** allow auto-bootstrapping from inline script
  ([41aa91](https://github.com/angular/angular.js/commit/41aa9125b9aaf771addb250642f524a4e6f9d8d3),
  [#15567](https://github.com/angular/angular.js/issues/15567),
  [#15571](https://github.com/angular/angular.js/issues/15571))
- **$resource:** delete `$cancelRequest()` in `toJSON()`
  ([4f3858](https://github.com/angular/angular.js/commit/4f3858e7c371f87534397f45b9d002add33b00cc),
  [#15244](https://github.com/angular/angular.js/issues/15244))
- **$$cookieReader:** correctly handle forbidden access to `document.cookie`
  ([6933cf](https://github.com/angular/angular.js/commit/6933cf64fe51f54b10d1639f2b95bab3c1178df9),
  [#15523](https://github.com/angular/angular.js/issues/15523),
  [#15532](https://github.com/angular/angular.js/issues/15532))



<a name="1.6.1"></a>
# 1.6.1 promise-rectification (2016-12-23)


## Bug Fixes
- **$q:** Add traceback to unhandled promise rejections
  ([174cb4](https://github.com/angular/angular.js/commit/174cb4a8c81e25581da5b452c2bb43b0fa377a9b),
  [#14631](https://github.com/angular/angular.js/issues/14631))
- **$$cookieReader:** correctly handle forbidden access to `document.cookie`
  ([33f769](https://github.com/angular/angular.js/commit/33f769b0a1214055c16fb59adad4897bf53d62bf),
  [#15523](https://github.com/angular/angular.js/issues/15523))
- **ngOptions:** do not unset the `selected` property unless necessary
  ([bc4844](https://github.com/angular/angular.js/commit/bc4844d3b297d80aecef89aa1b32615024decedc),
  [#15477](https://github.com/angular/angular.js/issues/15477))
- **ngModelOptions:** work correctly when on the template of `replace` directives
  ([5f8ed6](https://github.com/angular/angular.js/commit/5f8ed63f2ab02ffb9c21bf9c29d27c851d162e26),
  [#15492](https://github.com/angular/angular.js/issues/15492))
- **ngClassOdd/Even:** add/remove the correct classes when expression/`$index` change simultaneously
  ([d52864](https://github.com/angular/angular.js/commit/d528644fe3e9ffd43999e7fc67806059f9e1083e))
- **jqLite:** silently ignore `after()` if element has no parent
  ([3d68b9](https://github.com/angular/angular.js/commit/3d68b9502848ff6714ef89bfb95b8e70ae34eff6),
  [#15331](https://github.com/angular/angular.js/issues/15331),
  [#15475](https://github.com/angular/angular.js/issues/15475))
- **$rootScope:** when adding/removing watchers during $digest
  ([163aca](https://github.com/angular/angular.js/commit/163aca336d7586a45255787af41b14b2a12361dd),
  [#15422](https://github.com/angular/angular.js/issues/15422))


## Performance Improvements
- **ngClass:** avoid unnecessary `.data()` accesses, deep-watching and copies
  ([1d3b65](https://github.com/angular/angular.js/commit/1d3b65adc2c22ff662159ef910089cf10d1edb7b),
  [#14404](https://github.com/angular/angular.js/issues/14404))



<a name="1.5.10"></a>
# 1.5.10 asynchronous-synchronization (2016-12-15)


## Bug Fixes
- **$compile:**
  - don't throw tplrt error when there is whitespace around a top-level comment
    ([12752f](https://github.com/angular/angular.js/commit/12752f66ac425ab38a5ee574a4bfbf3516adc42c),
    [#15108](https://github.com/angular/angular.js/issues/15108))
  - clean up `@`-binding observers when re-assigning bindings
    ([f3cb6e](https://github.com/angular/angular.js/commit/f3cb6e309aa1f676e5951ac745fa886d3581c2f4),
    [#15268](https://github.com/angular/angular.js/issues/15268))
  - set attribute value even if `ngAttr*` contains no interpolation
    ([229799](https://github.com/angular/angular.js/commit/22979904fb754c59e9f6ee5d8763e3b8de0e18c2),
    [#15133](https://github.com/angular/angular.js/issues/15133))
  - `bindToController` should work without `controllerAs`
    ([944989](https://github.com/angular/angular.js/commit/9449893763a4fd95ee8ff78b53c6966a874ec9ae),
    [#15088](https://github.com/angular/angular.js/issues/15088))
  - do not overwrite values set in `$onInit()` for `<`-bound literals
    ([07e1ba](https://github.com/angular/angular.js/commit/07e1ba365fb5e8a049be732bd7b62f71e0aa1672),
    [#15118](https://github.com/angular/angular.js/issues/15118))
  - avoid calling `$onChanges()` twice for `NaN` initial values
    ([0cf5be](https://github.com/angular/angular.js/commit/0cf5be52642f7e9d81a708b3005042eac6492572))
- **$location:** prevent infinite digest with IDN urls in Edge
  ([4bf892](https://github.com/angular/angular.js/commit/4bf89218130d434771089fdfe643490b8d2ee259),
  [#15217](https://github.com/angular/angular.js/issues/15217))
- **$rootScope:** correctly handle adding/removing watchers during `$digest`
  ([a9708d](https://github.com/angular/angular.js/commit/a9708de84b50f06eacda33834d5bbdfc97c97f37),
  [#15422](https://github.com/angular/angular.js/issues/15422))
- **$sce:** fix `adjustMatcher` to replace multiple `*` and `**`
  ([78eecb](https://github.com/angular/angular.js/commit/78eecb43dbb0500358d333aea8955bd0646a7790))
- **jqLite:** silently ignore `after()` if element has no parent
  ([77ed85](https://github.com/angular/angular.js/commit/77ed85bcd3be057a5a79231565ac7accc6d644c6),
  [#15331](https://github.com/angular/angular.js/issues/15331))
- **input[radio]:** use non-strict comparison for checkedness
  ([593a50](https://github.com/angular/angular.js/commit/593a5034841b3b7661d3bcbdd06b7a9d0876fd34))
- **select, ngOptions:**
  - let `ngValue` take precedence over option text with multiple interpolations
    ([5b7ec8](https://github.com/angular/angular.js/commit/5b7ec8c84e88ee08aacaf9404853eda0016093f5),
    [#15413](https://github.com/angular/angular.js/issues/15413))
  - don't add comment nodes as empty options
    ([1d29c9](https://github.com/angular/angular.js/commit/1d29c91c3429de96e4103533752700d1266741be),
    [#15454](https://github.com/angular/angular.js/issues/15454))
- **ngClassOdd/Even:** add/remove the correct classes when expression/`$index` change simultaneously
  ([e3d020](https://github.com/angular/angular.js/commit/e3d02070ab8a02c818dcc5114db6fba9d3f385d6))
- **$sanitize:** reduce stack height in IE <= 11
  ([862dc2](https://github.com/angular/angular.js/commit/862dc2532f8126a4a71fd3d957884ba6f11f591c),
  [#14928](https://github.com/angular/angular.js/issues/14928))
- **ngMock/$controller:** respect `$compileProvider.preAssignBindingsEnabled()`
  ([75c83f](https://github.com/angular/angular.js/commit/75c83ff3195931859a099f7a95bf81d32abf2eb3))


## New Features
- **bootstrap:** do not bootstrap from unknown schemes with a different origin
  ([bdeb33](https://github.com/angular/angular.js/commit/bdeb3392a8719131ab2b993f2a881c43a2860f92),
  [#15428](https://github.com/angular/angular.js/issues/15428))
- **$anchorScroll:** convert numeric hash targets to string
  ([a52640](https://github.com/angular/angular.js/commit/a5264090b66ad0cf9a93de84bb7b307868c0edef),
  [#14680](https://github.com/angular/angular.js/issues/14680))
- **$compile:**
  - add `preAssignBindingsEnabled` option
    ([f86576](https://github.com/angular/angular.js/commit/f86576def44005f180a66e3aa12d6cc73c1ac72c))
  - throw error when directive name or factory function is invalid
    ([5c9399](https://github.com/angular/angular.js/commit/5c9399d18ae5cd79e6cf6fc4377d66df00f6fcc7),
    [#15056](https://github.com/angular/angular.js/issues/15056))
- **$controller:** throw when requested controller is not registered
  ([9ae793](https://github.com/angular/angular.js/commit/9ae793d8a69afe84370b601e07fc375fc18a576a),
  [#14980](https://github.com/angular/angular.js/issues/14980))
- **$location:** add support for selectively rewriting links based on attribute
  ([a4a222](https://github.com/angular/angular.js/commit/a4a22266f127d3b9a6818e6f4754f048e253f693))
- **$resource:** pass `status`/`statusText` to success callbacks
  ([a8da25](https://github.com/angular/angular.js/commit/a8da25c74d2c1f6265f0fafd95bf72c981d9d678),
  [#8341](https://github.com/angular/angular.js/issues/8841),
  [#8841](https://github.com/angular/angular.js/issues/8841))
- **ngSwitch:** allow multiple case matches via optional attribute `ngSwitchWhenSeparator`
  ([0e1651](https://github.com/angular/angular.js/commit/0e1651bfd28ba73ebd0e4943d85af48c4506e02c),
  [#3410](https://github.com/angular/angular.js/issues/3410),
  [#3516](https://github.com/angular/angular.js/issues/3516))


## Performance Improvements
- **all:** don't trigger digests after enter/leave of structural directives
  ([c57779](https://github.com/angular/angular.js/commit/c57779d8725493c5853dceda0105dafd5c0e3a7c),
  [#15322](https://github.com/angular/angular.js/issues/15322))
- **$compile:** validate `directive.restrict` property on directive init
  ([31d464](https://github.com/angular/angular.js/commit/31d464feef38b1cc950da6c8dccd0f194ebfc68b))
- **ngOptions:** avoid calls to `element.value`
  ([e269ad](https://github.com/angular/angular.js/commit/e269ad1244bc50fee9218f7c18fab3e9ab063aab))
- **jqLite:** move bind/unbind definitions out of the loop
  ([7717b9](https://github.com/angular/angular.js/commit/7717b96e950a5916a5f12fd611c73d3b06a8d717))


<a name="1.6.0"></a>
# 1.6.0 rainbow-tsunami (2016-12-08)

**Here are the full changes for the release of 1.6.0 that are not already released in the 1.5.x branch,
consolidating all the changes shown in the previous 1.6.0 release candidates.**

## New Features
- **ngModelOptions:** allow options to be inherited from ancestor `ngModelOptions`
  ([296cfc](https://github.com/angular/angular.js/commit/296cfce40c25e9438bfa46a0eb27240707a10ffa),
  [#10922](https://github.com/angular/angular.js/issues/10922))
- **$compile:**
  - add `preAssignBindingsEnabled` option
    ([dfb8cf](https://github.com/angular/angular.js/commit/dfb8cf6402678206132e5bc603764d21e0f986ef))
  - set `preAssignBindingsEnabled` to false by default
    ([bcd0d4](https://github.com/angular/angular.js/commit/bcd0d4d896d0dfdd988ff4f849c1d40366125858),
    [#15352](https://github.com/angular/angular.js/issues/15352))
  - throw error when directive name or factory function is invalid
    ([53a3bf](https://github.com/angular/angular.js/commit/53a3bf6634600c3aeff092eacc35edf399b27aec)
    [#15056](https://github.com/angular/angular.js/issues/15056))
- **jqLite:**
  - implement `jqLite(f)` as an alias to `jqLite(document).ready(f)`
    ([369fb7](https://github.com/angular/angular.js/commit/369fb7f4f73664bcdab0350701552d8bef6f605e))
  - don't throw for elements with missing `getAttribute`
    ([4e6c14](https://github.com/angular/angular.js/commit/4e6c14dcae4a9a30b3610a288ef8d20db47c4417))
  - don't get/set properties when getting/setting boolean attributes
    ([7ceb5f](https://github.com/angular/angular.js/commit/7ceb5f6fcc43d35d1b66c3151ce6a71c60309304),
    [#14126](https://github.com/angular/angular.js/issues/14126))
  - don't remove a boolean attribute for `.attr(attrName, '')`
    ([3faf45](https://github.com/angular/angular.js/commit/3faf4505732758165083c9d21de71fa9b6983f4a))
  - remove the attribute for `.attr(attribute, null)`
    ([4e3624](https://github.com/angular/angular.js/commit/4e3624552284d0e725bf6262b2e468cd2c7682fa))
  - return `[]` for `.val()` on `<select multiple>` with no selection
    ([d882fd](https://github.com/angular/angular.js/commit/d882fde2e532216e7cf424495db1ccb5be1789f8))
  - camelCase keys in `jqLite#data`
    ([fc0c11](https://github.com/angular/angular.js/commit/fc0c11db845d53061430b7f05e773dcb3fb5b860),
    [#15126](https://github.com/angular/angular.js/issues/15126))
  - align jqLite camelCasing logic with JQuery
    ([73050c](https://github.com/angular/angular.js/commit/73050cdda04675bfa6705dc841ddbbb6919eb048),
    [#7744](https://github.com/angular/angular.js/issues/7744))
- **$http:**
  - remove deprecated callback methods: `success()/error()`
    ([b54a39](https://github.com/angular/angular.js/commit/b54a39e2029005e0572fbd2ac0e8f6a4e5d69014))
  - JSONP callback must be specified by `jsonpCallbackParam` config
    ([fb6634](https://github.com/angular/angular.js/commit/fb663418710736161a6b5da49c345e92edf58dcb),
    [#15161](https://github.com/angular/angular.js/issues/15161),
    [#11352](https://github.com/angular/angular.js/issues/11352))
  - JSONP requests now require a trusted resource URL
    ([6476af](https://github.com/angular/angular.js/commit/6476af83cd0418c84e034a955b12a842794385c4),
    [#11352](https://github.com/angular/angular.js/issues/11352))
- **$anchorScroll:** convert numeric hash targets to string
  ([9062ba](https://github.com/angular/angular.js/commit/9062bae05c002934fe7bfd76043dcc3de9acfde6)
  [#14680](https://github.com/angular/angular.js/issues/14680))
- **select:** support values of any type added with `ngValue`
  ([f02b70](https://github.com/angular/angular.js/commit/f02b707b5e4a5ffd1e1a20d910754cfabfc19622),
    [#9842](https://github.com/angular/angular.js/issues/9842))
- **input:**
  - add support for binding to `input[type=range]`
    ([913016](https://github.com/angular/angular.js/commit/9130166767c4792c5d32d08a918fc7becf32c9a6),
    [#5892](https://github.com/angular/angular.js/issues/5892),
    [#14870](https://github.com/angular/angular.js/issues/14870))
  - add support for `step` to `input[type=number]`
    ([e1da4be](https://github.com/angular/angular.js/commit/e1da4bed8e291003d485a8ad346ab80bed8ae2e3),
    [#10597](https://github.com/angular/angular.js/issues/10597))
  - allow `ngTrim` to work for `input[type=radio]`
    ([47724b](https://github.com/angular/angular.js/commit/47724baffe050269385b3481e9a9cf4ab3944b4b))
- **ngSwitch:** allow multiple case matches via optional attribute `ngSwitchWhenSeparator`
  ([0b221](https://github.com/angular/angular.js/commit/0b22173000596bf4b78f6a90083b994d46164d79)
  [#3410](https://github.com/angular/angular.js/issues/3410)
  [#3516](https://github.com/angular/angular.js/issues/3516))
- **$interpolate:** use custom `toString()` function if present
  ([a5fd2e](https://github.com/angular/angular.js/commit/a5fd2e4c0376676fa317e09a8d8be4966b82cbfe),
  [#7317](https://github.com/angular/angular.js/issues/7317),
  [#11406](https://github.com/angular/angular.js/issues/11406))
- **ngRoute:**
  - allow `ngView` to be included in an asynchronously loaded template
    ([c13c66](https://github.com/angular/angular.js/commit/c13c666728c1a1485ef18e92d7cb35118ce39609),
    [#1213](https://github.com/angular/angular.js/issues/1213))
  - implement `resolveRedirectTo`
    ([e98656](https://github.com/angular/angular.js/commit/e9865654b39c71be71034c38581a8c7bd16bc716),
    [#5150](https://github.com/angular/angular.js/issues/5150))
- **$q:** report promises with non rejection callback
  ([c9dffd](https://github.com/angular/angular.js/commit/c9dffde1cb167660120753181cb6d01dc1d1b3d0),
  [#13653](https://github.com/angular/angular.js/issues/13653),
  [#7992](https://github.com/angular/angular.js/issues/7992))
- **$resource:** pass `status`/`statusText` to success callbacks
  ([e3a378](https://github.com/angular/angular.js/commit/e3a378e7a329f60f6b48517f83a4f4c9efecb056)
  [#8341](https://github.com/angular/angular.js/issues/8841)
  [#8841](https://github.com/angular/angular.js/issues/8841))
- **$location:**
  - default hashPrefix to `'!'`
    ([aa077e](https://github.com/angular/angular.js/commit/aa077e81129c740041438688dff2e8d20c3d7b52)
    [#13812](https://github.com/angular/angular.js/issues/13812))
  - add support for selectively rewriting links based on attribute
    ([3d686a](https://github.com/angular/angular.js/commit/3d686a988dc4373da094cff6905e5b0d8da6afa4))
- **$controller:** throw when requested controller is not registered
  ([eacfe4](https://github.com/angular/angular.js/commit/eacfe4148eb97e550117ed7fd3c37b58537a9f64)
  [#14980](https://github.com/angular/angular.js/issues/14980))



## Security Related
- Please read the [Sandbox Removal Blog Post](http://angularjs.blogspot.com/2016/09/angular-16-expression-sandbox-removal.html).
- **bootstrap:**
  - explicitly whitelist URL schemes for bootstrap.
    ([7f1b8b](https://github.com/angular/angular.js/commit/7f1b8bdfe1043871c5ead2ec602efc41e0de5e53))
  - do not bootstrap from unknown schemes with a different origin
    ([465d17](https://github.com/angular/angular.js/commit/465d1734559ca4a7f4aa24387060f88fcc53ecb1)
    [#15428](https://github.com/angular/angular.js/issues/15428))
- **$compile:**
  - secure `link[href]` as a `RESOURCE_URL`s in `$sce`
    ([04cad4](https://github.com/angular/angular.js/commit/04cad41d26ebaf44b5ee0c29a152d61f235f3efa),
    [#14687](https://github.com/angular/angular.js/issues/14687))
  - lower the $sce context for src on video, audio, and track.
    ([ad9a99](https://github.com/angular/angular.js/commit/ad9a99d6895e1c07c950f7141bb0edfc1d4aaf61))


## Bug Fixes
- **$sce:** fix `adjustMatcher` to replace multiple `*` and `**`
  ([991a2b](https://github.com/angular/angular.js/commit/991a2b30e00aed1d312e29555e356a795f9e3d62))
- **ngModelOptions:** handle debounce of `updateOn` triggers that are not in debounce list
  ([789790](https://github.com/angular/angular.js/commit/789790feee4d6c5b1f5d5b18ecb0ccf6edd36fb3))
- **ngMock/$controller:** respect `$compileProvider.preAssignBindingsEnabled()`
  ([7d9a79](https://github.com/angular/angular.js/commit/7d9a791c6a8c80d29d6c84afa287c81f2a307439))
- **$location:**
  - prevent infinite digest with IDN URLs in Edge
    ([705afc](https://github.com/angular/angular.js/commit/705afcd160c8428133b36f2cd63db305dc52f2d7)
    [#15217](https://github.com/angular/angular.js/issues/15217))
  - throw if the path starts with double (back)slashes
    ([4aa953](https://github.com/angular/angular.js/commit/4aa9534b0fea732d6492a2863c3ee7e077c8d004))
- **core:** do not auto-bootstrap when loaded from an extension.
  ([0ff10e](https://github.com/angular/angular.js/commit/0ff10e1b56c6b7c4ac465e35c96a5886e294bac5))
- **input[radio]:** use strict comparison when evaluating checked-ness
  ([5ac7da](https://github.com/angular/angular.js/commit/5ac7daea72ec31cf337d1d21b13f0d17ff33994f),
  [#15288](https://github.com/angular/angular.js/issues/15288))
- **input:** fix `step` validation for `input[type=number]`/`input[type=range]`
  ([081d06](https://github.com/angular/angular.js/commit/081d06ffd15c2c6c539ce97b5eb63fa8e2403818),
  [#15257](https://github.com/angular/angular.js/issues/15257))
- **$parse:**
  - treat falsy values as defined in assignment expressions
    ([4f44e0](https://github.com/angular/angular.js/commit/4f44e018948c45bfb07f0170de4f703d22778d71))
  - call once stable bind-once expressions with filter
    ([3b5751](https://github.com/angular/angular.js/commit/3b5751dce8d6c699dc76e47cfa544c30b38b9771))
  - Handle sign of `-undefined` consistently
    ([c1eaf3](https://github.com/angular/angular.js/commit/c1eaf3480b9a88e5309ff4931a720f3f62bd7606))
- **ngModel:** treat synchronous validators as boolean always
  ([7bc71a](https://github.com/angular/angular.js/commit/7bc71adc63bb6bb609b44dd2d3ea8fb0cd3f300b),
  [#14734](https://github.com/angular/angular.js/issues/14734))
- **$q:** treat thrown errors as regular rejections
  ([e13eea](https://github.com/angular/angular.js/commit/e13eeabd7e34a78becec06cfbe72c23f2dcb85f9),
  [#3174](https://github.com/angular/angular.js/issues/3174),
  [#15213](https://github.com/angular/angular.js/issues/15213))
- **ngTransclude:** use fallback content if only whitespace is provided
  ([32aa7e](https://github.com/angular/angular.js/commit/32aa7e7395527624119e3917c54ee43b4d219301),
  [#15077](https://github.com/angular/angular.js/issues/15077))
- **$compile:**
  - don't throw tplrt error when there is a whitespace around a top-level comment
    ([76d3da](https://github.com/angular/angular.js/commit/76d3dafdeaf2f343d094b5a34ffb74adf64bb284),
    [#15108](https://github.com/angular/angular.js/issues/15108))
  - clean up `@`-binding observers when re-assigning bindings
    ([586e2a](https://github.com/angular/angular.js/commit/586e2acb269016a0fee66ac33f4a385f631afad0)
    [#15268](https://github.com/angular/angular.js/issues/15268))
  - set attribute value even if `ngAttr*` contains no interpolation
    ([3fe3da](https://github.com/angular/angular.js/commit/3fe3da8794571a1479d884be26a621f06cdb7842)
    [#15133](https://github.com/angular/angular.js/issues/15133))
  - `bindToController` should work without `controllerAs`
    ([16dcce](https://github.com/angular/angular.js/commit/16dccea8873b06285d4ec6eb3bb8e96ccbd3b64e)
    [#15088](https://github.com/angular/angular.js/issues/15088))
  - do not overwrite values set in `$onInit()` for `<`-bound literals
    ([a1bdff](https://github.com/angular/angular.js/commit/a1bdffa12f82e838dee5492956b380df7e54cdf9)
    [#15118](https://github.com/angular/angular.js/issues/15118))
  - avoid calling `$onChanges()` twice for `NaN` initial values
    ([7d7efb](https://github.com/angular/angular.js/commit/7d7efbf545c8c07713eb45301660dcfca4121445))
  - disallow linking the same element more than once
    ([1e1fbc](https://github.com/angular/angular.js/commit/1e1fbc75f5e20e8541f517a5cf6f30f8f2eed53f))
  - correctly merge consecutive text nodes on IE11
    ([13c252](https://github.com/angular/angular.js/commit/13c2522baf7c8f616b2efcaab4bffd54c8736591),
    [#14924](https://github.com/angular/angular.js/issues/14924))
  - don't add leading white-space in attributes for a specific merge case
    ([305ba1](https://github.com/angular/angular.js/commit/305ba1a3fb3529cb3fdf04c12ac03fbb4f634456))
  - don't trim white-space in attributes
    ([97bbf8](https://github.com/angular/angular.js/commit/97bbf86a1979d099802f0d631c17c54b87563b40),
    [#5513](https://github.com/angular/angular.js/issues/5513),
    [#5597](https://github.com/angular/angular.js/issues/5597))
  - move check for interpolation of on-event attributes to compile time
    ([b89c21](https://github.com/angular/angular.js/commit/b89c2181a9a165e06c027390164e08635ec449f4),
    [#13267](https://github.com/angular/angular.js/issues/13267))
- **select, ngOptions, ngValue:**
  - don't add comment nodes as empty options
    ([245b27](https://github.com/angular/angular.js/commit/245b27101aad129061585252b73652054319ca82),
    [#15454](https://github.com/angular/angular.js/issues/15454))
  - do not throw when removing the element (e.g. via `ngIf`)
    ([7a667c](https://github.com/angular/angular.js/commit/7a667c77e36f2b1738425a9cfb52d48bb9d8220f))
  - add/remove selected attribute for selected/unselected options
    ([c75698](https://github.com/angular/angular.js/commit/c75698df55f5a026bcd7fcecbb9d4ff0bc3ebc3e))
  - don't register options when select has no ngModel
    ([e8c2e1](https://github.com/angular/angular.js/commit/e8c2e119758e58e18fe43932d09a8ff9f506aa9d))
  - handle model updates when options are manipulated
    ([47c15f](https://github.com/angular/angular.js/commit/47c15fbcc10f118170813021e8e605ffd263ad84))
  - remove workaround for a Chrome bug
    ([87eff2](https://github.com/angular/angular.js/commit/87eff27e971414fb163e2b5a7cfe78cb097a1951))
  - make the handling of unknown / empty options consistent
    ([2785ad](https://github.com/angular/angular.js/commit/2785ad72599ca5f9558a116baecd83a5bebe3292))
  - set the element's value property in addition to the value attribute
    ([e6afca](https://github.com/angular/angular.js/commit/e6afca00c9061a3e13b570796ca3ab428c1723a1),
    [#14031](https://github.com/angular/angular.js/issues/14031))
- **$resource:**
  - allow params in `hostname` (except for IPv6 addresses)
    ([752b1e](https://github.com/angular/angular.js/commit/752b1e69b7a8e9c0b908f1980e9c738888f3647c),
    [#14542](https://github.com/angular/angular.js/issues/14542))
  - fulfill promise with the correct value on error
    ([5f6949](https://github.com/angular/angular.js/commit/5f6949fdae57b15340c1213cce379c6e6f8aff62),
    [#14837](https://github.com/angular/angular.js/issues/14837))
  - pass all extra, owned properties as params
    ([acb545](https://github.com/angular/angular.js/commit/acb545ec3ebf099db68561033645941c900973b5),
    [#14866](https://github.com/angular/angular.js/issues/14866))
  - add semicolon to whitelist of delimiters to unencode in URL params
    ([2456ab](https://github.com/angular/angular.js/commit/2456ab63a613902d21c151445f9c697a76ab43b3))
- **$http:**
  - avoid `Possibly Unhandled Rejection` error when the request fails
    ([47583d](https://github.com/angular/angular.js/commit/47583d98005f6a498d397dbe2cedaadac69f0b47),
    [#13869](https://github.com/angular/angular.js/issues/13869))
  - properly increment/decrement `$browser.outstandingRequestCount`
    ([4f6f2b](https://github.com/angular/angular.js/commit/4f6f2bce4ac93b85320e42e5023c09d099779b7d),
    [#13782](https://github.com/angular/angular.js/issues/13782),
    [#14921](https://github.com/angular/angular.js/issues/14921))
- **ngMock:** trigger digest in `$httpBackend.verifyNoOutstandingRequest()`
  ([267ee9](https://github.com/angular/angular.js/commit/267ee9c892b0eb40908700ee2435793f8c6c1c84),
  [#13506](https://github.com/angular/angular.js/issues/13506))
- **ngAria:**
  - bind to `keydown` instead of `keypress` in `ngClick`
    ([ad41ba](https://github.com/angular/angular.js/commit/ad41baa1fdc057db3fe529ff87735b173b164b4c),
    [#14063](https://github.com/angular/angular.js/issues/14063))
  - don't add roles to native control elements
    ([9978de](https://github.com/angular/angular.js/commit/9978de11b7295fec1a2f4cb8fbeb9b62b54cb711),
    [#14076](https://github.com/angular/angular.js/issues/14076))
  - do not overwrite the default `$isEmpty()` method for checkboxes
    ([975a61](https://github.com/angular/angular.js/commit/975a6170efceb2a5e6377c57329731c0636eb8c8),
    [#14621](https://github.com/angular/angular.js/issues/14621))
- **ngBind:** use same string representation as `$interpolate`
  ([fa80a6](https://github.com/angular/angular.js/commit/fa80a61a05a3b49a2c770d5544cb8480907a18d3))
- **ngMock/$httpBackend:** fail if a url is provided but is `undefined`
  ([7551b8](https://github.com/angular/angular.js/commit/7551b8975a91ee286cc2cf4af5e78f924533575e),
  [#8442](https://github.com/angular/angular.js/issues/8442),
  [#10934](https://github.com/angular/angular.js/issues/10934))
- **$route:** don't process route change controllers and templates for `redirectTo` routes
  ([7f4b35](https://github.com/angular/angular.js/commit/7f4b356c2bebb87f0c26b57a20415b004b20bcd1),
  [#3332](https://github.com/angular/angular.js/issues/3332))
- **loader:** `module.decorator` order of operations is now irrelevant
  ([6a2ebd](https://github.com/angular/angular.js/commit/6a2ebdba5df27e789e3cb10f11eedf90f7b9b97e),
  [#12382](https://github.com/angular/angular.js/issues/12382))
- **$sanitize:** reduce stack height in IE <= 11
  ([45129c](https://github.com/angular/angular.js/commit/45129cfd06104bd89f469dded9ccbaf20894bd76)
  [#14928](https://github.com/angular/angular.js/issues/14928))
- **ngAnimate:** make svg elements work with `classNameFilter`
  ([81bf7e](https://github.com/angular/angular.js/commit/81bf7ed73ee67f9eb997da869c52839449ca02b3))



## Performance Improvements
- **all:** don't trigger digests after enter/leave of structural directives
  ([f4fb6e](https://github.com/angular/angular.js/commit/f4fb6e0983a6a700dc4a246a913504550b55f1e9),
  [#15322](https://github.com/angular/angular.js/issues/15322))
- **form, ngModel:** change controllers to use prototype methods
  ([9e24e7](https://github.com/angular/angular.js/commit/9e24e774a558143b3478536911a3a4c1714564ba))
- **select:** don't prepend unknown option if already prepended
  ([ba36bd](https://github.com/angular/angular.js/commit/ba36bde6736f0810ca670e10952a8e1c021de531))
- **ngOptions:** avoid calls to `element.value`
  ([3b7f29](https://github.com/angular/angular.js/commit/3b7f29ff63e8bf02327a1430dcc2a4c83915a206))
- **$animate:** listen for document visibility changes
  ([d71dc2](https://github.com/angular/angular.js/commit/d71dc2f5afec230711351e9f160873a41eb60597))
- **injector:** cache the results of the native class detection check
  ([5ceb5d](https://github.com/angular/angular.js/commit/5ceb5dbfa6d9b6d15232a1f5c767b2f431325948))
- **$compile:**
  - use strict comparison for `controller === '@'`
    ([bbd3db](https://github.com/angular/angular.js/commit/bbd3db14f857aab996ad129f2f15ca6348e9fd9f))
  - validate `directive.restrict` property on directive init
    ([11f273](https://github.com/angular/angular.js/commit/11f2731f72e932615e8ce15e6a73f4ac808cc7e7))
- **$parse:**
  - Inline constants
    ([bd7d5f](https://github.com/angular/angular.js/commit/bd7d5f6345439aa2d1da708ffee20b4c565131d4))
  - remove Angular expression sandbox
    ([1547c7](https://github.com/angular/angular.js/commit/1547c751aa48efe7dbefef701c3df5983b04aa2e),
    [#15094](https://github.com/angular/angular.js/issues/15094))


## Breaking Changes

- **feat($compile): set preAssignBindingsEnabled to false by default
  ([bcd0d4](https://github.com/angular/angular.js/commit/bcd0d4d896d0dfdd988ff4f849c1d40366125858))**:

Previously, `$compileProvider.preAssignBindingsEnabled` was set to true by default. This means
bindings were pre-assigned on component/directive controller instances (which made them available
inside the constructors). In AngularJS 1.5+ the place to put the initialization logic relying on
bindings being present is the controller's `$onInit` method.

To migrate follow the example below:

Before:

```js
angular.module('myApp', [])
  .component('myComponent', {
    bindings: {value: '<'},
    controller: function() {
      this.doubleValue = this.value * 2;
    }
  });
```

After:

```js
angular.module('myApp', [])
  .component('myComponent', {
    bindings: {value: '<'},
    controller: function() {
      this.$onInit = function() {
        this.doubleValue = this.value * 2;
      };
    }
  });
```

If you don't have time to migrate the code at the moment, you can flip the
setting back to true:

```js
angular.module('myApp', [])
  .config(function($compileProvider) {
    $compileProvider.preAssignBindingsEnabled(true);
  })
  .component('myComponent', {
    bindings: {value: '<'},
    controller: function() {
      this.doubleValue = this.value * 2;
    }
  });
```

Don't do this if you're writing a library, though, as you shouldn't change
global configuration then.


- **fix(input[radio]): use strict comparison when evaluating checked-ness
  ([5ac7da](https://github.com/angular/angular.js/commit/5ac7daea72ec31cf337d1d21b13f0d17ff33994f))**:

When using input[radio], the checked status is now determined by doing
a strict comparison between the value of the input and the ngModel.$viewValue.
Previously, this was a non-strict comparison (==).

This means in the following examples the radio is no longer checked:

```
  <!-- this.selected = 0 -->
  <input type="radio" ng-model="$ctrl.selected" value="0" >

  <!-- this.selected = 0; this.value = false; -->
  <input type="radio" ng-model="$ctrl.selected" ng-value="$ctrl.value" >
```

The migration strategy is to convert values that matched with non-strict
conversion so that they will match with strict conversion.


- **feat(ngModelOptions): allow options to be inherited from ancestor `ngModelOptions`
  ([296cfc](https://github.com/angular/angular.js/commit/296cfce40c25e9438bfa46a0eb27240707a10ffa))**:

The programmatic API for `ngModelOptions` has changed. You must now read options
via the `ngModelController.$options.getOption(name)` method, rather than accessing the
option directly as a property of the `ngModelContoller.$options` object. This does not
affect the usage in templates and only affects custom directives that might have been
reading options for their own purposes.

One benefit of these changes, though, is that the `ngModelControler.$options` property
is now guaranteed to be defined so there is no need to check before accessing.

So, previously:

```
var myOption = ngModelController.$options && ngModelController.$options['my-option'];
```

and now:

```
var myOption = ngModelController.$options.getOption('my-option');
```

### **jqLite** due to:
- **[fc0c11](https://github.com/angular/angular.js/commit/fc0c11db845d53061430b7f05e773dcb3fb5b860)**:
  camelCase keys in `jqLite#data`

Previously, keys passed to the data method were left untouched.
Now they are internally camelCased similarly to how jQuery handles it, i.e.
only single (!) hyphens followed by a lowercase letter get converted to an
uppercase letter. This means keys `a-b` and `aB` represent the same data piece;
writing to one of them will also be reflected if you ask for the other one.

If you use Angular with jQuery, it already behaved in this way so no changes
are required on your part.

To migrate the code follow the examples below:

BEFORE:

```js
/* 1 */
elem.data('my-key', 2);
elem.data('myKey', 3);

/* 2 */
elem.data('foo-bar', 42);
elem.data()['foo-bar']; // 42
elem.data()['fooBar']; // undefined

/* 3 */
elem.data()['foo-bar'] = 1;
elem.data()['fooBar'] = 2;
elem.data('foo-bar'); // 1
```

AFTER:

```js
/* 1 */
// Rename one of the keys as they would now map to the same data slot.
elem.data('my-key', 2);
elem.data('my-key2', 3);

/* 2 */
elem.data('foo-bar', 42);
elem.data()['foo-bar']; // undefined
elem.data()['fooBar']; // 42

/* 3 */
elem.data()['foo-bar'] = 1;
elem.data()['fooBar'] = 2;
elem.data('foo-bar'); // 2
```

- **[73050c](https://github.com/angular/angular.js/commit/73050cdda04675bfa6705dc841ddbbb6919eb048)**:
  align jqLite camelCasing logic with JQuery

Before, when Angular was used without jQuery, the key passed
to the css method was more heavily camelCased; now only a single (!) hyphen
followed by a lowercase letter is getting transformed. This also affects APIs
that rely on the css method, like ngStyle.

If you use Angular with jQuery, it already behaved in this way so no changes
are needed on your part.

To migrate the code follow the example below:

Before:

HTML:

```html
// All five versions used to be equivalent.
<div ng-style={background_color: 'blue'}></div>
<div ng-style={'background:color': 'blue'}></div>
<div ng-style={'background-color': 'blue'}></div>
<div ng-style={'background--color': 'blue'}></div>
<div ng-style={backgroundColor: 'blue'}></div>
```

JS:

```js
// All five versions used to be equivalent.
elem.css('background_color', 'blue');
elem.css('background:color', 'blue');
elem.css('background-color', 'blue');
elem.css('background--color', 'blue');
elem.css('backgroundColor', 'blue');

// All five versions used to be equivalent.
var bgColor = elem.css('background_color');
var bgColor = elem.css('background:color');
var bgColor = elem.css('background-color');
var bgColor = elem.css('background--color');
var bgColor = elem.css('backgroundColor');
```

After:

HTML:

```html
// Previous five versions are no longer equivalent but these two still are.
<div ng-style={'background-color': 'blue'}></div>
<div ng-style={backgroundColor: 'blue'}></div>
```

JS:

```js
// Previous five versions are no longer equivalent but these two still are.
elem.css('background-color', 'blue');
elem.css('backgroundColor', 'blue');

// Previous five versions are no longer equivalent but these two still are.
var bgColor = elem.css('background-color');
var bgColor = elem.css('backgroundColor');
```

- **[7ceb5f](https://github.com/angular/angular.js/commit/7ceb5f6fcc43d35d1b66c3151ce6a71c60309304)**: don't get/set properties when getting/setting boolean attributes

Previously, all boolean attributes were reflected into the corresponding property when calling a
setter and from the corresponding property when calling a getter, even on elements that don't treat
those attributes in a special way. Now Angular doesn't do it by itself, but relies on browsers to
know when to reflect the property. Note that this browser-level conversion differs between browsers;
if you need to dynamically change the state of an element, you should modify the property, not the
attribute. See https://jquery.com/upgrade-guide/1.9/#attr-versus-prop- for a more detailed
description about a related change in jQuery 1.9.

This change aligns jqLite with jQuery 3. To migrate the code follow the example below:

Before:

CSS:

```css
input[checked="checked"] { ... }
```

JS:

```js
elem1.attr('checked', 'checked');
elem2.attr('checked', false);
```

After:

CSS:

```css
input:checked { ... }
```

JS:

```js
elem1.prop('checked', true);
elem2.prop('checked', false);
```

- **[3faf45](https://github.com/angular/angular.js/commit/3faf4505732758165083c9d21de71fa9b6983f4a)**:
  don't remove a boolean attribute for `.attr(attrName, '')`

Before, using the `attr` method with an empty string as a value
would remove the boolean attribute. Now it sets it to its lowercase name as
was happening for every non-empty string so far. The only two values that remove
the boolean attribute are now null &amp; false, just like in jQuery.

To migrate the code follow the example below:

Before:

```js
elem.attr(booleanAttrName, '');
```

After:

```js
elem.attr(booleanAttrName, false);
```

or:

```js
elem.attr(booleanAttrName, null);
```

- **[4e3624](https://github.com/angular/angular.js/commit/4e3624552284d0e725bf6262b2e468cd2c7682fa)**:
  remove the attribute for `.attr(attribute, null)`

Invoking `elem.attr(attributeName, null)` would set the
`
Download .txt
gitextract_frd3dhqe/

├── .circleci/
│   ├── config.yml
│   ├── env-helpers.inc.sh
│   └── env.sh
├── .editorconfig
├── .eslintignore
├── .eslintrc-base.json
├── .eslintrc-browser.json
├── .eslintrc-node.json
├── .eslintrc-todo.json
├── .eslintrc.json
├── .gitattributes
├── .github/
│   ├── ISSUE_TEMPLATE.md
│   └── PULL_REQUEST_TEMPLATE.md
├── .gitignore
├── .mailmap
├── .nvmrc
├── CHANGELOG.md
├── CODE_OF_CONDUCT.md
├── CONTRIBUTING.md
├── DEVELOPERS.md
├── Gruntfile.js
├── LICENSE
├── README.closure.md
├── README.md
├── RELEASE.md
├── SECURITY.md
├── TRIAGING.md
├── angularFiles.js
├── benchmarks/
│   ├── .eslintrc.json
│   ├── README.md
│   ├── animation-bp/
│   │   ├── app.js
│   │   ├── bp.conf.js
│   │   ├── jquery-noop.js
│   │   └── main.html
│   ├── bootstrap-compile-bp/
│   │   ├── app.js
│   │   ├── bootstrap-carousel.tpl.html
│   │   ├── bootstrap-theme.tpl.html
│   │   ├── bp.conf.js
│   │   └── main.html
│   ├── event-delegation-bp/
│   │   ├── app.js
│   │   ├── bp.conf.js
│   │   └── main.html
│   ├── largetable-bp/
│   │   ├── app.js
│   │   ├── bp.conf.js
│   │   ├── jquery-noop.js
│   │   └── main.html
│   ├── ng-class-bp/
│   │   ├── app.js
│   │   ├── bp.conf.js
│   │   └── main.html
│   ├── ng-options-bp/
│   │   ├── app.js
│   │   ├── bp.conf.js
│   │   └── main.html
│   ├── orderby-bp/
│   │   ├── app.js
│   │   ├── bp.conf.js
│   │   ├── jquery-noop.js
│   │   └── main.html
│   ├── parsed-expressions-bp/
│   │   ├── app.js
│   │   ├── bp.conf.js
│   │   └── main.html
│   ├── repeat-animate-bp/
│   │   ├── app-classfilter.js
│   │   ├── app-noanimate.js
│   │   ├── app.js
│   │   ├── bp.conf.js
│   │   ├── common.js
│   │   └── main.html
│   └── select-ng-value-bp/
│       ├── app.js
│       ├── bp.conf.js
│       └── main.html
├── css/
│   ├── angular-scenario.css
│   └── angular.css
├── docs/
│   ├── app/
│   │   ├── assets/
│   │   │   ├── Error404.html
│   │   │   ├── css/
│   │   │   │   ├── angular-topnav.css
│   │   │   │   ├── animations.css
│   │   │   │   ├── doc_widgets.css
│   │   │   │   ├── docs.css
│   │   │   │   ├── prettify-theme.css
│   │   │   │   └── prettify.css
│   │   │   ├── js/
│   │   │   │   ├── angular-bootstrap/
│   │   │   │   │   └── dropdown-toggle.js
│   │   │   │   └── search-worker.js
│   │   │   └── robots.txt
│   │   ├── e2e/
│   │   │   ├── .eslintrc.json
│   │   │   ├── api-docs/
│   │   │   │   ├── api-pages.scenario.js
│   │   │   │   ├── directive-pages.scenario.js
│   │   │   │   ├── provider-pages.scenario.js
│   │   │   │   └── service-pages.scenario.js
│   │   │   ├── app.scenario.js
│   │   │   └── table-of-contents.scenario.js
│   │   ├── src/
│   │   │   ├── .eslintrc.json
│   │   │   ├── app.js
│   │   │   ├── directives.js
│   │   │   ├── docs.js
│   │   │   ├── errors.js
│   │   │   ├── examples.js
│   │   │   ├── search.js
│   │   │   ├── tutorials.js
│   │   │   └── versions.js
│   │   └── test/
│   │       ├── .eslintrc.json
│   │       ├── directivesSpec.js
│   │       ├── docsSpec.js
│   │       └── errorsSpec.js
│   ├── config/
│   │   ├── ignore.words
│   │   ├── index.js
│   │   ├── inline-tag-defs/
│   │   │   └── type.js
│   │   ├── processors/
│   │   │   ├── error-docs.js
│   │   │   ├── index-page.js
│   │   │   ├── keywords.js
│   │   │   ├── pages-data.js
│   │   │   ├── sitemap.js
│   │   │   └── versions-data.js
│   │   ├── services/
│   │   │   ├── deployments/
│   │   │   │   ├── debug.js
│   │   │   │   ├── default.js
│   │   │   │   ├── jquery.js
│   │   │   │   ├── production.js
│   │   │   │   └── test.js
│   │   │   ├── errorNamespaceMap.js
│   │   │   ├── getMinerrInfo.js
│   │   │   └── getVersion.js
│   │   ├── tag-defs/
│   │   │   ├── deprecated.js
│   │   │   ├── deprecated.spec.js
│   │   │   ├── installation.js
│   │   │   ├── sortOrder.js
│   │   │   ├── this.js
│   │   │   └── tutorial-step.js
│   │   └── templates/
│   │       ├── app/
│   │       │   ├── angular-service.template.js
│   │       │   ├── error.template.html
│   │       │   ├── errorNamespace.template.html
│   │       │   ├── indexPage.template.html
│   │       │   ├── json-doc.template.json
│   │       │   ├── nav-data.template.js
│   │       │   ├── pages-data.template.js
│   │       │   ├── sitemap.template.xml
│   │       │   └── tutorial.template.html
│   │       ├── examples/
│   │       │   ├── index.template.html
│   │       │   ├── manifest.template.json
│   │       │   ├── protractorTests.template.js
│   │       │   ├── runnableExample.template.html
│   │       │   ├── template.css
│   │       │   ├── template.html
│   │       │   ├── template.js
│   │       │   ├── template.json
│   │       │   ├── template.protractor
│   │       │   ├── template.scenario
│   │       │   └── template.spec
│   │       └── ngdoc/
│   │           ├── api/
│   │           │   ├── api.template.html
│   │           │   ├── componentGroup.template.html
│   │           │   ├── directive.template.html
│   │           │   ├── filter.template.html
│   │           │   ├── function.template.html
│   │           │   ├── input.template.html
│   │           │   ├── module.template.html
│   │           │   ├── object.template.html
│   │           │   ├── provider.template.html
│   │           │   ├── service.template.html
│   │           │   └── type.template.html
│   │           ├── base.template.html
│   │           ├── lib/
│   │           │   ├── deprecated.html
│   │           │   ├── events.template.html
│   │           │   ├── macros.html
│   │           │   ├── methods.template.html
│   │           │   ├── params.template.html
│   │           │   ├── properties.template.html
│   │           │   ├── returns.template.html
│   │           │   └── this.template.html
│   │           └── overview.template.html
│   ├── content/
│   │   ├── api/
│   │   │   └── index.ngdoc
│   │   ├── error/
│   │   │   ├── $animate/
│   │   │   │   ├── nongcls.ngdoc
│   │   │   │   └── notcsel.ngdoc
│   │   │   ├── $cacheFactory/
│   │   │   │   └── iid.ngdoc
│   │   │   ├── $compile/
│   │   │   │   ├── baddir.ngdoc
│   │   │   │   ├── badrestrict.ngdoc
│   │   │   │   ├── ctreq.ngdoc
│   │   │   │   ├── ctxoverride.ngdoc
│   │   │   │   ├── infchng.ngdoc
│   │   │   │   ├── iscp.ngdoc
│   │   │   │   ├── missingattr.ngdoc
│   │   │   │   ├── multidir.ngdoc
│   │   │   │   ├── multilink.ngdoc
│   │   │   │   ├── noctrl.ngdoc
│   │   │   │   ├── nodomevents.ngdoc
│   │   │   │   ├── nonassign.ngdoc
│   │   │   │   ├── noslot.ngdoc
│   │   │   │   ├── reqslot.ngdoc
│   │   │   │   ├── selmulti.ngdoc
│   │   │   │   ├── srcset.ngdoc
│   │   │   │   ├── tplrt.ngdoc
│   │   │   │   └── uterdir.ngdoc
│   │   │   ├── $controller/
│   │   │   │   ├── ctrlfmt.ngdoc
│   │   │   │   ├── ctrlreg.ngdoc
│   │   │   │   └── noscp.ngdoc
│   │   │   ├── $http/
│   │   │   │   ├── baddata.ngdoc
│   │   │   │   ├── badjsonp.ngdoc
│   │   │   │   └── badreq.ngdoc
│   │   │   ├── $injector/
│   │   │   │   ├── cdep.ngdoc
│   │   │   │   ├── itkn.ngdoc
│   │   │   │   ├── modulerr.ngdoc
│   │   │   │   ├── nomod.ngdoc
│   │   │   │   ├── pget.ngdoc
│   │   │   │   ├── strictdi.ngdoc
│   │   │   │   ├── undef.ngdoc
│   │   │   │   └── unpr.ngdoc
│   │   │   ├── $interpolate/
│   │   │   │   ├── badexpr.ngdoc
│   │   │   │   ├── dupvalue.ngdoc
│   │   │   │   ├── interr.ngdoc
│   │   │   │   ├── logicbug.ngdoc
│   │   │   │   ├── nochgmustache.ngdoc
│   │   │   │   ├── noconcat.ngdoc
│   │   │   │   ├── reqarg.ngdoc
│   │   │   │   ├── reqcomma.ngdoc
│   │   │   │   ├── reqendbrace.ngdoc
│   │   │   │   ├── reqendinterp.ngdoc
│   │   │   │   ├── reqopenbrace.ngdoc
│   │   │   │   ├── reqother.ngdoc
│   │   │   │   ├── unknarg.ngdoc
│   │   │   │   ├── unsafe.ngdoc
│   │   │   │   ├── untermstr.ngdoc
│   │   │   │   └── wantstring.ngdoc
│   │   │   ├── $interval/
│   │   │   │   └── badprom.ngdoc
│   │   │   ├── $location/
│   │   │   │   ├── badpath.ngdoc
│   │   │   │   ├── ipthprfx.ngdoc
│   │   │   │   ├── isrcharg.ngdoc
│   │   │   │   ├── nobase.ngdoc
│   │   │   │   └── nostate.ngdoc
│   │   │   ├── $parse/
│   │   │   │   ├── esc.ngdoc
│   │   │   │   ├── lexerr.ngdoc
│   │   │   │   ├── lval.ngdoc
│   │   │   │   ├── syntax.ngdoc
│   │   │   │   └── ueoe.ngdoc
│   │   │   ├── $q/
│   │   │   │   ├── norslvr.ngdoc
│   │   │   │   └── qcycle.ngdoc
│   │   │   ├── $resource/
│   │   │   │   ├── badargs.ngdoc
│   │   │   │   ├── badcfg.ngdoc
│   │   │   │   ├── badmember.ngdoc
│   │   │   │   └── badname.ngdoc
│   │   │   ├── $rootScope/
│   │   │   │   ├── infdig.ngdoc
│   │   │   │   └── inprog.ngdoc
│   │   │   ├── $route/
│   │   │   │   └── norout.ngdoc
│   │   │   ├── $sanitize/
│   │   │   │   ├── elclob.ngdoc
│   │   │   │   ├── noinert.ngdoc
│   │   │   │   └── uinput.ngdoc
│   │   │   ├── $sce/
│   │   │   │   ├── icontext.ngdoc
│   │   │   │   ├── iequirks.ngdoc
│   │   │   │   ├── imatcher.ngdoc
│   │   │   │   ├── insecurl.ngdoc
│   │   │   │   ├── itype.ngdoc
│   │   │   │   ├── iwcard.ngdoc
│   │   │   │   └── unsafe.ngdoc
│   │   │   ├── $templateRequest/
│   │   │   │   └── tpload.ngdoc
│   │   │   ├── $timeout/
│   │   │   │   └── badprom.ngdoc
│   │   │   ├── filter/
│   │   │   │   └── notarray.ngdoc
│   │   │   ├── index.ngdoc
│   │   │   ├── jqLite/
│   │   │   │   ├── nosel.ngdoc
│   │   │   │   ├── offargs.ngdoc
│   │   │   │   └── onargs.ngdoc
│   │   │   ├── linky/
│   │   │   │   └── notstring.ngdoc
│   │   │   ├── ng/
│   │   │   │   ├── aobj.ngdoc
│   │   │   │   ├── areq.ngdoc
│   │   │   │   ├── badname.ngdoc
│   │   │   │   ├── btstrpd.ngdoc
│   │   │   │   ├── cpi.ngdoc
│   │   │   │   ├── cpta.ngdoc
│   │   │   │   ├── cpws.ngdoc
│   │   │   │   └── test.ngdoc
│   │   │   ├── ngModel/
│   │   │   │   ├── constexpr.ngdoc
│   │   │   │   ├── datefmt.ngdoc
│   │   │   │   ├── nonassign.ngdoc
│   │   │   │   ├── nopromise.ngdoc
│   │   │   │   └── numfmt.ngdoc
│   │   │   ├── ngOptions/
│   │   │   │   └── iexp.ngdoc
│   │   │   ├── ngPattern/
│   │   │   │   └── noregexp.ngdoc
│   │   │   ├── ngRef/
│   │   │   │   ├── noctrl.ngdoc
│   │   │   │   └── nonassign.ngdoc
│   │   │   ├── ngRepeat/
│   │   │   │   ├── badident.ngdoc
│   │   │   │   ├── dupes.ngdoc
│   │   │   │   ├── iexp.ngdoc
│   │   │   │   └── iidexp.ngdoc
│   │   │   ├── ngTransclude/
│   │   │   │   └── orphan.ngdoc
│   │   │   └── orderBy/
│   │   │       └── notarray.ngdoc
│   │   ├── guide/
│   │   │   ├── $location.ngdoc
│   │   │   ├── accessibility.ngdoc
│   │   │   ├── animations.ngdoc
│   │   │   ├── bootstrap.ngdoc
│   │   │   ├── compiler.ngdoc
│   │   │   ├── component-router.ngdoc
│   │   │   ├── component.ngdoc
│   │   │   ├── concepts.ngdoc
│   │   │   ├── controller.ngdoc
│   │   │   ├── css-styling.ngdoc
│   │   │   ├── databinding.ngdoc
│   │   │   ├── decorators.ngdoc
│   │   │   ├── di.ngdoc
│   │   │   ├── directive.ngdoc
│   │   │   ├── e2e-testing.ngdoc
│   │   │   ├── expression.ngdoc
│   │   │   ├── external-resources.ngdoc
│   │   │   ├── filter.ngdoc
│   │   │   ├── forms.ngdoc
│   │   │   ├── i18n.ngdoc
│   │   │   ├── ie.ngdoc
│   │   │   ├── index.ngdoc
│   │   │   ├── interpolation.ngdoc
│   │   │   ├── introduction.ngdoc
│   │   │   ├── migration.ngdoc
│   │   │   ├── module.ngdoc
│   │   │   ├── production.ngdoc
│   │   │   ├── providers.ngdoc
│   │   │   ├── scope.ngdoc
│   │   │   ├── security.ngdoc
│   │   │   ├── services.ngdoc
│   │   │   ├── templates.ngdoc
│   │   │   └── unit-testing.ngdoc
│   │   ├── misc/
│   │   │   ├── contribute.ngdoc
│   │   │   ├── downloading.ngdoc
│   │   │   ├── faq.ngdoc
│   │   │   ├── index.ngdoc
│   │   │   ├── started.ngdoc
│   │   │   └── version-support-status.ngdoc
│   │   ├── notes/
│   │   │   └── empty.tmp
│   │   └── tutorial/
│   │       ├── index.ngdoc
│   │       ├── step_00.ngdoc
│   │       ├── step_01.ngdoc
│   │       ├── step_02.ngdoc
│   │       ├── step_03.ngdoc
│   │       ├── step_04.ngdoc
│   │       ├── step_05.ngdoc
│   │       ├── step_06.ngdoc
│   │       ├── step_07.ngdoc
│   │       ├── step_08.ngdoc
│   │       ├── step_09.ngdoc
│   │       ├── step_10.ngdoc
│   │       ├── step_11.ngdoc
│   │       ├── step_12.ngdoc
│   │       ├── step_13.ngdoc
│   │       ├── step_14.ngdoc
│   │       └── the_end.ngdoc
│   ├── gulpfile.js
│   └── protractor-conf.js
├── i18n/
│   ├── README.md
│   ├── closure/
│   │   ├── currencySymbols.js
│   │   ├── datetimeSymbols.js
│   │   ├── datetimeSymbolsExt.js
│   │   ├── numberSymbols.js
│   │   ├── numberSymbolsExt.js
│   │   └── pluralRules.js
│   ├── e2e/
│   │   ├── .eslintrc.json
│   │   ├── i18n-e2e.js
│   │   ├── localeTest_cs.html
│   │   ├── localeTest_de.html
│   │   ├── localeTest_en.html
│   │   ├── localeTest_es.html
│   │   ├── localeTest_sk.html
│   │   ├── localeTest_zh.html
│   │   └── runner.html
│   ├── generate.sh
│   ├── spec/
│   │   ├── .eslintrc.json
│   │   ├── closureI18nExtractorSpec.js
│   │   ├── converterSpec.js
│   │   └── parserSpec.js
│   ├── src/
│   │   ├── .eslintrc.json
│   │   ├── closureI18nExtractor.js
│   │   ├── closureSlurper.js
│   │   ├── converter.js
│   │   └── parser.js
│   ├── ucd/
│   │   ├── .eslintrc.json
│   │   ├── spec/
│   │   │   ├── .eslintrc.json
│   │   │   ├── extactValuesSpec.js
│   │   │   └── generateCodeSpec.js
│   │   └── src/
│   │       ├── extract.js
│   │       ├── extractValues.js
│   │       └── generateCode.js
│   └── update-closure.sh
├── images/
│   ├── docs/
│   │   ├── Diagrams.graffle/
│   │   │   └── data.plist
│   │   ├── Diagrams.vdx
│   │   ├── guide/
│   │   │   ├── about_controller.graffle
│   │   │   ├── about_controller.vdx
│   │   │   ├── about_model.graffle
│   │   │   ├── about_model.vdx
│   │   │   ├── concepts.graffle/
│   │   │   │   └── data.plist
│   │   │   ├── concepts.vdx
│   │   │   ├── di_sequence.graffle
│   │   │   ├── di_sequence.vdx
│   │   │   ├── dom_scope.graffle
│   │   │   ├── dom_scope.vdx
│   │   │   ├── form_data_flow.graffle
│   │   │   ├── form_data_flow.vdx
│   │   │   ├── hashbang_vs_regular_url.graffle
│   │   │   ├── hashbang_vs_regular_url.vdx
│   │   │   ├── simple_scope.graffle/
│   │   │   │   ├── QuickLook/
│   │   │   │   │   └── Thumbnail.tiff
│   │   │   │   └── data.plist
│   │   │   └── simple_scope.vdx
│   │   └── tutorial/
│   │       ├── di_sequence.graffle
│   │       ├── di_sequence.vdx
│   │       ├── simple_scope.graffle/
│   │       │   ├── QuickLook/
│   │       │   │   └── Thumbnail.tiff
│   │       │   └── data.plist
│   │       ├── simple_scope.vdx
│   │       ├── tutorial_00.graffle
│   │       ├── tutorial_00.vdx
│   │       ├── tutorial_02.graffle/
│   │       │   ├── QuickLook/
│   │       │   │   └── Thumbnail.tiff
│   │       │   └── data.plist
│   │       ├── tutorial_02.vdx
│   │       ├── tutorial_03.vdx
│   │       ├── tutorial_04.vdx
│   │       ├── tutorial_05.graffle/
│   │       │   ├── QuickLook/
│   │       │   │   └── Thumbnail.tiff
│   │       │   └── data.plist
│   │       ├── tutorial_06.graffle/
│   │       │   ├── QuickLook/
│   │       │   │   └── Thumbnail.tiff
│   │       │   └── data.plist
│   │       ├── tutorial_07.vdx
│   │       ├── tutorial_08-09.vdx
│   │       ├── tutorial_09.graffle/
│   │       │   ├── QuickLook/
│   │       │   │   └── Thumbnail.tiff
│   │       │   └── data.plist
│   │       ├── tutorial_10-11.vdx
│   │       ├── tutorial_10.graffle/
│   │       │   ├── QuickLook/
│   │       │   │   └── Thumbnail.tiff
│   │       │   └── data.plist
│   │       ├── tutorial_12.graffle/
│   │       │   ├── QuickLook/
│   │       │   │   └── Thumbnail.tiff
│   │       │   └── data.plist
│   │       ├── tutorial_proto.graffle/
│   │       │   ├── QuickLook/
│   │       │   │   └── Thumbnail.tiff
│   │       │   └── data.plist
│   │       ├── tutorial_proto.vdx
│   │       ├── xhr_service.graffle
│   │       └── xhr_service.vdx
│   └── logo/
│       ├── AngularJS-Shield.exports/
│       │   └── AngularJS-Shield.eps
│       ├── AngularJS-Shield.graffle
│       ├── AngularJS.exports/
│       │   └── AngularJS.eps
│       └── AngularJS.graffle/
│           └── data.plist
├── karma-docs.conf.js
├── karma-jqlite.conf.js
├── karma-jquery-2.1.conf.js
├── karma-jquery-2.2.conf.js
├── karma-jquery.conf-factory.js
├── karma-jquery.conf.js
├── karma-modules-ngAnimate.conf.js
├── karma-modules-ngMock.conf.js
├── karma-modules.conf.js
├── karma-shared.conf.js
├── lib/
│   ├── grunt/
│   │   ├── plugins.js
│   │   ├── utils.js
│   │   └── validate-angular-files.js
│   ├── promises-aplus/
│   │   └── promises-aplus-test-adapter.js
│   ├── saucelabs/
│   │   └── sauce-service.sh
│   └── versions/
│       └── version-info.js
├── logs/
│   └── .gitignore
├── package.json
├── protractor-circleci-conf.js
├── protractor-conf.js
├── protractor-shared-conf.js
├── scripts/
│   ├── angular.js/
│   │   ├── tag-release.sh
│   │   └── untag-release.sh
│   ├── bower/
│   │   ├── publish.sh
│   │   ├── repos.inc
│   │   └── unpublish.sh
│   ├── check-size.sh
│   ├── code.angularjs.org/
│   │   ├── publish.sh
│   │   └── unpublish.sh
│   ├── code.angularjs.org-firebase/
│   │   ├── .eslintrc.json
│   │   ├── .firebaserc
│   │   ├── firebase.json
│   │   ├── functions/
│   │   │   ├── index.js
│   │   │   └── package.json
│   │   ├── public/
│   │   │   ├── googleb96cceae5888d79f.html
│   │   │   └── robots.txt
│   │   ├── readme.firebase.code.md
│   │   └── storage.rules
│   ├── compare-master-to-stable.js
│   ├── docs.angularjs.org-firebase/
│   │   ├── .firebaserc
│   │   ├── firebase.json
│   │   ├── functions/
│   │   │   ├── index.js
│   │   │   └── package.json
│   │   └── readme.firebase.docs.md
│   ├── errors.angularjs.org-firebase/
│   │   ├── .firebaserc
│   │   ├── firebase.json
│   │   └── public/
│   │       └── 404.html
│   ├── release/
│   │   ├── release.sh
│   │   └── undo-release.sh
│   └── utils.inc
├── src/
│   ├── .eslintrc.json
│   ├── Angular.js
│   ├── AngularPublic.js
│   ├── angular.bind.js
│   ├── angular.prefix
│   ├── angular.suffix
│   ├── apis.js
│   ├── auto/
│   │   └── injector.js
│   ├── jqLite.js
│   ├── loader.js
│   ├── loader.prefix
│   ├── loader.suffix
│   ├── minErr.js
│   ├── module.prefix
│   ├── module.suffix
│   ├── ng/
│   │   ├── anchorScroll.js
│   │   ├── animate.js
│   │   ├── animateCss.js
│   │   ├── animateRunner.js
│   │   ├── browser.js
│   │   ├── cacheFactory.js
│   │   ├── compile.js
│   │   ├── controller.js
│   │   ├── cookieReader.js
│   │   ├── directive/
│   │   │   ├── a.js
│   │   │   ├── attrs.js
│   │   │   ├── directives.js
│   │   │   ├── form.js
│   │   │   ├── input.js
│   │   │   ├── ngBind.js
│   │   │   ├── ngChange.js
│   │   │   ├── ngClass.js
│   │   │   ├── ngCloak.js
│   │   │   ├── ngController.js
│   │   │   ├── ngCsp.js
│   │   │   ├── ngEventDirs.js
│   │   │   ├── ngIf.js
│   │   │   ├── ngInclude.js
│   │   │   ├── ngInit.js
│   │   │   ├── ngList.js
│   │   │   ├── ngModel.js
│   │   │   ├── ngModelOptions.js
│   │   │   ├── ngNonBindable.js
│   │   │   ├── ngOptions.js
│   │   │   ├── ngPluralize.js
│   │   │   ├── ngRef.js
│   │   │   ├── ngRepeat.js
│   │   │   ├── ngShowHide.js
│   │   │   ├── ngStyle.js
│   │   │   ├── ngSwitch.js
│   │   │   ├── ngTransclude.js
│   │   │   ├── script.js
│   │   │   ├── select.js
│   │   │   └── validators.js
│   │   ├── document.js
│   │   ├── exceptionHandler.js
│   │   ├── filter/
│   │   │   ├── filter.js
│   │   │   ├── filters.js
│   │   │   ├── limitTo.js
│   │   │   └── orderBy.js
│   │   ├── filter.js
│   │   ├── forceReflow.js
│   │   ├── http.js
│   │   ├── httpBackend.js
│   │   ├── interpolate.js
│   │   ├── interval.js
│   │   ├── intervalFactory.js
│   │   ├── jsonpCallbacks.js
│   │   ├── locale.js
│   │   ├── location.js
│   │   ├── log.js
│   │   ├── parse.js
│   │   ├── q.js
│   │   ├── raf.js
│   │   ├── rootElement.js
│   │   ├── rootScope.js
│   │   ├── sanitizeUri.js
│   │   ├── sce.js
│   │   ├── sniffer.js
│   │   ├── taskTrackerFactory.js
│   │   ├── templateRequest.js
│   │   ├── testability.js
│   │   ├── timeout.js
│   │   ├── urlUtils.js
│   │   └── window.js
│   ├── ngAnimate/
│   │   ├── .eslintrc.json
│   │   ├── animateCache.js
│   │   ├── animateChildrenDirective.js
│   │   ├── animateCss.js
│   │   ├── animateCssDriver.js
│   │   ├── animateJs.js
│   │   ├── animateJsDriver.js
│   │   ├── animateQueue.js
│   │   ├── animation.js
│   │   ├── module.js
│   │   ├── ngAnimateSwap.js
│   │   ├── rafScheduler.js
│   │   └── shared.js
│   ├── ngAria/
│   │   └── aria.js
│   ├── ngComponentRouter/
│   │   └── Router.js
│   ├── ngCookies/
│   │   ├── cookieWriter.js
│   │   └── cookies.js
│   ├── ngLocale/
│   │   ├── .eslintrc.json
│   │   ├── angular-locale_af-na.js
│   │   ├── angular-locale_af-za.js
│   │   ├── angular-locale_af.js
│   │   ├── angular-locale_agq-cm.js
│   │   ├── angular-locale_agq.js
│   │   ├── angular-locale_ak-gh.js
│   │   ├── angular-locale_ak.js
│   │   ├── angular-locale_am-et.js
│   │   ├── angular-locale_am.js
│   │   ├── angular-locale_ar-001.js
│   │   ├── angular-locale_ar-ae.js
│   │   ├── angular-locale_ar-bh.js
│   │   ├── angular-locale_ar-dj.js
│   │   ├── angular-locale_ar-dz.js
│   │   ├── angular-locale_ar-eg.js
│   │   ├── angular-locale_ar-eh.js
│   │   ├── angular-locale_ar-er.js
│   │   ├── angular-locale_ar-il.js
│   │   ├── angular-locale_ar-iq.js
│   │   ├── angular-locale_ar-jo.js
│   │   ├── angular-locale_ar-km.js
│   │   ├── angular-locale_ar-kw.js
│   │   ├── angular-locale_ar-lb.js
│   │   ├── angular-locale_ar-ly.js
│   │   ├── angular-locale_ar-ma.js
│   │   ├── angular-locale_ar-mr.js
│   │   ├── angular-locale_ar-om.js
│   │   ├── angular-locale_ar-ps.js
│   │   ├── angular-locale_ar-qa.js
│   │   ├── angular-locale_ar-sa.js
│   │   ├── angular-locale_ar-sd.js
│   │   ├── angular-locale_ar-so.js
│   │   ├── angular-locale_ar-ss.js
│   │   ├── angular-locale_ar-sy.js
│   │   ├── angular-locale_ar-td.js
│   │   ├── angular-locale_ar-tn.js
│   │   ├── angular-locale_ar-xb.js
│   │   ├── angular-locale_ar-ye.js
│   │   ├── angular-locale_ar.js
│   │   ├── angular-locale_as-in.js
│   │   ├── angular-locale_as.js
│   │   ├── angular-locale_asa-tz.js
│   │   ├── angular-locale_asa.js
│   │   ├── angular-locale_ast-es.js
│   │   ├── angular-locale_ast.js
│   │   ├── angular-locale_az-cyrl-az.js
│   │   ├── angular-locale_az-cyrl.js
│   │   ├── angular-locale_az-latn-az.js
│   │   ├── angular-locale_az-latn.js
│   │   ├── angular-locale_az.js
│   │   ├── angular-locale_bas-cm.js
│   │   ├── angular-locale_bas.js
│   │   ├── angular-locale_be-by.js
│   │   ├── angular-locale_be.js
│   │   ├── angular-locale_bem-zm.js
│   │   ├── angular-locale_bem.js
│   │   ├── angular-locale_bez-tz.js
│   │   ├── angular-locale_bez.js
│   │   ├── angular-locale_bg-bg.js
│   │   ├── angular-locale_bg.js
│   │   ├── angular-locale_bm-ml.js
│   │   ├── angular-locale_bm.js
│   │   ├── angular-locale_bn-bd.js
│   │   ├── angular-locale_bn-in.js
│   │   ├── angular-locale_bn.js
│   │   ├── angular-locale_bo-cn.js
│   │   ├── angular-locale_bo-in.js
│   │   ├── angular-locale_bo.js
│   │   ├── angular-locale_br-fr.js
│   │   ├── angular-locale_br.js
│   │   ├── angular-locale_brx-in.js
│   │   ├── angular-locale_brx.js
│   │   ├── angular-locale_bs-cyrl-ba.js
│   │   ├── angular-locale_bs-cyrl.js
│   │   ├── angular-locale_bs-latn-ba.js
│   │   ├── angular-locale_bs-latn.js
│   │   ├── angular-locale_bs.js
│   │   ├── angular-locale_ca-ad.js
│   │   ├── angular-locale_ca-es-valencia.js
│   │   ├── angular-locale_ca-es.js
│   │   ├── angular-locale_ca-fr.js
│   │   ├── angular-locale_ca-it.js
│   │   ├── angular-locale_ca.js
│   │   ├── angular-locale_ce-ru.js
│   │   ├── angular-locale_ce.js
│   │   ├── angular-locale_cgg-ug.js
│   │   ├── angular-locale_cgg.js
│   │   ├── angular-locale_chr-us.js
│   │   ├── angular-locale_chr.js
│   │   ├── angular-locale_ckb-arab-iq.js
│   │   ├── angular-locale_ckb-arab-ir.js
│   │   ├── angular-locale_ckb-arab.js
│   │   ├── angular-locale_ckb-iq.js
│   │   ├── angular-locale_ckb-ir.js
│   │   ├── angular-locale_ckb-latn-iq.js
│   │   ├── angular-locale_ckb-latn.js
│   │   ├── angular-locale_ckb.js
│   │   ├── angular-locale_cs-cz.js
│   │   ├── angular-locale_cs.js
│   │   ├── angular-locale_cu-ru.js
│   │   ├── angular-locale_cu.js
│   │   ├── angular-locale_cy-gb.js
│   │   ├── angular-locale_cy.js
│   │   ├── angular-locale_da-dk.js
│   │   ├── angular-locale_da-gl.js
│   │   ├── angular-locale_da.js
│   │   ├── angular-locale_dav-ke.js
│   │   ├── angular-locale_dav.js
│   │   ├── angular-locale_de-at.js
│   │   ├── angular-locale_de-be.js
│   │   ├── angular-locale_de-ch.js
│   │   ├── angular-locale_de-de.js
│   │   ├── angular-locale_de-it.js
│   │   ├── angular-locale_de-li.js
│   │   ├── angular-locale_de-lu.js
│   │   ├── angular-locale_de.js
│   │   ├── angular-locale_dje-ne.js
│   │   ├── angular-locale_dje.js
│   │   ├── angular-locale_dsb-de.js
│   │   ├── angular-locale_dsb.js
│   │   ├── angular-locale_dua-cm.js
│   │   ├── angular-locale_dua.js
│   │   ├── angular-locale_dyo-sn.js
│   │   ├── angular-locale_dyo.js
│   │   ├── angular-locale_dz-bt.js
│   │   ├── angular-locale_dz.js
│   │   ├── angular-locale_ebu-ke.js
│   │   ├── angular-locale_ebu.js
│   │   ├── angular-locale_ee-gh.js
│   │   ├── angular-locale_ee-tg.js
│   │   ├── angular-locale_ee.js
│   │   ├── angular-locale_el-cy.js
│   │   ├── angular-locale_el-gr.js
│   │   ├── angular-locale_el.js
│   │   ├── angular-locale_en-001.js
│   │   ├── angular-locale_en-150.js
│   │   ├── angular-locale_en-ag.js
│   │   ├── angular-locale_en-ai.js
│   │   ├── angular-locale_en-as.js
│   │   ├── angular-locale_en-at.js
│   │   ├── angular-locale_en-au.js
│   │   ├── angular-locale_en-bb.js
│   │   ├── angular-locale_en-be.js
│   │   ├── angular-locale_en-bi.js
│   │   ├── angular-locale_en-bm.js
│   │   ├── angular-locale_en-bs.js
│   │   ├── angular-locale_en-bw.js
│   │   ├── angular-locale_en-bz.js
│   │   ├── angular-locale_en-ca.js
│   │   ├── angular-locale_en-cc.js
│   │   ├── angular-locale_en-ch.js
│   │   ├── angular-locale_en-ck.js
│   │   ├── angular-locale_en-cm.js
│   │   ├── angular-locale_en-cx.js
│   │   ├── angular-locale_en-cy.js
│   │   ├── angular-locale_en-de.js
│   │   ├── angular-locale_en-dg.js
│   │   ├── angular-locale_en-dk.js
│   │   ├── angular-locale_en-dm.js
│   │   ├── angular-locale_en-er.js
│   │   ├── angular-locale_en-fi.js
│   │   ├── angular-locale_en-fj.js
│   │   ├── angular-locale_en-fk.js
│   │   ├── angular-locale_en-fm.js
│   │   ├── angular-locale_en-gb.js
│   │   ├── angular-locale_en-gd.js
│   │   ├── angular-locale_en-gg.js
│   │   ├── angular-locale_en-gh.js
│   │   ├── angular-locale_en-gi.js
│   │   ├── angular-locale_en-gm.js
│   │   ├── angular-locale_en-gu.js
│   │   ├── angular-locale_en-gy.js
│   │   ├── angular-locale_en-hk.js
│   │   ├── angular-locale_en-ie.js
│   │   ├── angular-locale_en-il.js
│   │   ├── angular-locale_en-im.js
│   │   ├── angular-locale_en-in.js
│   │   ├── angular-locale_en-io.js
│   │   ├── angular-locale_en-iso.js
│   │   ├── angular-locale_en-je.js
│   │   ├── angular-locale_en-jm.js
│   │   ├── angular-locale_en-ke.js
│   │   ├── angular-locale_en-ki.js
│   │   ├── angular-locale_en-kn.js
│   │   ├── angular-locale_en-ky.js
│   │   ├── angular-locale_en-lc.js
│   │   ├── angular-locale_en-lr.js
│   │   ├── angular-locale_en-ls.js
│   │   ├── angular-locale_en-mg.js
│   │   ├── angular-locale_en-mh.js
│   │   ├── angular-locale_en-mo.js
│   │   ├── angular-locale_en-mp.js
│   │   ├── angular-locale_en-ms.js
│   │   ├── angular-locale_en-mt.js
│   │   ├── angular-locale_en-mu.js
│   │   ├── angular-locale_en-mw.js
│   │   ├── angular-locale_en-my.js
│   │   ├── angular-locale_en-na.js
│   │   ├── angular-locale_en-nf.js
│   │   ├── angular-locale_en-ng.js
│   │   ├── angular-locale_en-nl.js
│   │   ├── angular-locale_en-nr.js
│   │   ├── angular-locale_en-nu.js
│   │   ├── angular-locale_en-nz.js
│   │   ├── angular-locale_en-pg.js
│   │   ├── angular-locale_en-ph.js
│   │   ├── angular-locale_en-pk.js
│   │   ├── angular-locale_en-pn.js
│   │   ├── angular-locale_en-pr.js
│   │   ├── angular-locale_en-pw.js
│   │   ├── angular-locale_en-rw.js
│   │   ├── angular-locale_en-sb.js
│   │   ├── angular-locale_en-sc.js
│   │   ├── angular-locale_en-sd.js
│   │   ├── angular-locale_en-se.js
│   │   ├── angular-locale_en-sg.js
│   │   ├── angular-locale_en-sh.js
│   │   ├── angular-locale_en-si.js
│   │   ├── angular-locale_en-sl.js
│   │   ├── angular-locale_en-ss.js
│   │   ├── angular-locale_en-sx.js
│   │   ├── angular-locale_en-sz.js
│   │   ├── angular-locale_en-tc.js
│   │   ├── angular-locale_en-tk.js
│   │   ├── angular-locale_en-to.js
│   │   ├── angular-locale_en-tt.js
│   │   ├── angular-locale_en-tv.js
│   │   ├── angular-locale_en-tz.js
│   │   ├── angular-locale_en-ug.js
│   │   ├── angular-locale_en-um.js
│   │   ├── angular-locale_en-us-posix.js
│   │   ├── angular-locale_en-us.js
│   │   ├── angular-locale_en-vc.js
│   │   ├── angular-locale_en-vg.js
│   │   ├── angular-locale_en-vi.js
│   │   ├── angular-locale_en-vu.js
│   │   ├── angular-locale_en-ws.js
│   │   ├── angular-locale_en-xa.js
│   │   ├── angular-locale_en-za.js
│   │   ├── angular-locale_en-zm.js
│   │   ├── angular-locale_en-zw.js
│   │   ├── angular-locale_en.js
│   │   ├── angular-locale_eo-001.js
│   │   ├── angular-locale_eo.js
│   │   ├── angular-locale_es-419.js
│   │   ├── angular-locale_es-ar.js
│   │   ├── angular-locale_es-bo.js
│   │   ├── angular-locale_es-br.js
│   │   ├── angular-locale_es-bz.js
│   │   ├── angular-locale_es-cl.js
│   │   ├── angular-locale_es-co.js
│   │   ├── angular-locale_es-cr.js
│   │   ├── angular-locale_es-cu.js
│   │   ├── angular-locale_es-do.js
│   │   ├── angular-locale_es-ea.js
│   │   ├── angular-locale_es-ec.js
│   │   ├── angular-locale_es-es.js
│   │   ├── angular-locale_es-gq.js
│   │   ├── angular-locale_es-gt.js
│   │   ├── angular-locale_es-hn.js
│   │   ├── angular-locale_es-ic.js
│   │   ├── angular-locale_es-mx.js
│   │   ├── angular-locale_es-ni.js
│   │   ├── angular-locale_es-pa.js
│   │   ├── angular-locale_es-pe.js
│   │   ├── angular-locale_es-ph.js
│   │   ├── angular-locale_es-pr.js
│   │   ├── angular-locale_es-py.js
│   │   ├── angular-locale_es-sv.js
│   │   ├── angular-locale_es-us.js
│   │   ├── angular-locale_es-uy.js
│   │   ├── angular-locale_es-ve.js
│   │   ├── angular-locale_es.js
│   │   ├── angular-locale_et-ee.js
│   │   ├── angular-locale_et.js
│   │   ├── angular-locale_eu-es.js
│   │   ├── angular-locale_eu.js
│   │   ├── angular-locale_ewo-cm.js
│   │   ├── angular-locale_ewo.js
│   │   ├── angular-locale_fa-af.js
│   │   ├── angular-locale_fa-ir.js
│   │   ├── angular-locale_fa.js
│   │   ├── angular-locale_ff-cm.js
│   │   ├── angular-locale_ff-gn.js
│   │   ├── angular-locale_ff-mr.js
│   │   ├── angular-locale_ff-sn.js
│   │   ├── angular-locale_ff.js
│   │   ├── angular-locale_fi-fi.js
│   │   ├── angular-locale_fi.js
│   │   ├── angular-locale_fil-ph.js
│   │   ├── angular-locale_fil.js
│   │   ├── angular-locale_fo-dk.js
│   │   ├── angular-locale_fo-fo.js
│   │   ├── angular-locale_fo.js
│   │   ├── angular-locale_fr-be.js
│   │   ├── angular-locale_fr-bf.js
│   │   ├── angular-locale_fr-bi.js
│   │   ├── angular-locale_fr-bj.js
│   │   ├── angular-locale_fr-bl.js
│   │   ├── angular-locale_fr-ca.js
│   │   ├── angular-locale_fr-cd.js
│   │   ├── angular-locale_fr-cf.js
│   │   ├── angular-locale_fr-cg.js
│   │   ├── angular-locale_fr-ch.js
│   │   ├── angular-locale_fr-ci.js
│   │   ├── angular-locale_fr-cm.js
│   │   ├── angular-locale_fr-dj.js
│   │   ├── angular-locale_fr-dz.js
│   │   ├── angular-locale_fr-fr.js
│   │   ├── angular-locale_fr-ga.js
│   │   ├── angular-locale_fr-gf.js
│   │   ├── angular-locale_fr-gn.js
│   │   ├── angular-locale_fr-gp.js
│   │   ├── angular-locale_fr-gq.js
│   │   ├── angular-locale_fr-ht.js
│   │   ├── angular-locale_fr-km.js
│   │   ├── angular-locale_fr-lu.js
│   │   ├── angular-locale_fr-ma.js
│   │   ├── angular-locale_fr-mc.js
│   │   ├── angular-locale_fr-mf.js
│   │   ├── angular-locale_fr-mg.js
│   │   ├── angular-locale_fr-ml.js
│   │   ├── angular-locale_fr-mq.js
│   │   ├── angular-locale_fr-mr.js
│   │   ├── angular-locale_fr-mu.js
│   │   ├── angular-locale_fr-nc.js
│   │   ├── angular-locale_fr-ne.js
│   │   ├── angular-locale_fr-pf.js
│   │   ├── angular-locale_fr-pm.js
│   │   ├── angular-locale_fr-re.js
│   │   ├── angular-locale_fr-rw.js
│   │   ├── angular-locale_fr-sc.js
│   │   ├── angular-locale_fr-sn.js
│   │   ├── angular-locale_fr-sy.js
│   │   ├── angular-locale_fr-td.js
│   │   ├── angular-locale_fr-tg.js
│   │   ├── angular-locale_fr-tn.js
│   │   ├── angular-locale_fr-vu.js
│   │   ├── angular-locale_fr-wf.js
│   │   ├── angular-locale_fr-yt.js
│   │   ├── angular-locale_fr.js
│   │   ├── angular-locale_fur-it.js
│   │   ├── angular-locale_fur.js
│   │   ├── angular-locale_fy-nl.js
│   │   ├── angular-locale_fy.js
│   │   ├── angular-locale_ga-ie.js
│   │   ├── angular-locale_ga.js
│   │   ├── angular-locale_gd-gb.js
│   │   ├── angular-locale_gd.js
│   │   ├── angular-locale_gl-es.js
│   │   ├── angular-locale_gl.js
│   │   ├── angular-locale_gsw-ch.js
│   │   ├── angular-locale_gsw-fr.js
│   │   ├── angular-locale_gsw-li.js
│   │   ├── angular-locale_gsw.js
│   │   ├── angular-locale_gu-in.js
│   │   ├── angular-locale_gu.js
│   │   ├── angular-locale_guz-ke.js
│   │   ├── angular-locale_guz.js
│   │   ├── angular-locale_gv-im.js
│   │   ├── angular-locale_gv.js
│   │   ├── angular-locale_ha-gh.js
│   │   ├── angular-locale_ha-ne.js
│   │   ├── angular-locale_ha-ng.js
│   │   ├── angular-locale_ha.js
│   │   ├── angular-locale_haw-us.js
│   │   ├── angular-locale_haw.js
│   │   ├── angular-locale_he-il.js
│   │   ├── angular-locale_he.js
│   │   ├── angular-locale_hi-in.js
│   │   ├── angular-locale_hi.js
│   │   ├── angular-locale_hr-ba.js
│   │   ├── angular-locale_hr-hr.js
│   │   ├── angular-locale_hr.js
│   │   ├── angular-locale_hsb-de.js
│   │   ├── angular-locale_hsb.js
│   │   ├── angular-locale_hu-hu.js
│   │   ├── angular-locale_hu.js
│   │   ├── angular-locale_hy-am.js
│   │   ├── angular-locale_hy.js
│   │   ├── angular-locale_id-id.js
│   │   ├── angular-locale_id.js
│   │   ├── angular-locale_ig-ng.js
│   │   ├── angular-locale_ig.js
│   │   ├── angular-locale_ii-cn.js
│   │   ├── angular-locale_ii.js
│   │   ├── angular-locale_in.js
│   │   ├── angular-locale_is-is.js
│   │   ├── angular-locale_is.js
│   │   ├── angular-locale_it-ch.js
│   │   ├── angular-locale_it-it.js
│   │   ├── angular-locale_it-sm.js
│   │   ├── angular-locale_it-va.js
│   │   ├── angular-locale_it.js
│   │   ├── angular-locale_iw.js
│   │   ├── angular-locale_ja-jp.js
│   │   ├── angular-locale_ja.js
│   │   ├── angular-locale_jgo-cm.js
│   │   ├── angular-locale_jgo.js
│   │   ├── angular-locale_jmc-tz.js
│   │   ├── angular-locale_jmc.js
│   │   ├── angular-locale_ka-ge.js
│   │   ├── angular-locale_ka.js
│   │   ├── angular-locale_kab-dz.js
│   │   ├── angular-locale_kab.js
│   │   ├── angular-locale_kam-ke.js
│   │   ├── angular-locale_kam.js
│   │   ├── angular-locale_kde-tz.js
│   │   ├── angular-locale_kde.js
│   │   ├── angular-locale_kea-cv.js
│   │   ├── angular-locale_kea.js
│   │   ├── angular-locale_khq-ml.js
│   │   ├── angular-locale_khq.js
│   │   ├── angular-locale_ki-ke.js
│   │   ├── angular-locale_ki.js
│   │   ├── angular-locale_kk-kz.js
│   │   ├── angular-locale_kk.js
│   │   ├── angular-locale_kkj-cm.js
│   │   ├── angular-locale_kkj.js
│   │   ├── angular-locale_kl-gl.js
│   │   ├── angular-locale_kl.js
│   │   ├── angular-locale_kln-ke.js
│   │   ├── angular-locale_kln.js
│   │   ├── angular-locale_km-kh.js
│   │   ├── angular-locale_km.js
│   │   ├── angular-locale_kn-in.js
│   │   ├── angular-locale_kn.js
│   │   ├── angular-locale_ko-kp.js
│   │   ├── angular-locale_ko-kr.js
│   │   ├── angular-locale_ko.js
│   │   ├── angular-locale_kok-in.js
│   │   ├── angular-locale_kok.js
│   │   ├── angular-locale_ks-in.js
│   │   ├── angular-locale_ks.js
│   │   ├── angular-locale_ksb-tz.js
│   │   ├── angular-locale_ksb.js
│   │   ├── angular-locale_ksf-cm.js
│   │   ├── angular-locale_ksf.js
│   │   ├── angular-locale_ksh-de.js
│   │   ├── angular-locale_ksh.js
│   │   ├── angular-locale_kw-gb.js
│   │   ├── angular-locale_kw.js
│   │   ├── angular-locale_ky-kg.js
│   │   ├── angular-locale_ky.js
│   │   ├── angular-locale_lag-tz.js
│   │   ├── angular-locale_lag.js
│   │   ├── angular-locale_lb-lu.js
│   │   ├── angular-locale_lb.js
│   │   ├── angular-locale_lg-ug.js
│   │   ├── angular-locale_lg.js
│   │   ├── angular-locale_lkt-us.js
│   │   ├── angular-locale_lkt.js
│   │   ├── angular-locale_ln-ao.js
│   │   ├── angular-locale_ln-cd.js
│   │   ├── angular-locale_ln-cf.js
│   │   ├── angular-locale_ln-cg.js
│   │   ├── angular-locale_ln.js
│   │   ├── angular-locale_lo-la.js
│   │   ├── angular-locale_lo.js
│   │   ├── angular-locale_lrc-iq.js
│   │   ├── angular-locale_lrc-ir.js
│   │   ├── angular-locale_lrc.js
│   │   ├── angular-locale_lt-lt.js
│   │   ├── angular-locale_lt.js
│   │   ├── angular-locale_lu-cd.js
│   │   ├── angular-locale_lu.js
│   │   ├── angular-locale_luo-ke.js
│   │   ├── angular-locale_luo.js
│   │   ├── angular-locale_luy-ke.js
│   │   ├── angular-locale_luy.js
│   │   ├── angular-locale_lv-lv.js
│   │   ├── angular-locale_lv.js
│   │   ├── angular-locale_mas-ke.js
│   │   ├── angular-locale_mas-tz.js
│   │   ├── angular-locale_mas.js
│   │   ├── angular-locale_mer-ke.js
│   │   ├── angular-locale_mer.js
│   │   ├── angular-locale_mfe-mu.js
│   │   ├── angular-locale_mfe.js
│   │   ├── angular-locale_mg-mg.js
│   │   ├── angular-locale_mg.js
│   │   ├── angular-locale_mgh-mz.js
│   │   ├── angular-locale_mgh.js
│   │   ├── angular-locale_mgo-cm.js
│   │   ├── angular-locale_mgo.js
│   │   ├── angular-locale_mk-mk.js
│   │   ├── angular-locale_mk.js
│   │   ├── angular-locale_ml-in.js
│   │   ├── angular-locale_ml.js
│   │   ├── angular-locale_mn-mn.js
│   │   ├── angular-locale_mn.js
│   │   ├── angular-locale_mo.js
│   │   ├── angular-locale_mr-in.js
│   │   ├── angular-locale_mr.js
│   │   ├── angular-locale_ms-bn.js
│   │   ├── angular-locale_ms-my.js
│   │   ├── angular-locale_ms-sg.js
│   │   ├── angular-locale_ms.js
│   │   ├── angular-locale_mt-mt.js
│   │   ├── angular-locale_mt.js
│   │   ├── angular-locale_mua-cm.js
│   │   ├── angular-locale_mua.js
│   │   ├── angular-locale_my-mm.js
│   │   ├── angular-locale_my.js
│   │   ├── angular-locale_mzn-ir.js
│   │   ├── angular-locale_mzn.js
│   │   ├── angular-locale_naq-na.js
│   │   ├── angular-locale_naq.js
│   │   ├── angular-locale_nb-no.js
│   │   ├── angular-locale_nb-sj.js
│   │   ├── angular-locale_nb.js
│   │   ├── angular-locale_nd-zw.js
│   │   ├── angular-locale_nd.js
│   │   ├── angular-locale_nds-de.js
│   │   ├── angular-locale_nds-nl.js
│   │   ├── angular-locale_nds.js
│   │   ├── angular-locale_ne-in.js
│   │   ├── angular-locale_ne-np.js
│   │   ├── angular-locale_ne.js
│   │   ├── angular-locale_nl-aw.js
│   │   ├── angular-locale_nl-be.js
│   │   ├── angular-locale_nl-bq.js
│   │   ├── angular-locale_nl-cw.js
│   │   ├── angular-locale_nl-nl.js
│   │   ├── angular-locale_nl-sr.js
│   │   ├── angular-locale_nl-sx.js
│   │   ├── angular-locale_nl.js
│   │   ├── angular-locale_nmg-cm.js
│   │   ├── angular-locale_nmg.js
│   │   ├── angular-locale_nn-no.js
│   │   ├── angular-locale_nn.js
│   │   ├── angular-locale_nnh-cm.js
│   │   ├── angular-locale_nnh.js
│   │   ├── angular-locale_no-no.js
│   │   ├── angular-locale_no.js
│   │   ├── angular-locale_nus-ss.js
│   │   ├── angular-locale_nus.js
│   │   ├── angular-locale_nyn-ug.js
│   │   ├── angular-locale_nyn.js
│   │   ├── angular-locale_om-et.js
│   │   ├── angular-locale_om-ke.js
│   │   ├── angular-locale_om.js
│   │   ├── angular-locale_or-in.js
│   │   ├── angular-locale_or.js
│   │   ├── angular-locale_os-ge.js
│   │   ├── angular-locale_os-ru.js
│   │   ├── angular-locale_os.js
│   │   ├── angular-locale_pa-arab-pk.js
│   │   ├── angular-locale_pa-arab.js
│   │   ├── angular-locale_pa-guru-in.js
│   │   ├── angular-locale_pa-guru.js
│   │   ├── angular-locale_pa.js
│   │   ├── angular-locale_pl-pl.js
│   │   ├── angular-locale_pl.js
│   │   ├── angular-locale_prg-001.js
│   │   ├── angular-locale_prg.js
│   │   ├── angular-locale_ps-af.js
│   │   ├── angular-locale_ps.js
│   │   ├── angular-locale_pt-ao.js
│   │   ├── angular-locale_pt-br.js
│   │   ├── angular-locale_pt-ch.js
│   │   ├── angular-locale_pt-cv.js
│   │   ├── angular-locale_pt-gq.js
│   │   ├── angular-locale_pt-gw.js
│   │   ├── angular-locale_pt-lu.js
│   │   ├── angular-locale_pt-mo.js
│   │   ├── angular-locale_pt-mz.js
│   │   ├── angular-locale_pt-pt.js
│   │   ├── angular-locale_pt-st.js
│   │   ├── angular-locale_pt-tl.js
│   │   ├── angular-locale_pt.js
│   │   ├── angular-locale_qu-bo.js
│   │   ├── angular-locale_qu-ec.js
│   │   ├── angular-locale_qu-pe.js
│   │   ├── angular-locale_qu.js
│   │   ├── angular-locale_rm-ch.js
│   │   ├── angular-locale_rm.js
│   │   ├── angular-locale_rn-bi.js
│   │   ├── angular-locale_rn.js
│   │   ├── angular-locale_ro-md.js
│   │   ├── angular-locale_ro-ro.js
│   │   ├── angular-locale_ro.js
│   │   ├── angular-locale_rof-tz.js
│   │   ├── angular-locale_rof.js
│   │   ├── angular-locale_ru-by.js
│   │   ├── angular-locale_ru-kg.js
│   │   ├── angular-locale_ru-kz.js
│   │   ├── angular-locale_ru-md.js
│   │   ├── angular-locale_ru-ru.js
│   │   ├── angular-locale_ru-ua.js
│   │   ├── angular-locale_ru.js
│   │   ├── angular-locale_rw-rw.js
│   │   ├── angular-locale_rw.js
│   │   ├── angular-locale_rwk-tz.js
│   │   ├── angular-locale_rwk.js
│   │   ├── angular-locale_sah-ru.js
│   │   ├── angular-locale_sah.js
│   │   ├── angular-locale_saq-ke.js
│   │   ├── angular-locale_saq.js
│   │   ├── angular-locale_sbp-tz.js
│   │   ├── angular-locale_sbp.js
│   │   ├── angular-locale_se-fi.js
│   │   ├── angular-locale_se-no.js
│   │   ├── angular-locale_se-se.js
│   │   ├── angular-locale_se.js
│   │   ├── angular-locale_seh-mz.js
│   │   ├── angular-locale_seh.js
│   │   ├── angular-locale_ses-ml.js
│   │   ├── angular-locale_ses.js
│   │   ├── angular-locale_sg-cf.js
│   │   ├── angular-locale_sg.js
│   │   ├── angular-locale_sh.js
│   │   ├── angular-locale_shi-latn-ma.js
│   │   ├── angular-locale_shi-latn.js
│   │   ├── angular-locale_shi-tfng-ma.js
│   │   ├── angular-locale_shi-tfng.js
│   │   ├── angular-locale_shi.js
│   │   ├── angular-locale_si-lk.js
│   │   ├── angular-locale_si.js
│   │   ├── angular-locale_sk-sk.js
│   │   ├── angular-locale_sk.js
│   │   ├── angular-locale_sl-si.js
│   │   ├── angular-locale_sl.js
│   │   ├── angular-locale_smn-fi.js
│   │   ├── angular-locale_smn.js
│   │   ├── angular-locale_sn-zw.js
│   │   ├── angular-locale_sn.js
│   │   ├── angular-locale_so-dj.js
│   │   ├── angular-locale_so-et.js
│   │   ├── angular-locale_so-ke.js
│   │   ├── angular-locale_so-so.js
│   │   ├── angular-locale_so.js
│   │   ├── angular-locale_sq-al.js
│   │   ├── angular-locale_sq-mk.js
│   │   ├── angular-locale_sq-xk.js
│   │   ├── angular-locale_sq.js
│   │   ├── angular-locale_sr-cyrl-ba.js
│   │   ├── angular-locale_sr-cyrl-me.js
│   │   ├── angular-locale_sr-cyrl-rs.js
│   │   ├── angular-locale_sr-cyrl-xk.js
│   │   ├── angular-locale_sr-cyrl.js
│   │   ├── angular-locale_sr-latn-ba.js
│   │   ├── angular-locale_sr-latn-me.js
│   │   ├── angular-locale_sr-latn-rs.js
│   │   ├── angular-locale_sr-latn-xk.js
│   │   ├── angular-locale_sr-latn.js
│   │   ├── angular-locale_sr.js
│   │   ├── angular-locale_sv-ax.js
│   │   ├── angular-locale_sv-fi.js
│   │   ├── angular-locale_sv-se.js
│   │   ├── angular-locale_sv.js
│   │   ├── angular-locale_sw-cd.js
│   │   ├── angular-locale_sw-ke.js
│   │   ├── angular-locale_sw-tz.js
│   │   ├── angular-locale_sw-ug.js
│   │   ├── angular-locale_sw.js
│   │   ├── angular-locale_ta-in.js
│   │   ├── angular-locale_ta-lk.js
│   │   ├── angular-locale_ta-my.js
│   │   ├── angular-locale_ta-sg.js
│   │   ├── angular-locale_ta.js
│   │   ├── angular-locale_te-in.js
│   │   ├── angular-locale_te.js
│   │   ├── angular-locale_teo-ke.js
│   │   ├── angular-locale_teo-ug.js
│   │   ├── angular-locale_teo.js
│   │   ├── angular-locale_th-th.js
│   │   ├── angular-locale_th.js
│   │   ├── angular-locale_ti-er.js
│   │   ├── angular-locale_ti-et.js
│   │   ├── angular-locale_ti.js
│   │   ├── angular-locale_tk-tm.js
│   │   ├── angular-locale_tk.js
│   │   ├── angular-locale_tl.js
│   │   ├── angular-locale_to-to.js
│   │   ├── angular-locale_to.js
│   │   ├── angular-locale_tr-cy.js
│   │   ├── angular-locale_tr-tr.js
│   │   ├── angular-locale_tr.js
│   │   ├── angular-locale_twq-ne.js
│   │   ├── angular-locale_twq.js
│   │   ├── angular-locale_tzm-ma.js
│   │   ├── angular-locale_tzm.js
│   │   ├── angular-locale_ug-cn.js
│   │   ├── angular-locale_ug.js
│   │   ├── angular-locale_uk-ua.js
│   │   ├── angular-locale_uk.js
│   │   ├── angular-locale_ur-in.js
│   │   ├── angular-locale_ur-pk.js
│   │   ├── angular-locale_ur.js
│   │   ├── angular-locale_uz-arab-af.js
│   │   ├── angular-locale_uz-arab.js
│   │   ├── angular-locale_uz-cyrl-uz.js
│   │   ├── angular-locale_uz-cyrl.js
│   │   ├── angular-locale_uz-latn-uz.js
│   │   ├── angular-locale_uz-latn.js
│   │   ├── angular-locale_uz.js
│   │   ├── angular-locale_vai-latn-lr.js
│   │   ├── angular-locale_vai-latn.js
│   │   ├── angular-locale_vai-vaii-lr.js
│   │   ├── angular-locale_vai-vaii.js
│   │   ├── angular-locale_vai.js
│   │   ├── angular-locale_vi-vn.js
│   │   ├── angular-locale_vi.js
│   │   ├── angular-locale_vo-001.js
│   │   ├── angular-locale_vo.js
│   │   ├── angular-locale_vun-tz.js
│   │   ├── angular-locale_vun.js
│   │   ├── angular-locale_wae-ch.js
│   │   ├── angular-locale_wae.js
│   │   ├── angular-locale_xog-ug.js
│   │   ├── angular-locale_xog.js
│   │   ├── angular-locale_yav-cm.js
│   │   ├── angular-locale_yav.js
│   │   ├── angular-locale_yi-001.js
│   │   ├── angular-locale_yi.js
│   │   ├── angular-locale_yo-bj.js
│   │   ├── angular-locale_yo-ng.js
│   │   ├── angular-locale_yo.js
│   │   ├── angular-locale_yue-hk.js
│   │   ├── angular-locale_yue.js
│   │   ├── angular-locale_zgh-ma.js
│   │   ├── angular-locale_zgh.js
│   │   ├── angular-locale_zh-cn.js
│   │   ├── angular-locale_zh-hans-cn.js
│   │   ├── angular-locale_zh-hans-hk.js
│   │   ├── angular-locale_zh-hans-mo.js
│   │   ├── angular-locale_zh-hans-sg.js
│   │   ├── angular-locale_zh-hans.js
│   │   ├── angular-locale_zh-hant-hk.js
│   │   ├── angular-locale_zh-hant-mo.js
│   │   ├── angular-locale_zh-hant-tw.js
│   │   ├── angular-locale_zh-hant.js
│   │   ├── angular-locale_zh-hk.js
│   │   ├── angular-locale_zh-tw.js
│   │   ├── angular-locale_zh.js
│   │   ├── angular-locale_zu-za.js
│   │   └── angular-locale_zu.js
│   ├── ngMessageFormat/
│   │   ├── .eslintrc.json
│   │   ├── messageFormatCommon.js
│   │   ├── messageFormatInterpolationParts.js
│   │   ├── messageFormatParser.js
│   │   ├── messageFormatSelector.js
│   │   └── messageFormatService.js
│   ├── ngMessages/
│   │   └── messages.js
│   ├── ngMock/
│   │   ├── .eslintrc.json
│   │   ├── angular-mocks.js
│   │   └── browserTrigger.js
│   ├── ngParseExt/
│   │   ├── module.js
│   │   └── ucd.js
│   ├── ngResource/
│   │   └── resource.js
│   ├── ngRoute/
│   │   ├── .eslintrc.json
│   │   ├── directive/
│   │   │   └── ngView.js
│   │   ├── route.js
│   │   └── routeParams.js
│   ├── ngSanitize/
│   │   ├── .eslintrc.json
│   │   ├── filter/
│   │   │   └── linky.js
│   │   └── sanitize.js
│   ├── ngTouch/
│   │   ├── .eslintrc.json
│   │   ├── directive/
│   │   │   └── ngSwipe.js
│   │   ├── swipe.js
│   │   └── touch.js
│   ├── publishExternalApis.js
│   ├── routeToRegExp.js
│   ├── shallowCopy.js
│   └── stringify.js
├── test/
│   ├── .eslintrc.json
│   ├── AngularSpec.js
│   ├── ApiSpecs.js
│   ├── BinderSpec.js
│   ├── auto/
│   │   └── injectorSpec.js
│   ├── e2e/
│   │   ├── fixtures/
│   │   │   ├── .eslintrc.json
│   │   │   ├── anchor-scroll/
│   │   │   │   ├── index.html
│   │   │   │   └── script.js
│   │   │   ├── anchor-scroll-y-offset/
│   │   │   │   ├── index.html
│   │   │   │   └── script.js
│   │   │   ├── angularjs-already-loaded/
│   │   │   │   ├── index.html
│   │   │   │   └── script.js
│   │   │   ├── back2dom/
│   │   │   │   ├── index.html
│   │   │   │   └── script.js
│   │   │   ├── base-tag/
│   │   │   │   ├── index.html
│   │   │   │   └── script.js
│   │   │   ├── directive-require-html/
│   │   │   │   ├── index.html
│   │   │   │   └── script.js
│   │   │   ├── http/
│   │   │   │   ├── index.html
│   │   │   │   └── script.js
│   │   │   ├── input-hidden/
│   │   │   │   └── index.html
│   │   │   ├── loader/
│   │   │   │   ├── index.html
│   │   │   │   └── script.js
│   │   │   ├── ng-jq/
│   │   │   │   ├── index.html
│   │   │   │   └── script.js
│   │   │   ├── ng-jq-jquery/
│   │   │   │   ├── index.html
│   │   │   │   └── script.js
│   │   │   ├── ng-route-promise/
│   │   │   │   ├── index.html
│   │   │   │   └── script.js
│   │   │   ├── ready/
│   │   │   │   ├── index.html
│   │   │   │   └── script.js
│   │   │   ├── sample/
│   │   │   │   ├── index.html
│   │   │   │   └── script.js
│   │   │   └── version/
│   │   │       └── index.html
│   │   ├── tests/
│   │   │   ├── .eslintrc.json
│   │   │   ├── anchor-scroll.spec.js
│   │   │   ├── angularjs-already-loaded.spec.js
│   │   │   ├── base-tag.spec.js
│   │   │   ├── directive-require-html.spec.js
│   │   │   ├── helpers/
│   │   │   │   └── main.js
│   │   │   ├── http.spec.js
│   │   │   ├── input-hidden.spec.js
│   │   │   ├── loader.spec.js
│   │   │   ├── ng-jq.spec.js
│   │   │   ├── ng-route-promise.spec.js
│   │   │   ├── ready.spec.js
│   │   │   ├── sample.spec.js
│   │   │   └── version.spec.js
│   │   └── tools/
│   │       ├── .eslintrc.json
│   │       ├── fixture.js
│   │       ├── index.js
│   │       ├── middleware.js
│   │       └── util.js
│   ├── helpers/
│   │   ├── matchers.js
│   │   ├── privateMocks.js
│   │   ├── privateMocksSpec.js
│   │   ├── support.js
│   │   ├── supportSpec.js
│   │   └── testabilityPatch.js
│   ├── jQueryPatchSpec.js
│   ├── jqLiteSpec.js
│   ├── jquery_alias.js
│   ├── jquery_remove.js
│   ├── loaderSpec.js
│   ├── minErrSpec.js
│   ├── modules/
│   │   └── no_bootstrap.js
│   ├── ng/
│   │   ├── anchorScrollSpec.js
│   │   ├── animateCssSpec.js
│   │   ├── animateRunnerSpec.js
│   │   ├── animateSpec.js
│   │   ├── browserSpecs.js
│   │   ├── cacheFactorySpec.js
│   │   ├── compileSpec.js
│   │   ├── controllerSpec.js
│   │   ├── cookieReaderSpec.js
│   │   ├── directive/
│   │   │   ├── aSpec.js
│   │   │   ├── booleanAttrsSpec.js
│   │   │   ├── formSpec.js
│   │   │   ├── inputSpec.js
│   │   │   ├── ngBindSpec.js
│   │   │   ├── ngChangeSpec.js
│   │   │   ├── ngClassSpec.js
│   │   │   ├── ngClickSpec.js
│   │   │   ├── ngCloakSpec.js
│   │   │   ├── ngControllerSpec.js
│   │   │   ├── ngEventDirsSpec.js
│   │   │   ├── ngHrefSpec.js
│   │   │   ├── ngIfSpec.js
│   │   │   ├── ngIncludeSpec.js
│   │   │   ├── ngInitSpec.js
│   │   │   ├── ngKeySpec.js
│   │   │   ├── ngListSpec.js
│   │   │   ├── ngModelOptionsSpec.js
│   │   │   ├── ngModelSpec.js
│   │   │   ├── ngNonBindableSpec.js
│   │   │   ├── ngOptionsSpec.js
│   │   │   ├── ngPluralizeSpec.js
│   │   │   ├── ngRefSpec.js
│   │   │   ├── ngRepeatSpec.js
│   │   │   ├── ngShowHideSpec.js
│   │   │   ├── ngSrcSpec.js
│   │   │   ├── ngSrcsetSpec.js
│   │   │   ├── ngStyleSpec.js
│   │   │   ├── ngSwitchSpec.js
│   │   │   ├── scriptSpec.js
│   │   │   ├── selectSpec.js
│   │   │   ├── styleSpec.js
│   │   │   └── validatorsSpec.js
│   │   ├── documentSpec.js
│   │   ├── exceptionHandlerSpec.js
│   │   ├── filter/
│   │   │   ├── filterSpec.js
│   │   │   ├── filtersSpec.js
│   │   │   ├── limitToSpec.js
│   │   │   └── orderBySpec.js
│   │   ├── filterSpec.js
│   │   ├── forceReflowSpec.js
│   │   ├── httpBackendSpec.js
│   │   ├── httpSpec.js
│   │   ├── interpolateSpec.js
│   │   ├── intervalSpec.js
│   │   ├── jsonpCallbacksSpec.js
│   │   ├── localeSpec.js
│   │   ├── locationSpec.js
│   │   ├── logSpec.js
│   │   ├── ngOnSpec.js
│   │   ├── ngPropSpec.js
│   │   ├── parseSpec.js
│   │   ├── qSpec.js
│   │   ├── rafSpec.js
│   │   ├── rootElementSpec.js
│   │   ├── rootScopeSpec.js
│   │   ├── sanitizeUriSpec.js
│   │   ├── sceSpecs.js
│   │   ├── snifferSpec.js
│   │   ├── templateRequestSpec.js
│   │   ├── testabilitySpec.js
│   │   ├── timeoutSpec.js
│   │   ├── urlUtilsSpec.js
│   │   └── windowSpec.js
│   ├── ngAnimate/
│   │   ├── .eslintrc.json
│   │   ├── animateCacheSpec.js
│   │   ├── animateCssDriverSpec.js
│   │   ├── animateCssSpec.js
│   │   ├── animateJsDriverSpec.js
│   │   ├── animateJsSpec.js
│   │   ├── animateSpec.js
│   │   ├── animationHelperFunctionsSpec.js
│   │   ├── animationSpec.js
│   │   ├── integrationSpec.js
│   │   ├── ngAnimateSwapSpec.js
│   │   └── rafSchedulerSpec.js
│   ├── ngAria/
│   │   └── ariaSpec.js
│   ├── ngCookies/
│   │   ├── cookieWriterSpec.js
│   │   └── cookiesSpec.js
│   ├── ngMessageFormat/
│   │   └── messageFormatSpec.js
│   ├── ngMessages/
│   │   └── messagesSpec.js
│   ├── ngMock/
│   │   └── angular-mocksSpec.js
│   ├── ngResource/
│   │   └── resourceSpec.js
│   ├── ngRoute/
│   │   ├── directive/
│   │   │   └── ngViewSpec.js
│   │   ├── routeParamsSpec.js
│   │   └── routeSpec.js
│   ├── ngSanitize/
│   │   ├── directive/
│   │   │   └── ngBindHtmlSpec.js
│   │   ├── filter/
│   │   │   └── linkySpec.js
│   │   └── sanitizeSpec.js
│   ├── ngTouch/
│   │   ├── directive/
│   │   │   └── ngSwipeSpec.js
│   │   └── swipeSpec.js
│   └── stringifySpec.js
└── vendor/
    ├── README.md
    ├── closure-compiler/
    │   ├── COPYING
    │   ├── README.md
    │   └── compiler.jar
    └── ng-closure-runner/
        ├── LICENSE
        ├── README.md
        └── ngcompiler.jar
Download .txt
SYMBOL INDEX (451 symbols across 97 files)

FILE: Gruntfile.js
  function reportOrFail (line 527) | function reportOrFail(message) {

FILE: benchmarks/animation-bp/app.js
  function config (line 8) | function config($compileProvider) {
  function BenchmarkController (line 15) | function BenchmarkController($scope) {

FILE: benchmarks/largetable-bp/app.js
  function iGetter (line 27) | function iGetter() { return this.i; }
  function jGetter (line 29) | function jGetter() { return this.j; }

FILE: benchmarks/ng-options-bp/app.js
  function changeOptions (line 19) | function changeOptions() {

FILE: benchmarks/orderby-bp/app.js
  function getRandomInt (line 19) | function getRandomInt(min, max) {

FILE: benchmarks/repeat-animate-bp/common.js
  function fillData (line 25) | function fillData() {
  function createList (line 90) | function createList() {

FILE: benchmarks/select-ng-value-bp/app.js
  function changeOptions (line 19) | function changeOptions() {

FILE: docs/app/e2e/api-docs/directive-pages.scenario.js
  function getParamNames (line 36) | function getParamNames() {
  function getUsageAs (line 52) | function getUsageAs(type, directiveName) {

FILE: docs/app/src/directives.js
  function registerHDirective (line 160) | function registerHDirective(i) {

FILE: docs/app/src/search.js
  function clearResults (line 6) | function clearResults() {
  function localSearchFactory (line 97) | function localSearchFactory($http, $timeout, NG_PAGES) {
  function webWorkerSearchFactory (line 143) | function webWorkerSearchFactory($q, $rootScope, NG_PAGES) {

FILE: docs/app/src/versions.js
  function find (line 41) | function find(collection, matcherFn) {

FILE: docs/config/processors/keywords.js
  function extractTitleWords (line 60) | function extractTitleWords(title) {
  function extractWords (line 68) | function extractWords(text, words, keywordMap) {

FILE: docs/config/processors/pages-data.js
  function getNavGroup (line 14) | function getNavGroup(pages, area, pageSorter, pageMapper) {

FILE: docs/config/processors/versions-data.js
  function processAllVersionsResponse (line 46) | function processAllVersionsResponse(versions) {
  function makeOption (line 107) | function makeOption(version, group, label) {
  function createDocsUrl (line 116) | function createDocsUrl(version) {
  function reverse (line 125) | function reverse(fn) {
  function sortObject (line 129) | function sortObject(obj, cmp) {
  function semverIsStable (line 135) | function semverIsStable(version) {
  function createSnapshotStableLabel (line 140) | function createSnapshotStableLabel(version) {

FILE: docs/config/tag-defs/deprecated.js
  function humanList (line 30) | function humanList(values, sep, lastSep) {

FILE: i18n/spec/closureI18nExtractorSpec.js
  function newTestLocaleInfo (line 12) | function newTestLocaleInfo() {

FILE: i18n/spec/parserSpec.js
  function parseAndExpect (line 43) | function parseAndExpect(pattern, pp, np, ps, ns, mii, mif, maf, g, lg) {

FILE: i18n/src/closureI18nExtractor.js
  function findLocaleId (line 18) | function findLocaleId(str, type) {
  function getInfoForLocale (line 29) | function getInfoForLocale(localeInfo, localeID) {
  function extractNumberSymbols (line 37) | function extractNumberSymbols(content, localeInfo, currencySymbols) {
  function extractCurrencySymbols (line 51) | function extractCurrencySymbols(content) {
  function extractDateTimeSymbols (line 61) | function extractDateTimeSymbols(content, localeInfo) {
  function pluralExtractor (line 75) | function pluralExtractor(content, localeInfo) {
  function correctedLocaleId (line 106) | function correctedLocaleId(localeID) {
  function canonicalizeForJsonStringify (line 111) | function canonicalizeForJsonStringify(unused_key, object) {
  function serializeContent (line 138) | function serializeContent(localeObj) {
  function outputLocale (line 144) | function outputLocale(localeInfo, localeID) {

FILE: i18n/src/closureSlurper.js
  function readSymbols (line 13) | function readSymbols() {
  function extractPlurals (line 40) | function extractPlurals() {
  function writeLocaleFiles (line 47) | function writeLocaleFiles() {
  function createFolder (line 89) | function createFolder(folder) {

FILE: i18n/src/converter.js
  function convertNumberData (line 14) | function convertNumberData(dataObj, currencySymbols) {
  function convertDatetimeData (line 37) | function convertDatetimeData(dataObj) {

FILE: i18n/src/parser.js
  function ensureDecimalSep (line 23) | function ensureDecimalSep(pattern) {
  function parsePattern (line 32) | function parsePattern(pattern) {

FILE: i18n/ucd/spec/extactValuesSpec.js
  function stringStream (line 6) | function stringStream(str) {

FILE: i18n/ucd/src/extract.js
  function main (line 10) | function main() {

FILE: i18n/ucd/src/extractValues.js
  function extractValues (line 13) | function extractValues(stream, propertiesToExtract, callback) {

FILE: i18n/ucd/src/generateCode.js
  function generateCode (line 6) | function generateCode(validRanges) {
  function generateFunction (line 20) | function generateFunction(positiveElements, functionName) {

FILE: lib/grunt/utils.js
  method wrap (line 81) | wrap(src, name) {
  function processCSS (line 96) | function processCSS(state, file) {
  function removeSuffix (line 169) | function removeSuffix(fileName) {

FILE: lib/promises-aplus/promises-aplus-test-adapter.js
  function isFunction (line 14) | function isFunction(value) { return typeof value === 'function'; }
  function isPromiseLike (line 15) | function isPromiseLike(obj) { return obj && isFunction(obj.then); }
  function isObject (line 16) | function isObject(value) { return value !== null && typeof value === 'ob...
  function isUndefined (line 17) | function isUndefined(value) { return typeof value === 'undefined'; }
  function minErr (line 19) | function minErr(module, constructor) {
  function extend (line 26) | function extend(dst) {

FILE: lib/versions/version-info.js
  function getBuild (line 71) | function getBuild() {
  function checkBranchPattern (line 76) | function checkBranchPattern(version, branchPattern) {

FILE: protractor-circleci-conf.js
  function capabilitiesForSauceLabs (line 30) | function capabilitiesForSauceLabs(capabilities) {

FILE: scripts/code.angularjs.org-firebase/functions/index.js
  constant BROWSER_CACHE_DURATION (line 9) | const BROWSER_CACHE_DURATION = 60 * 10;
  constant CDN_CACHE_DURATION (line 10) | const CDN_CACHE_DURATION = 60 * 60 * 12;
  function sendStoredFile (line 12) | function sendStoredFile(request, response) {
  function deleteOldSnapshotZip (line 202) | function deleteOldSnapshotZip(object) {

FILE: scripts/docs.angularjs.org-firebase/functions/index.js
  constant BROWSER_CACHE_DURATION (line 6) | const BROWSER_CACHE_DURATION = 60 * 60;
  constant CDN_CACHE_DURATION (line 7) | const CDN_CACHE_DURATION = 60 * 60 * 12;
  function sendFile (line 25) | function sendFile(request, response) {

FILE: src/Angular.js
  function isArrayLike (line 180) | function isArrayLike(obj) {
  function forEach (line 236) | function forEach(obj, iterator, context) {
  function forEachSorted (line 278) | function forEachSorted(obj, iterator, context) {
  function reverseParams (line 292) | function reverseParams(iteratorFn) {
  function nextUid (line 306) | function nextUid() {
  function setHashKey (line 316) | function setHashKey(obj, h) {
  function baseExtend (line 325) | function baseExtend(dst, objs, deep) {
  function extend (line 379) | function extend(dst) {
  function merge (line 418) | function merge(dst) {
  function toInt (line 424) | function toInt(str) {
  function inherit (line 434) | function inherit(parent, extra) {
  function noop (line 454) | function noop() {}
  function identity (line 486) | function identity($) {return $;}
  function valueFn (line 490) | function valueFn(value) {return function valueRef() {return value;};}
  function hasCustomToString (line 492) | function hasCustomToString(obj) {
  function isUndefined (line 509) | function isUndefined(value) {return typeof value === 'undefined';}
  function isDefined (line 524) | function isDefined(value) {return typeof value !== 'undefined';}
  function isObject (line 540) | function isObject(value) {
  function isBlankObject (line 551) | function isBlankObject(value) {
  function isString (line 568) | function isString(value) {return typeof value === 'string';}
  function isNumber (line 589) | function isNumber(value) {return typeof value === 'number';}
  function isDate (line 604) | function isDate(value) {
  function isArray (line 621) | function isArray(arr) {
  function isError (line 633) | function isError(value) {
  function isFunction (line 655) | function isFunction(value) {return typeof value === 'function';}
  function isRegExp (line 665) | function isRegExp(value) {
  function isWindow (line 677) | function isWindow(obj) {
  function isScope (line 682) | function isScope(obj) {
  function isFile (line 687) | function isFile(obj) {
  function isFormData (line 692) | function isFormData(obj) {
  function isBlob (line 697) | function isBlob(obj) {
  function isBoolean (line 702) | function isBoolean(value) {
  function isPromiseLike (line 707) | function isPromiseLike(obj) {
  function isTypedArray (line 713) | function isTypedArray(value) {
  function isArrayBuffer (line 717) | function isArrayBuffer(obj) {
  function isElement (line 749) | function isElement(node) {
  function makeMap (line 759) | function makeMap(str) {
  function nodeName_ (line 768) | function nodeName_(element) {
  function includes (line 772) | function includes(array, obj) {
  function arrayRemove (line 776) | function arrayRemove(array, value) {
  function copy (line 871) | function copy(source, destination, maxDepth) {
  function simpleCompare (line 1018) | function simpleCompare(a, b) { return a === b || (a !== a && b !== b); }
  function equals (line 1084) | function equals(o1, o2) {
  function noUnsafeEval (line 1150) | function noUnsafeEval() {
  function concat (line 1215) | function concat(array1, array2, index) {
  function sliceArgs (line 1219) | function sliceArgs(args, startIndex) {
  function bind (line 1241) | function bind(self, fn) {
  function toJsonReplacer (line 1262) | function toJsonReplacer(key, value) {
  function toJson (line 1315) | function toJson(obj, pretty) {
  function fromJson (line 1336) | function fromJson(json) {
  function timezoneToOffset (line 1344) | function timezoneToOffset(timezone, fallback) {
  function addDateMinutes (line 1353) | function addDateMinutes(date, minutes) {
  function convertTimezoneToLocal (line 1360) | function convertTimezoneToLocal(date, timezone, reverse) {
  function startingTag (line 1371) | function startingTag(element) {
  function tryDecodeURIComponent (line 1396) | function tryDecodeURIComponent(value) {
  function parseKeyValue (line 1409) | function parseKeyValue(/**string*/keyValue) {
  function toKeyValue (line 1436) | function toKeyValue(obj) {
  function encodeUriSegment (line 1464) | function encodeUriSegment(val) {
  function encodeUriQuery (line 1483) | function encodeUriQuery(val, pctEncodeSpaces) {
  function getNgAttribute (line 1495) | function getNgAttribute(element, ngAttr) {
  function allowAutoBootstrap (line 1506) | function allowAutoBootstrap(document) {
  function angularInit (line 1700) | function angularInit(element, bootstrap) {
  function bootstrap (line 1793) | function bootstrap(element, modules, config) {
  function reloadWithDebugInfo (line 1871) | function reloadWithDebugInfo() {
  function getTestability (line 1884) | function getTestability(rootElement) {
  function snake_case (line 1894) | function snake_case(name, separator) {
  function bindJQuery (line 1902) | function bindJQuery() {
  function UNSAFE_restoreLegacyJqLiteXHTMLReplacement (line 1969) | function UNSAFE_restoreLegacyJqLiteXHTMLReplacement() {
  function assertArg (line 1976) | function assertArg(arg, name, reason) {
  function assertArgFn (line 1983) | function assertArgFn(arg, name, acceptArrayAnnotation) {
  function assertNotHasOwnProperty (line 1998) | function assertNotHasOwnProperty(name, context) {
  function getter (line 2012) | function getter(obj, path, bindFnToScope) {
  function getBlockNodes (line 2036) | function getBlockNodes(nodes) {
  function createMap (line 2066) | function createMap() {
  function stringify (line 2070) | function stringify(value) {

FILE: src/AngularPublic.js
  function publishExternalAPI (line 130) | function publishExternalAPI(angular) {

FILE: src/apis.js
  function hashKey (line 15) | function hashKey(obj, nextUidFn) {
  function NgMapShim (line 40) | function NgMapShim() {

FILE: src/auto/injector.js
  function stringifyFn (line 73) | function stringifyFn(fn) {
  function extractArgs (line 77) | function extractArgs(fn) {
  function anonFn (line 83) | function anonFn(fn) {
  function annotate (line 93) | function annotate(fn, strictDi, name) {
  function createInjector (line 706) | function createInjector(modulesToLoad, strictDi) {

FILE: src/jqLite.js
  function jqNextId (line 147) | function jqNextId() { return ++jqId; }
  function cssKebabToCamel (line 160) | function cssKebabToCamel(name) {
  function fnCamelCaseReplace (line 164) | function fnCamelCaseReplace(all, letter) {
  function kebabToCamel (line 172) | function kebabToCamel(name) {
  function jqLiteIsTextNode (line 213) | function jqLiteIsTextNode(html) {
  function jqLiteAcceptsData (line 217) | function jqLiteAcceptsData(node) {
  function jqLiteHasData (line 224) | function jqLiteHasData(node) {
  function jqLiteBuildFragment (line 231) | function jqLiteBuildFragment(html, context) {
  function jqLiteParseHTML (line 285) | function jqLiteParseHTML(html, context) {
  function jqLiteWrapNode (line 300) | function jqLiteWrapNode(node, wrapper) {
  function JQLite (line 318) | function JQLite(element) {
  function jqLiteClone (line 345) | function jqLiteClone(element) {
  function jqLiteDealoc (line 349) | function jqLiteDealoc(element, onlyDescendants) {
  function isEmptyObject (line 357) | function isEmptyObject(obj) {
  function removeIfEmptyData (line 366) | function removeIfEmptyData(element) {
  function jqLiteOff (line 379) | function jqLiteOff(element, type, fn, unsupported) {
  function jqLiteRemoveData (line 419) | function jqLiteRemoveData(element, name) {
  function jqLiteExpandoStore (line 435) | function jqLiteExpandoStore(element, createIfNecessary) {
  function jqLiteData (line 448) | function jqLiteData(element, key, value) {
  function jqLiteHasClass (line 477) | function jqLiteHasClass(element, selector) {
  function jqLiteRemoveClass (line 483) | function jqLiteRemoveClass(element, cssClasses) {
  function jqLiteAddClass (line 500) | function jqLiteAddClass(element, cssClasses) {
  function jqLiteAddNodes (line 520) | function jqLiteAddNodes(root, elements) {
  function jqLiteController (line 546) | function jqLiteController(element, name) {
  function jqLiteInheritedData (line 550) | function jqLiteInheritedData(element, name, value) {
  function jqLiteEmpty (line 570) | function jqLiteEmpty(element) {
  function jqLiteRemove (line 577) | function jqLiteRemove(element, keepData) {
  function jqLiteDocumentLoaded (line 584) | function jqLiteDocumentLoaded(action, win) {
  function jqLiteReady (line 597) | function jqLiteReady(fn) {
  function getBooleanAttrName (line 661) | function getBooleanAttrName(element, name) {
  function getAliasedAttrName (line 669) | function getAliasedAttrName(name) {
  function getText (line 767) | function getText(element, value) {
  function createEventHandler (line 852) | function createEventHandler(element, events) {
  function defaultHandlerWrapper (line 904) | function defaultHandlerWrapper(element, event, handler) {
  function specialMouseHandlerWrapper (line 908) | function specialMouseHandlerWrapper(target, event, handler) {
  function $$jqLiteProvider (line 1159) | function $$jqLiteProvider() {

FILE: src/loader.js
  function setupModuleLoader (line 12) | function setupModuleLoader(window) {

FILE: src/minErr.js
  function errorHandlingConfig (line 41) | function errorHandlingConfig(config) {
  function isValidObjectMaxDepth (line 59) | function isValidObjectMaxDepth(maxDepth) {
  function minErr (line 94) | function minErr(module, ErrorConstructor) {

FILE: src/ng/anchorScroll.js
  function $AnchorScrollProvider (line 12) | function $AnchorScrollProvider() {

FILE: src/ng/animate.js
  function mergeClasses (line 7) | function mergeClasses(a,b) {
  function extractElementNode (line 16) | function extractElementNode(element) {
  function splitClasses (line 25) | function splitClasses(classes) {
  function prepareAnimateOptions (line 50) | function prepareAnimateOptions(options) {
  function updateData (line 101) | function updateData(data, classes, value) {
  function handleCSSClassChanges (line 116) | function handleCSSClassChanges() {
  function addRemoveClassesPostDigest (line 149) | function addRemoveClassesPostDigest(element, add, remove) {
  function domInsert (line 315) | function domInsert(element, parentElement, afterElement) {

FILE: src/ng/animateCss.js
  function run (line 48) | function run() {
  function applyAnimationContents (line 59) | function applyAnimationContents() {

FILE: src/ng/animateRunner.js
  function waitForTick (line 7) | function waitForTick(fn) {
  function next (line 46) | function next() {
  function onProgress (line 70) | function onProgress(response) {
  function AnimateRunner (line 78) | function AnimateRunner(host) {

FILE: src/ng/browser.js
  function getHash (line 4) | function getHash(url) {
  function trimEmptyHash (line 9) | function trimEmptyHash(url) {
  function Browser (line 34) | function Browser(window, document, $log, $sniffer, $$taskTrackerFactory) {
  function $BrowserProvider (line 342) | function $BrowserProvider() {

FILE: src/ng/cacheFactory.js
  function $CacheFactoryProvider (line 85) | function $CacheFactoryProvider() {
  function $TemplateCacheProvider (line 404) | function $TemplateCacheProvider() {

FILE: src/ng/compile.js
  function UNINITIALIZED_VALUE (line 1369) | function UNINITIALIZED_VALUE() {}
  function $CompileProvider (line 1380) | function $CompileProvider($provide, $$sanitizeUriProvider) {
  function SimpleChange (line 4240) | function SimpleChange(previous, current) {
  function directiveNormalize (line 4254) | function directiveNormalize(name) {
  function nodesetLinkingFn (line 4307) | function nodesetLinkingFn(
  function directiveLinkingFn (line 4314) | function directiveLinkingFn(
  function tokenDifference (line 4322) | function tokenDifference(str1, str2) {
  function removeComments (line 4338) | function removeComments(jqNodes) {

FILE: src/ng/controller.js
  function identifierForController (line 7) | function identifierForController(controller, ident) {
  function $ControllerProvider (line 28) | function $ControllerProvider() {

FILE: src/ng/cookieReader.js
  function $$CookieReader (line 12) | function $$CookieReader($document) {
  function $$CookieReaderProvider (line 63) | function $$CookieReaderProvider() {

FILE: src/ng/directive/attrs.js
  function defaultLinkFn (line 356) | function defaultLinkFn(scope, element, attr) {

FILE: src/ng/directive/directives.js
  function ngDirective (line 3) | function ngDirective(directive) {

FILE: src/ng/directive/form.js
  function nullFormRenameControl (line 19) | function nullFormRenameControl(control, name) {
  function FormController (line 73) | function FormController($element, $attrs, $scope, $animate, $interpolate) {
  function getSetter (line 611) | function getSetter(expression) {
  function setupValidity (line 627) | function setupValidity(instance) {
  function addSetValidityMethod (line 631) | function addSetValidityMethod(context) {
  function isObjectEmpty (line 718) | function isObjectEmpty(obj) {

FILE: src/ng/directive/input.js
  function stringBasedInputType (line 1280) | function stringBasedInputType(ctrl) {
  function textInputType (line 1286) | function textInputType(scope, element, attr, ctrl, $sniffer, $browser) {
  function baseInputType (line 1291) | function baseInputType(scope, element, attr, ctrl, $sniffer, $browser) {
  function weekParser (line 1411) | function weekParser(isoWeek, existingDate) {
  function createDateParser (line 1443) | function createDateParser(regexp, mapping) {
  function createDateInputType (line 1501) | function createDateInputType(type, regexp, parseDate, format) {
  function badInputChecker (line 1622) | function badInputChecker(scope, element, attr, ctrl, parserName) {
  function numberFormatterParser (line 1638) | function numberFormatterParser(ctrl) {
  function parseNumberAttrVal (line 1658) | function parseNumberAttrVal(val) {
  function isNumberInteger (line 1665) | function isNumberInteger(num) {
  function countDecimals (line 1673) | function countDecimals(num) {
  function isValidForStep (line 1693) | function isValidForStep(viewValue, stepBase, step) {
  function numberInputType (line 1724) | function numberInputType(scope, element, attr, ctrl, $sniffer, $browser,...
  function rangeInputType (line 1789) | function rangeInputType(scope, element, attr, ctrl, $sniffer, $browser) {
  function urlInputType (line 1935) | function urlInputType(scope, element, attr, ctrl, $sniffer, $browser) {
  function emailInputType (line 1947) | function emailInputType(scope, element, attr, ctrl, $sniffer, $browser) {
  function radioInputType (line 1959) | function radioInputType(scope, element, attr, ctrl) {
  function parseConstantExpr (line 1990) | function parseConstantExpr($parse, context, name, expression, fallback) {
  function checkboxInputType (line 2003) | function checkboxInputType(scope, element, attr, ctrl, $sniffer, $browse...
  function updateElementValue (line 2346) | function updateElementValue(element, attr, value) {

FILE: src/ng/directive/ngClass.js
  function classDirective (line 9) | function classDirective(name, selector) {

FILE: src/ng/directive/ngEventDirs.js
  function createEventDirective (line 59) | function createEventDirective($parse, $rootScope, $exceptionHandler, dir...

FILE: src/ng/directive/ngModel.js
  function NgModelController (line 254) | function NgModelController($scope, $exceptionHandler, $attr, $element, $...
  function processParseErrors (line 617) | function processParseErrors() {
  function processSyncValidators (line 639) | function processSyncValidators() {
  function processAsyncValidators (line 655) | function processAsyncValidators() {
  function setValidity (line 681) | function setValidity(name, isValid) {
  function validationDone (line 687) | function validationDone(allValid) {
  function writeToModelIfNeeded (line 773) | function writeToModelIfNeeded() {
  function setupModelWatcher (line 1075) | function setupModelWatcher(ctrl) {
  function setTouched (line 1365) | function setTouched() {

FILE: src/ng/directive/ngModelOptions.js
  function ModelOptions (line 13) | function ModelOptions(options) {
  function NgModelOptionsController (line 549) | function NgModelOptionsController($attrs, $scope) {
  function defaults (line 574) | function defaults(dst, src) {

FILE: src/ng/directive/ngOptions.js
  function parseOptionsExpression (line 253) | function parseOptionsExpression(optionsExp, selectElement, scope) {
  function ngOptionsPostLink (line 416) | function ngOptionsPostLink(scope, selectElement, attr, ctrls) {

FILE: src/ng/directive/ngPluralize.js
  function updateElementText (line 235) | function updateElementText(newText) {

FILE: src/ng/directive/ngTransclude.js
  function ngTranscludeCloneAttachFn (line 196) | function ngTranscludeCloneAttachFn(clone, transcludedScope) {
  function useFallbackContent (line 207) | function useFallbackContent() {
  function notWhitespace (line 215) | function notWhitespace(nodes) {

FILE: src/ng/directive/select.js
  function setOptionSelectedStatus (line 7) | function setOptionSelectedStatus(optionEl, value) {
  function scheduleRender (line 357) | function scheduleRender() {
  function scheduleViewValueUpdate (line 367) | function scheduleViewValueUpdate(renderAfter) {
  function selectPreLink (line 755) | function selectPreLink(scope, element, attr, ctrls) {
  function selectPostLink (line 840) | function selectPostLink(scope, element, attrs, ctrls) {

FILE: src/ng/directive/validators.js
  function parsePatternAttr (line 420) | function parsePatternAttr(regex, patternExp, elm) {
  function parseLength (line 436) | function parseLength(val) {

FILE: src/ng/document.js
  function $DocumentProvider (line 29) | function $DocumentProvider() {
  function $$IsDocumentHiddenProvider (line 41) | function $$IsDocumentHiddenProvider() {

FILE: src/ng/exceptionHandler.js
  function $ExceptionHandlerProvider (line 47) | function $ExceptionHandlerProvider() {

FILE: src/ng/filter.js
  function $FilterProvider (line 110) | function $FilterProvider($provide) {

FILE: src/ng/filter/filter.js
  function filterFilter (line 140) | function filterFilter() {
  function createPredicateFn (line 177) | function createPredicateFn(expression, comparator, anyPropertyKey, match...
  function deepCompare (line 214) | function deepCompare(actual, expected, comparator, anyPropertyKey, match...
  function getTypeForFilter (line 266) | function getTypeForFilter(val) {

FILE: src/ng/filter/filters.js
  function currencyFilter (line 60) | function currencyFilter($locale) {
  function numberFilter (line 137) | function numberFilter($locale) {
  function parse (line 162) | function parse(numStr) {
  function roundNumber (line 217) | function roundNumber(parsedNumber, fractionSize, minFrac, maxFrac) {
  function formatNumber (line 292) | function formatNumber(number, pattern, groupSep, decimalSep, fractionSiz...
  function padNumber (line 358) | function padNumber(num, digits, trim, negWrap) {
  function dateGetter (line 377) | function dateGetter(name, size, offset, trim, negWrap) {
  function dateStrGetter (line 389) | function dateStrGetter(name, shortForm, standAlone) {
  function timeZoneGetter (line 399) | function timeZoneGetter(date, formats, offset) {
  function getFirstThursdayOfYear (line 409) | function getFirstThursdayOfYear(year) {
  function getThursdayThisWeek (line 417) | function getThursdayThisWeek(datetime) {
  function weekGetter (line 423) | function weekGetter(size) {
  function ampmGetter (line 435) | function ampmGetter(date, formats) {
  function eraGetter (line 439) | function eraGetter(date, formats) {
  function longEraGetter (line 443) | function longEraGetter(date, formats) {
  function dateFilter (line 581) | function dateFilter($locale) {
  function jsonFilter (line 688) | function jsonFilter() {

FILE: src/ng/filter/limitTo.js
  function limitToFilter (line 102) | function limitToFilter() {
  function sliceFn (line 129) | function sliceFn(input, begin, end) {

FILE: src/ng/filter/orderBy.js
  function orderByFilter (line 563) | function orderByFilter($parse) {

FILE: src/ng/http.js
  function serializeValue (line 13) | function serializeValue(v) {
  function $HttpParamSerializerProvider (line 22) | function $HttpParamSerializerProvider() {
  function $HttpParamSerializerJQLikeProvider (line 60) | function $HttpParamSerializerJQLikeProvider() {
  function defaultHttpResponseTransform (line 136) | function defaultHttpResponseTransform(data, headers) {
  function isJsonLike (line 162) | function isJsonLike(str) {
  function parseHeaders (line 173) | function parseHeaders(headers) {
  function headersGetter (line 209) | function headersGetter(headers) {
  function transformData (line 239) | function transformData(data, headers, status, fns) {
  function isSuccess (line 252) | function isSuccess(status) {
  function $HttpProvider (line 265) | function $HttpProvider() {

FILE: src/ng/httpBackend.js
  function $xhrFactoryProvider (line 25) | function $xhrFactoryProvider() {
  function $HttpBackendProvider (line 51) | function $HttpBackendProvider() {
  function createHttpBackend (line 57) | function createHttpBackend($browser, createXhr, $browserDefer, callbacks...

FILE: src/ng/interpolate.js
  function $InterpolateProvider (line 59) | function $InterpolateProvider() {

FILE: src/ng/interval.js
  function $IntervalProvider (line 6) | function $IntervalProvider() {

FILE: src/ng/intervalFactory.js
  function $$IntervalFactoryProvider (line 4) | function $$IntervalFactoryProvider() {

FILE: src/ng/jsonpCallbacks.js
  function createCallback (line 17) | function createCallback(callbackId) {

FILE: src/ng/location.js
  function encodePath (line 15) | function encodePath(path) {
  function decodePath (line 27) | function decodePath(path, html5Mode) {
  function normalizePath (line 42) | function normalizePath(pathValue, searchValue, hashValue) {
  function parseAbsoluteUrl (line 50) | function parseAbsoluteUrl(absoluteUrl, locationObj) {
  function parseAppUrl (line 59) | function parseAppUrl(url, locationObj, html5Mode) {
  function startsWith (line 81) | function startsWith(str, search) {
  function stripBaseUrl (line 92) | function stripBaseUrl(base, url) {
  function stripHash (line 98) | function stripHash(url) {
  function stripFile (line 103) | function stripFile(url) {
  function serverBase (line 108) | function serverBase(url) {
  function LocationHtml5Url (line 122) | function LocationHtml5Url(appBase, appBaseNoFile, basePrefix) {
  function LocationHashbangUrl (line 194) | function LocationHashbangUrl(appBase, appBaseNoFile, hashPrefix) {
  function LocationHashbangInHtml5Url (line 298) | function LocationHashbangInHtml5Url(appBase, appBaseNoFile, hashPrefix) {
  function locationGetter (line 674) | function locationGetter(property) {
  function locationGetterSetter (line 681) | function locationGetterSetter(property, preprocess) {
  function $LocationProvider (line 729) | function $LocationProvider() {

FILE: src/ng/log.js
  function $LogProvider (line 57) | function $LogProvider() {

FILE: src/ng/parse.js
  function getStringValue (line 33) | function getStringValue(name) {
  function ifDefined (line 610) | function ifDefined(v, d) {
  function plusFn (line 614) | function plusFn(l, r) {
  function isStateless (line 620) | function isStateless($filter, filterName) {
  function isPure (line 629) | function isPure(node, parentIsPure) {
  function findConstantAndWatchExpressions (line 654) | function findConstantAndWatchExpressions(ast, $filter, parentIsPure) {
  function getInputs (line 767) | function getInputs(body) {
  function isAssignable (line 775) | function isAssignable(ast) {
  function assignableAST (line 779) | function assignableAST(ast) {
  function isLiteral (line 785) | function isLiteral(ast) {
  function isConstant (line 793) | function isConstant(ast) {
  function ASTCompiler (line 797) | function ASTCompiler($filter) {
  function ASTInterpreter (line 1263) | function ASTInterpreter($filter) {
  function Parser (line 1637) | function Parser(lexer, $filter, options) {
  function getValueOf (line 1670) | function getValueOf(value) {
  function $ParseProvider (line 1726) | function $ParseProvider() {

FILE: src/ng/q.js
  function $QProvider (line 227) | function $QProvider() {
  function $$QProvider (line 259) | function $$QProvider() {
  function qFactory (line 287) | function qFactory(nextTick, exceptionHandler, errorOnUnhandledRejections) {
  function isStateExceptionHandled (line 679) | function isStateExceptionHandled(state) {
  function markQStateExceptionHandled (line 682) | function markQStateExceptionHandled(state) {
  function markQExceptionHandled (line 685) | function markQExceptionHandled(q) {

FILE: src/ng/raf.js
  function $$RAFProvider (line 4) | function $$RAFProvider() { //rAF

FILE: src/ng/rootScope.js
  function $RootScopeProvider (line 72) | function $RootScopeProvider() {

FILE: src/ng/sanitizeUri.js
  function $$SanitizeUriProvider (line 8) | function $$SanitizeUriProvider() {

FILE: src/ng/sce.js
  function snakeToCamel (line 46) | function snakeToCamel(name) {
  function adjustMatcher (line 51) | function adjustMatcher(matcher) {
  function adjustMatchers (line 79) | function adjustMatchers(matchers) {
  function $SceDelegateProvider (line 181) | function $SceDelegateProvider() {
  function $SceProvider (line 817) | function $SceProvider() {

FILE: src/ng/sniffer.js
  function $SnifferProvider (line 20) | function $SnifferProvider() {

FILE: src/ng/taskTrackerFactory.js
  function $$TaskTrackerFactoryProvider (line 18) | function $$TaskTrackerFactoryProvider() {
  function TaskTracker (line 22) | function TaskTracker(log) {

FILE: src/ng/templateRequest.js
  function $TemplateRequestProvider (line 16) | function $TemplateRequestProvider() {

FILE: src/ng/testability.js
  function $$TestabilityProvider (line 4) | function $$TestabilityProvider() {

FILE: src/ng/timeout.js
  function $TimeoutProvider (line 6) | function $TimeoutProvider() {

FILE: src/ng/urlUtils.js
  function urlResolve (line 66) | function urlResolve(url) {
  function urlIsSameOrigin (line 109) | function urlIsSameOrigin(requestUrl) {
  function urlIsSameOriginAsBaseUrl (line 123) | function urlIsSameOriginAsBaseUrl(requestUrl) {
  function urlIsAllowedOriginFactory (line 136) | function urlIsAllowedOriginFactory(trustedOriginUrls) {
  function urlsAreSameOrigin (line 165) | function urlsAreSameOrigin(url1, url2) {
  function getBaseUrl (line 177) | function getBaseUrl() {

FILE: src/ng/window.js
  function $WindowProvider (line 45) | function $WindowProvider() {

FILE: src/ngAnimate/animateChildrenDirective.js
  function setData (line 94) | function setData(value) {

FILE: src/ngAnimate/animateCss.js
  function getCssKeyframeDurationStyle (line 242) | function getCssKeyframeDurationStyle(duration) {
  function getCssDelayStyle (line 246) | function getCssDelayStyle(delay, isKeyframeAnimation) {
  function computeCssStyles (line 251) | function computeCssStyles($window, element, properties) {
  function parseMaxTime (line 277) | function parseMaxTime(str) {
  function truthyTimingValue (line 292) | function truthyTimingValue(val) {
  function getCssTransitionDurationStyle (line 296) | function getCssTransitionDurationStyle(duration, applyOnlyDuration) {
  function registerRestorableStyles (line 316) | function registerRestorableStyles(backup, node, properties) {
  function computeCachedCssStyles (line 333) | function computeCachedCssStyles(node, className, cacheKey, allowNoDurati...
  function computeCachedCssStaggerStyles (line 354) | function computeCachedCssStaggerStyles(node, className, cacheKey, proper...
  function waitUntilQuiet (line 385) | function waitUntilQuiet(callback) {
  function computeTimings (line 403) | function computeTimings(node, className, cacheKey, allowNoDuration) {
  function endFn (line 678) | function endFn() {
  function cancelFn (line 682) | function cancelFn() {
  function close (line 686) | function close(rejected) {
  function applyBlocking (line 751) | function applyBlocking(duration) {
  function closeAndReturnNoopAnimator (line 761) | function closeAndReturnNoopAnimator() {
  function onAnimationProgress (line 780) | function onAnimationProgress(event) {
  function start (line 813) | function start() {

FILE: src/ngAnimate/animateCssDriver.js
  function isDocumentFragment (line 12) | function isDocumentFragment(node) {
  function filterCssClasses (line 41) | function filterCssClasses(classes) {
  function getUniqueValues (line 46) | function getUniqueValues(a, b) {
  function prepareAnchoredAnimation (line 54) | function prepareAnchoredAnimation(classes, outAnchor, inAnchor) {
  function prepareFromToAnchorAnimation (line 181) | function prepareFromToAnchorAnimation(from, to, classes, anchors) {
  function prepareRegularAnimation (line 234) | function prepareRegularAnimation(animationDetails) {

FILE: src/ngAnimate/animateJs.js
  function applyOptions (line 63) | function applyOptions() {
  function close (line 68) | function close() {
  function onComplete (line 130) | function onComplete(success) {
  function endAnimations (line 135) | function endAnimations(cancelled) {
  function executeAnimationFn (line 144) | function executeAnimationFn(fn, element, event, options, onDone) {
  function groupEventedAnimations (line 187) | function groupEventedAnimations(element, event, options, animations, fnN...
  function packageAnimations (line 228) | function packageAnimations(element, event, options, animations, fnName) {
  function lookupAnimations (line 278) | function lookupAnimations(classes) {

FILE: src/ngAnimate/animateJsDriver.js
  function endFnFactory (line 33) | function endFnFactory() {
  function done (line 42) | function done(status) {
  function prepareAnimation (line 52) | function prepareAnimation(animationDetails) {

FILE: src/ngAnimate/animateQueue.js
  function getEventData (line 16) | function getEventData(options) {
  function makeTruthyCssClassMap (line 25) | function makeTruthyCssClassMap(classString) {
  function hasMatchingClasses (line 39) | function hasMatchingClasses(newClassString, currentClassString) {
  function isAllowed (line 48) | function isAllowed(ruleType, currentAnimation, previousAnimation) {
  function hasAnimationClasses (line 54) | function hasAnimationClasses(animation, and) {
  function removeFromDisabledElementsLookup (line 123) | function removeFromDisabledElementsLookup(evt) {
  function postDigestTaskFactory (line 127) | function postDigestTaskFactory() {
  function normalizeAnimationDetails (line 190) | function normalizeAnimationDetails(element, animation) {
  function findCallbacks (line 200) | function findCallbacks(targetParentNode, targetNode, event) {
  function filterFromRegistry (line 216) | function filterFromRegistry(list, matchContainer, matchCallback) {
  function cleanupEventListeners (line 225) | function cleanupEventListeners(phase, node) {
  function queueAnimation (line 326) | function queueAnimation(originalElement, event, initialOptions) {
  function closeChildAnimations (line 608) | function closeChildAnimations(node) {
  function clearElementAnimationState (line 626) | function clearElementAnimationState(node) {
  function areAnimationsAllowed (line 638) | function areAnimationsAllowed(node, parentNode, event) {
  function markElementAnimationState (line 723) | function markElementAnimationState(node, state, details) {

FILE: src/ngAria/aria.js
  function $AriaProvider (line 96) | function $AriaProvider() {
  function shouldAttachAttr (line 233) | function shouldAttachAttr(attr, normalizedAttr, elem, allowNonAriaNodes) {
  function shouldAttachRole (line 240) | function shouldAttachRole(role, elem) {
  function getShape (line 247) | function getShape(attr, elem) {
  function ngAriaWatchModelValue (line 269) | function ngAriaWatchModelValue() {
  function getRadioReaction (line 273) | function getRadioReaction(newVal) {
  function getCheckboxReaction (line 280) | function getCheckboxReaction() {
  function callback (line 400) | function callback() {

FILE: src/ngCookies/cookies.js
  function calcOptions (line 62) | function calcOptions(options) {

FILE: src/ngLocale/angular-locale_agq.js
  function getDecimals (line 4) | function getDecimals(n) {
  function getVF (line 10) | function getVF(n, opt_precision) {
Copy disabled (too large) Download .json
Condensed preview — 1516 files, each showing path, character count, and a content snippet. Download the .json file for the full structured content (16,455K chars).
[
  {
    "path": ".circleci/config.yml",
    "chars": 18751,
    "preview": "# Configuration file for https://circleci.com/gh/angular/angular.js\n\n# Note: YAML anchors allow an object to be re-used,"
  },
  {
    "path": ".circleci/env-helpers.inc.sh",
    "chars": 2670,
    "preview": "####################################################################################################\n# Helpers for defin"
  },
  {
    "path": ".circleci/env.sh",
    "chars": 3824,
    "preview": "#!/usr/bin/env bash\n\n# Variables\nreadonly projectDir=$(realpath \"$(dirname ${BASH_SOURCE[0]})/..\")\nreadonly envHelpersPa"
  },
  {
    "path": ".editorconfig",
    "chars": 305,
    "preview": "# https://editorconfig.org\n\nroot = true\n\n[*]\ncharset = utf-8\nindent_style = space\nindent_size = 2\nend_of_line = lf\ninser"
  },
  {
    "path": ".eslintignore",
    "chars": 183,
    "preview": "build/**\ndocs/app/assets/js/angular-bootstrap/**\ndocs/config/templates/**\nnode_modules/**\nlib/htmlparser/**\nsrc/angular."
  },
  {
    "path": ".eslintrc-base.json",
    "chars": 3762,
    "preview": "{\n  \"rules\": {\n    // Rules are divided into sections from http://eslint.org/docs/rules/\n\n    // Possible errors\n    \"co"
  },
  {
    "path": ".eslintrc-browser.json",
    "chars": 394,
    "preview": "{\n  \"extends\": \"./.eslintrc-base.json\",\n\n  \"env\": {\n    // Note: don't set `\"browser\": true`; code in \"src/\" should be c"
  },
  {
    "path": ".eslintrc-node.json",
    "chars": 180,
    "preview": "{\n  \"extends\": \"./.eslintrc-base.json\",\n  \"env\": {\n    \"browser\": false,\n    \"node\": true\n  },\n  \"parserOptions\": {\n    "
  },
  {
    "path": ".eslintrc-todo.json",
    "chars": 1042,
    "preview": "{\n  // This config contains proposed rules that we'd like to have enabled but haven't\n  // converted the code to adhere "
  },
  {
    "path": ".eslintrc.json",
    "chars": 57,
    "preview": "{\n  \"root\": true,\n  \"extends\": \"./.eslintrc-node.json\"\n}\n"
  },
  {
    "path": ".gitattributes",
    "chars": 127,
    "preview": "# Auto detect text files and perform LF normalization\n* text=auto\n\n# JS files must always use LF for tools to work\n*.js "
  },
  {
    "path": ".github/ISSUE_TEMPLATE.md",
    "chars": 1912,
    "preview": "# AngularJS is in LTS mode\nWe are no longer accepting changes that are not critical bug fixes into this project.\nSee htt"
  },
  {
    "path": ".github/PULL_REQUEST_TEMPLATE.md",
    "chars": 1088,
    "preview": "# AngularJS is in LTS mode\nWe are no longer accepting changes that are not critical bug fixes into this project.\nSee htt"
  },
  {
    "path": ".gitignore",
    "chars": 440,
    "preview": "/build/\n/benchpress-build/\n.DS_Store\ngen_docs.disable\ntest.disable\nregression/temp*.html\nperformance/temp*.html\n.idea/wo"
  },
  {
    "path": ".mailmap",
    "chars": 1348,
    "preview": "Andres Ornelas <aornelas@google.com>\nCaitlin Potter <caitpotter88@gmail.com>\nCaitlin Potter <caitpotter88@gmail.com> <sn"
  },
  {
    "path": ".nvmrc",
    "chars": 8,
    "preview": "14.16.1\n"
  },
  {
    "path": "CHANGELOG.md",
    "chars": 961075,
    "preview": "**AngularJS support has officially ended as of January 2022.\n[See what ending support means](https://docs.angularjs.org/"
  },
  {
    "path": "CODE_OF_CONDUCT.md",
    "chars": 225,
    "preview": "# Contributor Code of Conduct\n\nThe AngularJS project follows the Code of Conduct defined in [the angular/code-of-conduct"
  },
  {
    "path": "CONTRIBUTING.md",
    "chars": 11031,
    "preview": "# Contributing to AngularJS\n\nWe'd love for you to contribute to our source code and to make AngularJS even better than i"
  },
  {
    "path": "DEVELOPERS.md",
    "chars": 20912,
    "preview": "# Developing AngularJS\n\n* [Development Setup](#setup)\n* [Running Tests](#tests)\n* [Coding Rules](#rules)\n* [Commit Messa"
  },
  {
    "path": "Gruntfile.js",
    "chars": 15987,
    "preview": "'use strict';\n\nvar serveFavicon = require('serve-favicon');\nvar serveStatic = require('serve-static');\nvar serveIndex = "
  },
  {
    "path": "LICENSE",
    "chars": 1099,
    "preview": "The MIT License\n\nCopyright (c) 2010-2020 Google LLC. http://angularjs.org\n\nPermission is hereby granted, free of charge,"
  },
  {
    "path": "README.closure.md",
    "chars": 927,
    "preview": "Using AngularJS with the Closure Compiler\n=========================================\n\nThe Closure Compiler project contai"
  },
  {
    "path": "README.md",
    "chars": 6124,
    "preview": "AngularJS [![CircleCI](https://circleci.com/gh/angular/angular.js/tree/master.svg?style=shield)](https://circleci.com/gh"
  },
  {
    "path": "RELEASE.md",
    "chars": 3876,
    "preview": "# AngularJS Release instructions\n\n\n## Compare the list of commits between stable and unstable\n\nThere is a script - compa"
  },
  {
    "path": "SECURITY.md",
    "chars": 950,
    "preview": "# Security Policy\n\n## Supported Versions\n\n**AngularJS support has officially ended as of January 2022.**\n[See what endin"
  },
  {
    "path": "TRIAGING.md",
    "chars": 6103,
    "preview": "# Triage new issues/PRs on github\n\nThis document shows the steps the AngularJS team is using to triage issues.\nThe label"
  },
  {
    "path": "angularFiles.js",
    "chars": 9072,
    "preview": "'use strict';\n\nvar angularFiles = {\n  'angularSrc': [\n    'src/minErr.js',\n    'src/Angular.js',\n    'src/loader.js',\n  "
  },
  {
    "path": "benchmarks/.eslintrc.json",
    "chars": 186,
    "preview": "{\n  \"root\": true,\n  \"extends\": \"../.eslintrc-browser.json\",\n\n  \"globals\": {\n    \"benchmarkSteps\": false,\n\n    // Benchma"
  },
  {
    "path": "benchmarks/README.md",
    "chars": 461,
    "preview": "Instructions for using benchpress (how to create benchmarks, how to run, how to configure) can be\nfound at: https://gith"
  },
  {
    "path": "benchmarks/animation-bp/app.js",
    "chars": 879,
    "preview": "'use strict';\n\nangular\n  .module('animationBenchmark', ['ngAnimate'], config)\n  .controller('BenchmarkController', Bench"
  },
  {
    "path": "benchmarks/animation-bp/bp.conf.js",
    "chars": 370,
    "preview": "/* eslint-env node */\n\n'use strict';\n\nmodule.exports = function(config) {\n  config.set({\n    scripts: [\n      {\n        "
  },
  {
    "path": "benchmarks/animation-bp/jquery-noop.js",
    "chars": 64,
    "preview": "// Override me with ?jquery=/node_modules/jquery/dist/jquery.js\n"
  },
  {
    "path": "benchmarks/animation-bp/main.html",
    "chars": 731,
    "preview": "<style>\n  [ng-cloak] { display: none !important; }\n  .animation-container .ng-enter,\n  .animation-container .ng-leave {\n"
  },
  {
    "path": "benchmarks/bootstrap-compile-bp/app.js",
    "chars": 1663,
    "preview": "'use strict';\n\nvar app = angular.module('boostrapCompileBenchmark', []);\n\nvar commentDirectivesEnabled;\nvar cssClassDire"
  },
  {
    "path": "benchmarks/bootstrap-compile-bp/bootstrap-carousel.tpl.html",
    "chars": 8716,
    "preview": "<!-- code from http://getbootstrap.com/examples/carousel -->\n<div class=\"navbar-wrapper\">\n  <div class=\"container\">\n\n   "
  },
  {
    "path": "benchmarks/bootstrap-compile-bp/bootstrap-theme.tpl.html",
    "chars": 24806,
    "preview": "<!-- Fixed navbar -->\n<nav class=\"navbar navbar-inverse navbar-fixed-top\">\n<div class=\"container\">\n  <div class=\"navbar-"
  },
  {
    "path": "benchmarks/bootstrap-compile-bp/bp.conf.js",
    "chars": 206,
    "preview": "/* eslint-env node */\n\n'use strict';\n\nmodule.exports = function(config) {\n  config.set({\n    scripts: [{\n      id: 'angu"
  },
  {
    "path": "benchmarks/bootstrap-compile-bp/main.html",
    "chars": 1202,
    "preview": "<div ng-app=\"boostrapCompileBenchmark\" ng-cloak>\n  <div ng-controller=\"DataController as config\">\n    <p>Please, select "
  },
  {
    "path": "benchmarks/event-delegation-bp/app.js",
    "chars": 1339,
    "preview": "'use strict';\n\nvar app = angular.module('eventDelegationBenchmark', []);\n\napp.directive('noopDir', function() {\n  return"
  },
  {
    "path": "benchmarks/event-delegation-bp/bp.conf.js",
    "chars": 202,
    "preview": "/* eslint-env node */\n\n'use strict';\n\nmodule.exports = function(config) {\n  config.set({\n    scripts: [{\n      id: 'angu"
  },
  {
    "path": "benchmarks/event-delegation-bp/main.html",
    "chars": 4892,
    "preview": "<div ng-app=\"eventDelegationBenchmark\">\n<div ng-controller=\"DataController as ctrl\">\n<div class=\"container-fluid\">\n\n<p>\n"
  },
  {
    "path": "benchmarks/largetable-bp/app.js",
    "chars": 4651,
    "preview": "'use strict';\n\nvar app = angular.module('largetableBenchmark', []);\n\napp.config(function($compileProvider) {\n  if ($comp"
  },
  {
    "path": "benchmarks/largetable-bp/bp.conf.js",
    "chars": 267,
    "preview": "/* eslint-env node */\n\n'use strict';\n\nmodule.exports = function(config) {\n  config.set({\n    scripts: [{\n      id: 'jque"
  },
  {
    "path": "benchmarks/largetable-bp/jquery-noop.js",
    "chars": 64,
    "preview": "// Override me with ?jquery=/node_modules/jquery/dist/jquery.js\n"
  },
  {
    "path": "benchmarks/largetable-bp/main.html",
    "chars": 5258,
    "preview": "<style>\n[ng-cloak] { display: none; }\n</style>\n<div ng-app=\"largetableBenchmark\" ng-cloak>\n  <div ng-controller=\"DataCon"
  },
  {
    "path": "benchmarks/ng-class-bp/app.js",
    "chars": 2300,
    "preview": "'use strict';\n\nvar app = angular.module('ngClassBenchmark', []);\n\napp.controller('DataController', function DataControll"
  },
  {
    "path": "benchmarks/ng-class-bp/bp.conf.js",
    "chars": 206,
    "preview": "/* eslint-env node */\n\n'use strict';\n\nmodule.exports = function(config) {\n  config.set({\n    scripts: [{\n      id: 'angu"
  },
  {
    "path": "benchmarks/ng-class-bp/main.html",
    "chars": 5601,
    "preview": "<style>\n  .gold {\n    background: gold;\n  }\n  .silver {\n    background: silver;\n  }\n  .table tbody tr > td.success {\n   "
  },
  {
    "path": "benchmarks/ng-options-bp/app.js",
    "chars": 1805,
    "preview": "'use strict';\n\n/* globals angular, benchmarkSteps */\n\nvar app = angular.module('ngOptionsBenchmark', []);\n\napp.config(fu"
  },
  {
    "path": "benchmarks/ng-options-bp/bp.conf.js",
    "chars": 206,
    "preview": "/* eslint-env node */\n\n'use strict';\n\nmodule.exports = function(config) {\n  config.set({\n    scripts: [{\n      id: 'angu"
  },
  {
    "path": "benchmarks/ng-options-bp/main.html",
    "chars": 362,
    "preview": "<div ng-app=\"ngOptionsBenchmark\" ng-cloak>\n  <div ng-controller=\"DataController\">\n    <div class=\"container-fluid\">\n    "
  },
  {
    "path": "benchmarks/orderby-bp/app.js",
    "chars": 1201,
    "preview": "'use strict';\n\nvar app = angular.module('orderByBenchmark', []);\n\napp.controller('DataController', function DataControll"
  },
  {
    "path": "benchmarks/orderby-bp/bp.conf.js",
    "chars": 268,
    "preview": "/* eslint-env node */\n\n'use strict';\n\nmodule.exports = function(config) {\n  config.set({\n    scripts: [\n    {\n      'id'"
  },
  {
    "path": "benchmarks/orderby-bp/jquery-noop.js",
    "chars": 64,
    "preview": "// Override me with ?jquery=/node_modules/jquery/dist/jquery.js\n"
  },
  {
    "path": "benchmarks/orderby-bp/main.html",
    "chars": 2807,
    "preview": "<div class=\"container-fluid\" ng-app=\"orderByBenchmark\">\n  <div class=\"row\" ng-controller=\"DataController as ctrl\">\n    <"
  },
  {
    "path": "benchmarks/parsed-expressions-bp/app.js",
    "chars": 2133,
    "preview": "'use strict';\n\nvar app = angular.module('parsedExpressionBenchmark', []);\n\napp.config(function($compileProvider) {\n  if "
  },
  {
    "path": "benchmarks/parsed-expressions-bp/bp.conf.js",
    "chars": 206,
    "preview": "/* eslint-env node */\n\n'use strict';\n\nmodule.exports = function(config) {\n  config.set({\n    scripts: [{\n      id: 'angu"
  },
  {
    "path": "benchmarks/parsed-expressions-bp/main.html",
    "chars": 12053,
    "preview": "<div ng-app=\"parsedExpressionBenchmark\" ng-cloak>\n  <div ng-controller=\"DataController\">\n    <div class=\"container-fluid"
  },
  {
    "path": "benchmarks/repeat-animate-bp/app-classfilter.js",
    "chars": 242,
    "preview": "'use strict';\n\nangular.module('repeatAnimateBenchmark', ['ngAnimate'])\n  .config(function($animateProvider) {\n    $anima"
  },
  {
    "path": "benchmarks/repeat-animate-bp/app-noanimate.js",
    "chars": 135,
    "preview": "'use strict';\n\nangular.module('repeatAnimateBenchmark', [])\n  .run(function($rootScope) {\n    $rootScope.fileType = 'noa"
  },
  {
    "path": "benchmarks/repeat-animate-bp/app.js",
    "chars": 145,
    "preview": "'use strict';\n\nangular.module('repeatAnimateBenchmark', ['ngAnimate'])\n  .run(function($rootScope) {\n    $rootScope.file"
  },
  {
    "path": "benchmarks/repeat-animate-bp/bp.conf.js",
    "chars": 345,
    "preview": "/* eslint-env node */\n\n'use strict';\n\nmodule.exports = function(config) {\n  config.set({\n    scripts: [\n    {\n      id: "
  },
  {
    "path": "benchmarks/repeat-animate-bp/common.js",
    "chars": 2948,
    "preview": "'use strict';\n\n(function() {\n  var app = angular.module('repeatAnimateBenchmark');\n\n  app.config(function($compileProvid"
  },
  {
    "path": "benchmarks/repeat-animate-bp/main.html",
    "chars": 3291,
    "preview": "<div ng-app=\"repeatAnimateBenchmark\" ng-cloak>\n  <div ng-controller=\"DataController\">\n    <div class=\"container-fluid\">\n"
  },
  {
    "path": "benchmarks/select-ng-value-bp/app.js",
    "chars": 1981,
    "preview": "'use strict';\n\n/* globals angular, benchmarkSteps */\n\nvar app = angular.module('selectBenchmark', []);\n\napp.config(funct"
  },
  {
    "path": "benchmarks/select-ng-value-bp/bp.conf.js",
    "chars": 206,
    "preview": "/* eslint-env node */\n\n'use strict';\n\nmodule.exports = function(config) {\n  config.set({\n    scripts: [{\n      id: 'angu"
  },
  {
    "path": "benchmarks/select-ng-value-bp/main.html",
    "chars": 527,
    "preview": "<div ng-app=\"selectBenchmark\" ng-cloak>\n  <div ng-controller=\"DataController\">\n    <div class=\"container-fluid\">\n      <"
  },
  {
    "path": "css/angular-scenario.css",
    "chars": 3364,
    "preview": "@charset \"UTF-8\";\n/* CSS Document */\n\n/** Structure */\nbody {\n  font-family: Arial, sans-serif;\n  margin: 0;\n  font-size"
  },
  {
    "path": "css/angular.css",
    "chars": 274,
    "preview": "@charset \"UTF-8\";\n\n[ng\\:cloak],\n[ng-cloak],\n[data-ng-cloak],\n[x-ng-cloak],\n.ng-cloak,\n.x-ng-cloak,\n.ng-hide:not(.ng-hide"
  },
  {
    "path": "docs/app/assets/Error404.html",
    "chars": 383,
    "preview": "<h1>Oops!</h1>\n\n<p>The page you requested does not exist. Perhaps you were looking for something else...</p>\n\n<div ng-co"
  },
  {
    "path": "docs/app/assets/css/angular-topnav.css",
    "chars": 4162,
    "preview": ".visible-phone{display:none}.visible-desktop{display:block}.navbar{display:block}.navbar .container{padding:0 16px;width"
  },
  {
    "path": "docs/app/assets/css/animations.css",
    "chars": 0,
    "preview": ""
  },
  {
    "path": "docs/app/assets/css/doc_widgets.css",
    "chars": 2682,
    "preview": "ul.doc-example {\n  list-style-type: none;\n  position: relative;\n  font-size: 14px;\n}\n\nul.doc-example > li {\n  border: 2p"
  },
  {
    "path": "docs/app/assets/css/docs.css",
    "chars": 19168,
    "preview": "@font-face {\n  font-family: 'Open Sans';\n  src: url(\"../components/open-sans-fontface-1.4.0/fonts/Regular/OpenSans-Regul"
  },
  {
    "path": "docs/app/assets/css/prettify-theme.css",
    "chars": 1490,
    "preview": "/* GitHub Theme */\n.prettyprint {\n  background: white;\n  font-family: Menlo, 'Bitstream Vera Sans Mono', 'DejaVu Sans Mo"
  },
  {
    "path": "docs/app/assets/css/prettify.css",
    "chars": 1591,
    "preview": ".pln { color: #000 }  /* plain text */\n\n@media screen {\n  .str { color: #080 }  /* string content */\n  .kwd { color: #00"
  },
  {
    "path": "docs/app/assets/js/angular-bootstrap/dropdown-toggle.js",
    "chars": 4292,
    "preview": "/* This code is taken from the AngularUI - Bootstrap Project (https://github.com/angular-ui/bootstrap)\n *\n * The MIT Lic"
  },
  {
    "path": "docs/app/assets/js/search-worker.js",
    "chars": 1470,
    "preview": "'use strict';\n\n/* eslint-env worker */\n/* global importScripts, lunr */\n\n// Load up the lunr library\nimportScripts('../c"
  },
  {
    "path": "docs/app/assets/robots.txt",
    "chars": 76,
    "preview": "User-agent: *\n\n# The map files are not required by the app\nDisallow: /*.map$"
  },
  {
    "path": "docs/app/e2e/.eslintrc.json",
    "chars": 580,
    "preview": "{\n  \"root\": true,\n  \"extends\": \"../../../.eslintrc-node.json\",\n\n\n  \"env\": {\n    \"jasmine\": true,\n    \"protractor\": true\n"
  },
  {
    "path": "docs/app/e2e/api-docs/api-pages.scenario.js",
    "chars": 1793,
    "preview": "'use strict';\n\ndescribe('API pages', function() {\n\n  it('should display links to code on GitHub', function() {\n    brows"
  },
  {
    "path": "docs/app/e2e/api-docs/directive-pages.scenario.js",
    "chars": 1975,
    "preview": "'use strict';\n\ndescribe('directives', function() {\n\n  describe('parameter section', function() {\n\n    it('should show th"
  },
  {
    "path": "docs/app/e2e/api-docs/provider-pages.scenario.js",
    "chars": 430,
    "preview": "'use strict';\n\ndescribe('provider pages', function() {\n\n  it('should show the related service', function() {\n    browser"
  },
  {
    "path": "docs/app/e2e/api-docs/service-pages.scenario.js",
    "chars": 1006,
    "preview": "'use strict';\n\ndescribe('service pages', function() {\n\n  it('should show the related provider if there is one', function"
  },
  {
    "path": "docs/app/e2e/app.scenario.js",
    "chars": 6450,
    "preview": "'use strict';\n\nvar webdriver = require('selenium-webdriver');\n\ndescribe('docs.angularjs.org', function() {\n\n  beforeEach"
  },
  {
    "path": "docs/app/e2e/table-of-contents.scenario.js",
    "chars": 4068,
    "preview": "'use strict';\n\n/**\n * This scenario checks the presence of the table of contents for a sample of pages - API and guide.\n"
  },
  {
    "path": "docs/app/src/.eslintrc.json",
    "chars": 106,
    "preview": "{\n  \"root\": true,\n  \"extends\": \"../../../.eslintrc-browser.json\",\n\n  \"globals\": {\n    \"lunr\": false\n  }\n}\n"
  },
  {
    "path": "docs/app/src/app.js",
    "chars": 381,
    "preview": "'use strict';\n\nangular.module('docsApp', [\n  'ngRoute',\n  'ngCookies',\n  'ngSanitize',\n  'ngAnimate',\n  'DocsController'"
  },
  {
    "path": "docs/app/src/directives.js",
    "chars": 4566,
    "preview": "'use strict';\n\nvar directivesModule = angular.module('directives', []);\n\ndirectivesModule\n/**\n * backToTop Directive\n * "
  },
  {
    "path": "docs/app/src/docs.js",
    "chars": 2523,
    "preview": "'use strict';\n\nangular.module('DocsController', ['currentVersionData'])\n\n.controller('DocsController', [\n          '$sco"
  },
  {
    "path": "docs/app/src/errors.js",
    "chars": 2102,
    "preview": "'use strict';\n\nangular.module('errors', ['ngSanitize'])\n\n.filter('errorLink', ['$sanitize', function($sanitize) {\n  var "
  },
  {
    "path": "docs/app/src/examples.js",
    "chars": 6786,
    "preview": "'use strict';\n\nangular.module('examples', [])\n\n.directive('runnableExample', [function() {\n  var exampleClassNameSelecto"
  },
  {
    "path": "docs/app/src/search.js",
    "chars": 6874,
    "preview": "'use strict';\n\nangular.module('search', [])\n\n.controller('DocsSearchCtrl', ['$scope', '$location', 'docsSearch', functio"
  },
  {
    "path": "docs/app/src/tutorials.js",
    "chars": 2222,
    "preview": "'use strict';\n\nangular.module('tutorials', [])\n\n.directive('docTutorialNav', function() {\n  var pages = [\n    '',\n    's"
  },
  {
    "path": "docs/app/src/versions.js",
    "chars": 1582,
    "preview": "'use strict';\n/* global console */\n\nangular.module('versions', ['currentVersionData', 'allVersionsData'])\n\n.directive('v"
  },
  {
    "path": "docs/app/test/.eslintrc.json",
    "chars": 451,
    "preview": "{\n  \"root\": true,\n  \"extends\": \"../../../.eslintrc-browser.json\",\n\n  \"env\": {\n    \"jasmine\": true\n  },\n\n  \"rules\": {\n   "
  },
  {
    "path": "docs/app/test/directivesSpec.js",
    "chars": 1283,
    "preview": "'use strict';\n\ndescribe('directives', function() {\n  var compile, scope;\n\n\n  beforeEach(module('directives'));\n\n  before"
  },
  {
    "path": "docs/app/test/docsSpec.js",
    "chars": 1254,
    "preview": "'use strict';\n\ndescribe('DocsController', function() {\n  var $scope;\n\n  angular.module('fake', [])\n    .value('$cookies'"
  },
  {
    "path": "docs/app/test/errorsSpec.js",
    "chars": 5108,
    "preview": "'use strict';\n\ndescribe('errors', function() {\n  // Mock `ngSanitize` module\n  angular.\n    module('ngSanitize', []).\n  "
  },
  {
    "path": "docs/config/ignore.words",
    "chars": 4383,
    "preview": "a\nable\nabout\nabove\nabst\naccordance\naccording\naccordingly\nacross\nact\nactually\nadded\nadj\nadopted\naffected\naffecting\naffect"
  },
  {
    "path": "docs/config/index.js",
    "chars": 6015,
    "preview": "'use strict';\n\nvar path = require('canonical-path');\nvar packagePath = __dirname;\n\nvar Package = require('dgeni').Packag"
  },
  {
    "path": "docs/config/inline-tag-defs/type.js",
    "chars": 489,
    "preview": "'use strict';\n\n// eslint-disable-next-line new-cap\nvar encoder = new require('node-html-encoder').Encoder();\n\n/**\n * @dg"
  },
  {
    "path": "docs/config/processors/error-docs.js",
    "chars": 2193,
    "preview": "'use strict';\n\n/**\n * @dgProcessor errorDocsProcessor\n * @description\n * Process \"error\" docType docs and generate error"
  },
  {
    "path": "docs/config/processors/index-page.js",
    "chars": 988,
    "preview": "'use strict';\n\nvar _ = require('lodash');\n\n/**\n * @dgProcessor generateIndexPagesProcessor\n * @description\n * This proce"
  },
  {
    "path": "docs/config/processors/keywords.js",
    "chars": 3725,
    "preview": "'use strict';\n\nvar _ = require('lodash');\nvar fs = require('fs');\nvar path = require('canonical-path');\n\n/**\n * @dgProce"
  },
  {
    "path": "docs/config/processors/pages-data.js",
    "chars": 6344,
    "preview": "'use strict';\n\nvar _ = require('lodash');\nvar path = require('canonical-path');\n\nvar AREA_NAMES = {\n  api: 'API',\n  guid"
  },
  {
    "path": "docs/config/processors/sitemap.js",
    "chars": 623,
    "preview": "'use strict';\n\nvar exclusionRegex = /^index|examples\\/|ptore2e\\//;\n\nmodule.exports = function createSitemap() {\n  return"
  },
  {
    "path": "docs/config/processors/versions-data.js",
    "chars": 4932,
    "preview": "'use strict';\n\nvar exec = require('shelljs').exec;\nvar semver = require('semver');\n\n/**\n * @dgProcessor generateVersionD"
  },
  {
    "path": "docs/config/services/deployments/debug.js",
    "chars": 1201,
    "preview": "'use strict';\n\nmodule.exports = function debugDeployment(getVersion) {\n  return {\n    name: 'debug',\n    examples: {\n   "
  },
  {
    "path": "docs/config/services/deployments/default.js",
    "chars": 1253,
    "preview": "'use strict';\n\nmodule.exports = function defaultDeployment(getVersion) {\n  return {\n    name: 'default',\n    examples: {"
  },
  {
    "path": "docs/config/services/deployments/jquery.js",
    "chars": 1409,
    "preview": "'use strict';\n\nmodule.exports = function jqueryDeployment(getVersion) {\n  return {\n    name: 'jquery',\n    examples: {\n "
  },
  {
    "path": "docs/config/services/deployments/production.js",
    "chars": 2242,
    "preview": "'use strict';\n\nvar versionInfo = require('../../../../lib/versions/version-info');\n\nvar googleCdnUrl = '//ajax.googleapi"
  },
  {
    "path": "docs/config/services/deployments/test.js",
    "chars": 1228,
    "preview": "'use strict';\n\nmodule.exports = function testDeployment(getVersion) {\n  return {\n    name: 'test',\n    examples: {\n     "
  },
  {
    "path": "docs/config/services/errorNamespaceMap.js",
    "chars": 208,
    "preview": "'use strict';\nvar StringMap = require('stringmap');\n\n/**\n * @dgService errorNamespaceMap\n * A map of error namespaces by"
  },
  {
    "path": "docs/config/services/getMinerrInfo.js",
    "chars": 397,
    "preview": "'use strict';\n\nvar path = require('canonical-path');\n\n/**\n * @dgService minErrInfo\n * @description\n * Load the error inf"
  },
  {
    "path": "docs/config/services/getVersion.js",
    "chars": 440,
    "preview": "'use strict';\nvar path = require('canonical-path');\n\n/**\n * dgService getVersion\n * @description\n * Find the current ver"
  },
  {
    "path": "docs/config/tag-defs/deprecated.js",
    "chars": 1194,
    "preview": "'use strict';\n\nvar OPTION_MATCHER = /^\\s*([\\w-]+)=\"([^\"]+)\"\\s+([\\s\\S]*)/;\nvar VALID_OPTIONS = ['sinceVersion', 'removeVe"
  },
  {
    "path": "docs/config/tag-defs/deprecated.spec.js",
    "chars": 1429,
    "preview": "'use strict';\n\n/* globals describe, it, expect */\nvar tagDef = require('./deprecated');\n\ndescribe('deprecated tag', func"
  },
  {
    "path": "docs/config/tag-defs/installation.js",
    "chars": 60,
    "preview": "'use strict';\n\nmodule.exports = {\n  name: 'installation'\n};\n"
  },
  {
    "path": "docs/config/tag-defs/sortOrder.js",
    "chars": 136,
    "preview": "'use strict';\n\nmodule.exports = {\n  name: 'sortOrder',\n  transforms: function(doc, tag, value) {\n    return parseInt(val"
  },
  {
    "path": "docs/config/tag-defs/this.js",
    "chars": 52,
    "preview": "'use strict';\n\nmodule.exports = {\n  name: 'this'\n};\n"
  },
  {
    "path": "docs/config/tag-defs/tutorial-step.js",
    "chars": 266,
    "preview": "'use strict';\n\nmodule.exports = {\n  name: 'step',\n  transforms: function(doc, tag, value) {\n    if (doc.docType !== 'tut"
  },
  {
    "path": "docs/config/templates/app/angular-service.template.js",
    "chars": 126,
    "preview": "'use strict';\n\nangular.module('{$ doc.ngModuleName $}', [])\n  .value('{$ doc.serviceName $}', {$ doc.serviceValue | json"
  },
  {
    "path": "docs/config/templates/app/error.template.html",
    "chars": 418,
    "preview": "{% extends \"base.template.html\" %}\n\n{% block content %}\n<h1>Error: {$ doc.namespace $}:{$ doc.name $}\n  <div><span class"
  },
  {
    "path": "docs/config/templates/app/errorNamespace.template.html",
    "chars": 567,
    "preview": "{% extends 'base.template.html' %}\n\n{% block content %}\n<h1>{$ doc.name $}</h1>\n\n<div class=\"description\">\n  Here are th"
  },
  {
    "path": "docs/config/templates/app/indexPage.template.html",
    "chars": 10634,
    "preview": "{# Macros #}\n{%- macro addTag(name, attributes) %}\n  <{$ name $}\n    {%- for attrName, attrValue in attributes -%}\n     "
  },
  {
    "path": "docs/config/templates/app/json-doc.template.json",
    "chars": 21,
    "preview": "{$ doc.data | json $}"
  },
  {
    "path": "docs/config/templates/app/nav-data.template.js",
    "chars": 140,
    "preview": "'use strict';\n\n// Meta data used by the AngularJS docs app\nangular.module('navData', [])\n  .value('NG_NAVIGATION', {$ do"
  },
  {
    "path": "docs/config/templates/app/pages-data.template.js",
    "chars": 137,
    "preview": "'use strict';\n\n// Meta data used by the AngularJS docs app\nangular.module('pagesData', [])\n  .value('NG_PAGES', {$ doc.p"
  },
  {
    "path": "docs/config/templates/app/sitemap.template.xml",
    "chars": 219,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<urlset xmlns=\"http://www.sitemaps.org/schemas/sitemap/0.9\">\n  {%- for url in doc"
  },
  {
    "path": "docs/config/templates/app/tutorial.template.html",
    "chars": 39,
    "preview": "{% include 'overview.template.html' %}\n"
  },
  {
    "path": "docs/config/templates/examples/index.template.html",
    "chars": 742,
    "preview": "<!doctype html>\n<html lang=\"en\"{% if doc.example['ng-csp'] %} ng-csp{% endif %}>\n<head>\n  <meta charset=\"UTF-8\">\n  <titl"
  },
  {
    "path": "docs/config/templates/examples/manifest.template.json",
    "chars": 145,
    "preview": "{\n  \"name\": \"{$ doc.example.id $}\",\n  \"files\": [\n    \"index-production.html\"\n    {%- for file in doc.files %},\n    \"{$ f"
  },
  {
    "path": "docs/config/templates/examples/protractorTests.template.js",
    "chars": 416,
    "preview": "describe(\"{$ doc.description $}\", function() {\n  var rootEl;\n  beforeEach(function() {\n    rootEl = browser.rootEl;{% if"
  },
  {
    "path": "docs/config/templates/examples/runnableExample.template.html",
    "chars": 1039,
    "preview": "{# Be aware that we need these extra new lines here or marked will not realize that the <div>\n   is HTML and wrap each l"
  },
  {
    "path": "docs/config/templates/examples/template.css",
    "chars": 22,
    "preview": "{$ doc.fileContents $}"
  },
  {
    "path": "docs/config/templates/examples/template.html",
    "chars": 22,
    "preview": "{$ doc.fileContents $}"
  },
  {
    "path": "docs/config/templates/examples/template.js",
    "chars": 79,
    "preview": "(function(angular) {\n  'use strict';\n{$ doc.fileContents $}\n})(window.angular);"
  },
  {
    "path": "docs/config/templates/examples/template.json",
    "chars": 22,
    "preview": "{$ doc.fileContents $}"
  },
  {
    "path": "docs/config/templates/examples/template.protractor",
    "chars": 22,
    "preview": "{$ doc.fileContents $}"
  },
  {
    "path": "docs/config/templates/examples/template.scenario",
    "chars": 22,
    "preview": "{$ doc.fileContents $}"
  },
  {
    "path": "docs/config/templates/examples/template.spec",
    "chars": 22,
    "preview": "{$ doc.fileContents $}"
  },
  {
    "path": "docs/config/templates/ngdoc/api/api.template.html",
    "chars": 1704,
    "preview": "{% extends \"base.template.html\" %}\n{% import \"lib/deprecated.html\" as x -%}\n\n{% block content %}\n\n<a href='https://githu"
  },
  {
    "path": "docs/config/templates/ngdoc/api/componentGroup.template.html",
    "chars": 651,
    "preview": "{% block content %}\n<h1>\n  {%- if doc.title -%}\n    {$ doc.title $}\n  {%- elif doc.moduleName -%}\n    {$ doc.groupType |"
  },
  {
    "path": "docs/config/templates/ngdoc/api/directive.template.html",
    "chars": 2600,
    "preview": "{% import \"lib/macros.html\" as lib -%}\n{% extends \"api/api.template.html\" %}\n\n{% block additional %}\n  <h2 id=\"{$ doc.na"
  },
  {
    "path": "docs/config/templates/ngdoc/api/filter.template.html",
    "chars": 772,
    "preview": "{% import \"lib/macros.html\" as lib -%}\n{% extends \"api/api.template.html\" %}\n\n{% block additional %}\n  <h2 id=\"usage\">Us"
  },
  {
    "path": "docs/config/templates/ngdoc/api/function.template.html",
    "chars": 41,
    "preview": "{% extends \"api/object.template.html\" %}\n"
  },
  {
    "path": "docs/config/templates/ngdoc/api/input.template.html",
    "chars": 336,
    "preview": "{% import \"lib/macros.html\" as lib -%}\n{% extends \"api/directive.template.html\" %}\n\n{% block usage %}\n  <h2>Usage</h2>\n "
  },
  {
    "path": "docs/config/templates/ngdoc/api/module.template.html",
    "chars": 3054,
    "preview": "{% extends \"base.template.html\" %}\n{% import \"lib/deprecated.html\" as x %}\n\n{% block content %}\n<h1>\n  {% if doc.title %"
  },
  {
    "path": "docs/config/templates/ngdoc/api/object.template.html",
    "chars": 627,
    "preview": "{% import \"lib/macros.html\" as lib %}\n{% extends \"api/api.template.html\" %}\n\n{% block additional %}\n\n  {% if doc.params "
  },
  {
    "path": "docs/config/templates/ngdoc/api/provider.template.html",
    "chars": 217,
    "preview": "{% extends \"api/object.template.html\" %}\n\n{% block related_components %}\n  {% if doc.serviceDoc -%}\n  <li>\n    <a href=\""
  },
  {
    "path": "docs/config/templates/ngdoc/api/service.template.html",
    "chars": 220,
    "preview": "{% extends \"api/object.template.html\" %}\n\n{% block related_components %}\n  {% if doc.providerDoc -%}\n  <li>\n    <a href="
  },
  {
    "path": "docs/config/templates/ngdoc/api/type.template.html",
    "chars": 41,
    "preview": "{% extends \"api/object.template.html\" %}\n"
  },
  {
    "path": "docs/config/templates/ngdoc/base.template.html",
    "chars": 434,
    "preview": "<a href='https://github.com/angular/angular.js/edit/{$ git.version.branch $}/{$ doc.fileInfo.projectRelativePath $}?mess"
  },
  {
    "path": "docs/config/templates/ngdoc/lib/deprecated.html",
    "chars": 492,
    "preview": "{% macro deprecatedBlock(doc) %}{% if doc.deprecated %}\n<div class=\"alert alert-danger deprecation\">\n  <div class=\"title"
  },
  {
    "path": "docs/config/templates/ngdoc/lib/events.template.html",
    "chars": 944,
    "preview": "{% import \"lib/macros.html\" as lib -%}\n{% import \"lib/deprecated.html\" as x -%}\n\n{%- if doc.events %}\n<h2 id=\"events\">Ev"
  },
  {
    "path": "docs/config/templates/ngdoc/lib/macros.html",
    "chars": 1581,
    "preview": "{% macro typeList(types) -%}\n{% for typeName in types %}<a href=\"\" class=\"{$ typeName | typeClass $}\">{$ typeName | esca"
  },
  {
    "path": "docs/config/templates/ngdoc/lib/methods.template.html",
    "chars": 989,
    "preview": "{% import \"lib/macros.html\" as lib -%}\n{% import \"lib/deprecated.html\" as x -%}\n\n{%- if doc.methods %}\n<h2 id=\"{$ doc.na"
  },
  {
    "path": "docs/config/templates/ngdoc/lib/params.template.html",
    "chars": 199,
    "preview": "{% import \"lib/macros.html\" as lib -%}\n{%- if doc.params %}\n<section class=\"api-section\">\n  <h3 id=\"{$ doc.name $}-argum"
  },
  {
    "path": "docs/config/templates/ngdoc/lib/properties.template.html",
    "chars": 408,
    "preview": "{% import \"lib/macros.html\" as lib -%}\n{% import \"lib/deprecated.html\" as x -%}\n\n{%- if doc.properties %}\n<h2 id=\"{$ doc"
  },
  {
    "path": "docs/config/templates/ngdoc/lib/returns.template.html",
    "chars": 150,
    "preview": "{% import \"lib/macros.html\" as lib -%}\n{% if doc.returns -%}\n<h3 id=\"{$ doc.name $}-returns\">Returns</h3>\n{$ lib.typeInf"
  },
  {
    "path": "docs/config/templates/ngdoc/lib/this.template.html",
    "chars": 79,
    "preview": "{% if doc.this %}\n<h3>Method's `this`</h3>\n{$ doc.this | marked $}\n{% endif %}\n"
  },
  {
    "path": "docs/config/templates/ngdoc/overview.template.html",
    "chars": 101,
    "preview": "{% extends \"base.template.html\" %}\n\n{% block content %}\n{$ doc.description | marked $}\n{% endblock %}"
  },
  {
    "path": "docs/content/api/index.ngdoc",
    "chars": 10230,
    "preview": "@ngdoc overview\n@name API Reference\n@description\n\n# AngularJS API Docs\n<div class=\"alert alert-warning\">\nAngularJS suppo"
  },
  {
    "path": "docs/content/error/$animate/nongcls.ngdoc",
    "chars": 351,
    "preview": "@ngdoc error\n@name $animate:nongcls\n@fullName `ng-animate` class not allowed\n@description\n\nThis error occurs, when tryin"
  },
  {
    "path": "docs/content/error/$animate/notcsel.ngdoc",
    "chars": 187,
    "preview": "@ngdoc error\n@name $animate:notcsel\n@fullName Not class CSS selector\n@description\n\nExpecting a CSS selector for class. C"
  },
  {
    "path": "docs/content/error/$cacheFactory/iid.ngdoc",
    "chars": 311,
    "preview": "@ngdoc error\n@name $cacheFactory:iid\n@fullName Invalid ID\n@description\n\nThis error occurs when trying to create a new `c"
  },
  {
    "path": "docs/content/error/$compile/baddir.ngdoc",
    "chars": 285,
    "preview": "@ngdoc error\n@name $compile:baddir\n@fullName Invalid Directive/Component Name\n@description\n\nThis error occurs when the n"
  },
  {
    "path": "docs/content/error/$compile/badrestrict.ngdoc",
    "chars": 384,
    "preview": "@ngdoc error\n@name $compile:badrestrict\n@fullName Invalid Directive Restrict\n@description\n\nThis error occurs when the re"
  },
  {
    "path": "docs/content/error/$compile/ctreq.ngdoc",
    "chars": 1472,
    "preview": "@ngdoc error\n@name $compile:ctreq\n@fullName Missing Required Controller\n@description\n\nThis error occurs when {@link ng.$"
  },
  {
    "path": "docs/content/error/$compile/ctxoverride.ngdoc",
    "chars": 515,
    "preview": "@ngdoc error\n@name $compile:ctxoverride\n@fullName DOM Property Security Context Override\n@description\n\nThis error occurs"
  },
  {
    "path": "docs/content/error/$compile/infchng.ngdoc",
    "chars": 1019,
    "preview": "@ngdoc error\n@name $compile:infchng\n@fullName Unstable `$onChanges` hooks\n@description\n\nThis error occurs when the appli"
  },
  {
    "path": "docs/content/error/$compile/iscp.ngdoc",
    "chars": 1012,
    "preview": "@ngdoc error\n@name $compile:iscp\n@fullName Invalid Isolate Scope Definition\n@description\n\nWhen declaring isolate scope t"
  },
  {
    "path": "docs/content/error/$compile/missingattr.ngdoc",
    "chars": 851,
    "preview": "@ngdoc error\n@name $compile:missingattr\n@fullName Missing required attribute\n@description\n\nThis error may occur only whe"
  },
  {
    "path": "docs/content/error/$compile/multidir.ngdoc",
    "chars": 694,
    "preview": "@ngdoc error\n@name $compile:multidir\n@fullName Multiple Directive Resource Contention\n@description\n\nThis error occurs wh"
  },
  {
    "path": "docs/content/error/$compile/multilink.ngdoc",
    "chars": 765,
    "preview": "@ngdoc error\n@name $compile:multilink\n@fullName Linking Element Multiple Times\n@description\n\nThis error occurs when a si"
  },
  {
    "path": "docs/content/error/$compile/noctrl.ngdoc",
    "chars": 478,
    "preview": "@ngdoc error\n@name $compile:noctrl\n@fullName Controller is required.\n@description\n\nWhen using the `bindToController` fea"
  },
  {
    "path": "docs/content/error/$compile/nodomevents.ngdoc",
    "chars": 1047,
    "preview": "@ngdoc error\n@name $compile:nodomevents\n@fullName Event Attribute/Property Binding\n@description\n\nThis error occurs when "
  },
  {
    "path": "docs/content/error/$compile/nonassign.ngdoc",
    "chars": 1403,
    "preview": "@ngdoc error\n@name $compile:nonassign\n@fullName Non-Assignable Expression\n@description\n\nThis error occurs when a directi"
  },
  {
    "path": "docs/content/error/$compile/noslot.ngdoc",
    "chars": 1333,
    "preview": "@ngdoc error\n@name $compile:noslot\n@fullName No matching slot in parent directive\n@description\n\nThis error occurs when d"
  },
  {
    "path": "docs/content/error/$compile/reqslot.ngdoc",
    "chars": 1221,
    "preview": "@ngdoc error\n@name $compile:reqslot\n@fullName Required transclusion slot\n@description\n\nThis error occurs when a directiv"
  },
  {
    "path": "docs/content/error/$compile/selmulti.ngdoc",
    "chars": 915,
    "preview": "@ngdoc error\n@name $compile:selmulti\n@fullName Binding to Multiple Attribute\n@description\n\nBinding to the `multiple` att"
  },
  {
    "path": "docs/content/error/$compile/srcset.ngdoc",
    "chars": 576,
    "preview": "@ngdoc error\n@name $compile:srcset\n@fullName Invalid value passed to `attr.$set('srcset', value)`\n@description\n\nThis err"
  },
  {
    "path": "docs/content/error/$compile/tplrt.ngdoc",
    "chars": 1540,
    "preview": "@ngdoc error\n@name $compile:tplrt\n@fullName Invalid Template Root\n@description\n\nWhen a directive is declared with `templ"
  },
  {
    "path": "docs/content/error/$compile/uterdir.ngdoc",
    "chars": 938,
    "preview": "@ngdoc error\n@name $compile:uterdir\n@fullName Unterminated Directive\n@description\n\nThis error occurs when using multi-el"
  },
  {
    "path": "docs/content/error/$controller/ctrlfmt.ngdoc",
    "chars": 1134,
    "preview": "@ngdoc error\n@name $controller:ctrlfmt\n@fullName Badly formed controller string\n@description\n\nThis error occurs when {@l"
  },
  {
    "path": "docs/content/error/$controller/ctrlreg.ngdoc",
    "chars": 1354,
    "preview": "@ngdoc error\n@name $controller:ctrlreg\n@fullName A controller with this name is not registered.\n@description\n\nThis error"
  },
  {
    "path": "docs/content/error/$controller/noscp.ngdoc",
    "chars": 674,
    "preview": "@ngdoc error\n@name $controller:noscp\n@fullName Missing $scope object\n@description\n\nThis error occurs when {@link ng.$con"
  },
  {
    "path": "docs/content/error/$http/baddata.ngdoc",
    "chars": 760,
    "preview": "@ngdoc error\n@name $http:baddata\n@fullName Bad JSON Data\n@description\n\nThe default {@link ng.$http#default-transformatio"
  },
  {
    "path": "docs/content/error/$http/badjsonp.ngdoc",
    "chars": 1030,
    "preview": "@ngdoc error\n@name $http:badjsonp\n@fullName Bad JSONP Request Configuration\n@description\n\nThis error occurs when the URL"
  },
  {
    "path": "docs/content/error/$http/badreq.ngdoc",
    "chars": 784,
    "preview": "@ngdoc error\n@name $http:badreq\n@fullName Bad Request Configuration\n@description\n\nThis error occurs when the request con"
  },
  {
    "path": "docs/content/error/$injector/cdep.ngdoc",
    "chars": 786,
    "preview": "@ngdoc error\n@name $injector:cdep\n@fullName Circular Dependency\n@description\n\nThis error occurs when the {@link angular."
  },
  {
    "path": "docs/content/error/$injector/itkn.ngdoc",
    "chars": 824,
    "preview": "@ngdoc error\n@name $injector:itkn\n@fullName Bad Injection Token\n@description\n\nThis error occurs when using a bad token a"
  },
  {
    "path": "docs/content/error/$injector/modulerr.ngdoc",
    "chars": 1164,
    "preview": "@ngdoc error\n@name $injector:modulerr\n@fullName Module Error\n@description\n\nThis error occurs when a module fails to load"
  },
  {
    "path": "docs/content/error/$injector/nomod.ngdoc",
    "chars": 1241,
    "preview": "@ngdoc error\n@name $injector:nomod\n@fullName Module Unavailable\n@description\n\nThis error occurs when you declare a depen"
  },
  {
    "path": "docs/content/error/$injector/pget.ngdoc",
    "chars": 619,
    "preview": "@ngdoc error\n@name $injector:pget\n@fullName Provider Missing $get\n@description\n\nThis error occurs when attempting to reg"
  },
  {
    "path": "docs/content/error/$injector/strictdi.ngdoc",
    "chars": 1449,
    "preview": "@ngdoc error\n@name $injector:strictdi\n@fullName Explicit annotation required\n@description\n\nThis error occurs when attemp"
  },
  {
    "path": "docs/content/error/$injector/undef.ngdoc",
    "chars": 773,
    "preview": "@ngdoc error\n@name $injector:undef\n@fullName Undefined Value\n@description\n\nThis error results from registering a factory"
  },
  {
    "path": "docs/content/error/$injector/unpr.ngdoc",
    "chars": 2927,
    "preview": "@ngdoc error\n@name $injector:unpr\n@fullName Unknown Provider\n@description\n\nThis error results from the `$injector` being"
  }
]

// ... and 1316 more files (download for full content)

About this extraction

This page contains the full source code of the angular/angular.js GitHub repository, extracted and formatted as plain text for AI agents and large language models (LLMs). The extraction includes 1516 files (20.9 MB), approximately 4.0M tokens, and a symbol index with 451 extracted functions, classes, methods, constants, and types. Use this with OpenClaw, Claude, ChatGPT, Cursor, Windsurf, or any other AI tool that accepts text input. You can copy the full output to your clipboard or download it as a .txt file.

Extracted by GitExtract — free GitHub repo to text converter for AI. Built by Nikandr Surkov.

Copied to clipboard!